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 должно работать нормально.