docker-compose: данные postgres не сохраняются

У меня есть основной сервис в моем docker-compose файл, который использует postgresЭто изображение и, хотя я, кажется, успешно подключаюсь к базе данных, данные, которые я записываю в него, не сохраняются за пределами срока службы контейнера (то, что я сделал, основано на этом уроке).

Вот мой docker-compose файл:

main:
  build: .
  volumes:
    - .:/code
  links:
    - postgresdb
  command: python manage.py insert_into_database
  environment:
    - DEBUG=true


postgresdb:
  build: utils/sql/
  volumes_from:
    - postgresdbdata
  ports:
    - "5432"
  environment:
    - DEBUG=true


postgresdbdata:
  build: utils/sql/
  volumes:
    - /var/lib/postgresql
  command: true
  environment:
    - DEBUG=true

и вот Dockerfile, который я использую для postgresdb а также postgresdbdata сервисы (которые по существу создают базу данных и добавляют пользователя):

FROM postgres

ADD make-db.sh /docker-entrypoint-initdb.d/

Как я могу получить данные, чтобы остаться после main служба завершена, чтобы иметь возможность использовать ее в будущем (например, когда я звоню что-то вроде python manage.py retrieve_from_database)? Является /var/lib/postgresql даже правильный каталог, и будет boot2docker иметь доступ к нему, учитывая, что он, по-видимому, ограничен /Users/?

Спасибо!

1 ответ

Решение

Проблема в том, что Compose создает новую версию postgresdbdata Контейнер каждый раз перезапускается, поэтому старый контейнер и его данные теряются.

Вторая проблема заключается в том, что ваш контейнер данных на самом деле не должен работать; Контейнеры данных - это просто пространство имен для тома, который можно импортировать с помощью --volumes-from, который по-прежнему работает с остановленными контейнерами.

Пока лучшее решение - это взять postgresdbdata контейнер из конфигурации Compose. Сделать что-то вроде:

$ docker run --name postgresdbdata postgresdb echo "Postgres data container"
Postgres data container

Команда echo запустится, и контейнер выйдет, но пока docker rm это, вы все равно сможете ссылаться на него в --volumes-from и ваше приложение Compose должно работать нормально.

Другие вопросы по тегам