Докгер Postgres с исходными данными не сохраняется в течение коммитов
Я создал приложение rails в среде докеров, и оно ссылается на экземпляр postgres. Я отредактировал контейнер postgres для добавления начальных данных (запустив rake db: setup из приложения rails). Теперь я зафиксировал базу данных postgres, но она, кажется, не запоминает мои данные при создании нового контейнера (изображения коммитированного postgres).
Разве невозможно сохранить данные в коммите, а затем повторно использовать их?
Я использовал изображение postgres: https://registry.hub.docker.com/_/postgres/
4 ответа
Проблема в том, что Dog-файл postgres объявляет "/var/lib/postgresql/data" как том. Это обычный каталог, который находится за пределами файловой системы Union, используемой изображениями. Тома живут до тех пор, пока на них не ссылаются контейнеры, и они явно удалены.
У вас есть несколько вариантов:
- Использовать
--volumes-from
Команда для обмена данными с новыми контейнерами. Это будет работать только в том случае, если одновременно работает только одно изображение postgres, но это лучшее решение. - Напишите свой собственный Dockerfile, который создает данные перед объявлением тома. Эти данные будут затем скопированы в том при создании контейнера.
- Напишите точку входа или сценарий cmd, который заполняет базу данных во время выполнения.
Все эти предложения требуют от вас использования томов для управления данными после запуска контейнера. Кроме того, вы можете написать свой собственный Dockerfile и просто не объявлять том. Вы могли бы тогда использовать docker commit
создать новое изображение после добавления данных. Это, вероятно, будет работать в краткосрочной перспективе, но определенно не так, как вы должны работать с контейнерами - это не повторяется, и в конечном итоге у вас закончатся слои в файловой системе Union.
Посмотрите официальные документы Docker по управлению данными в контейнерах для получения дополнительной информации.
Создайте новый Dockerfile и измените PGDATA
:
FROM postgres:9.2.10
RUN mkdir -p /var/lib/postgresql-static/data
ENV PGDATA /var/lib/postgresql-static/data
У вас должно быть все готово с помощью следующей команды. Самая важная часть - это расположение PGDATA, которое должно быть любым, кроме значения по умолчанию.
docker run -e PGDATA=/var/lib/postgresql/pgdata -e POSTGRES_PASSWORD=YourPa$$W0rd -d postgres
Невозможно сохранить данные во время фиксации, так как данные находятся на монтировании, которое является специфическим для этого контейнера и будет удалено после запуска docker rm <container ID>
но вы можете использовать тома данных для совместного использования и повторного использования данных между контейнерами, и сделанные изменения находятся непосредственно в томе.
Ты можешь использовать docker run -v /host/path:/Container/path
смонтировать том в новый контейнер.
Пожалуйста, обратитесь к: https://docs.docker.com/userguide/dockervolumes/
Для хранения постоянных данных, таких как базы данных, вы должны определить эти тома данных как внешние, поэтому они не будут удаляться или создаваться автоматически каждый раз, когда вы запускаете команды docker-compose up или down или повторно развертываете свой стек в рое.
...
volumes:
db-data:
external: true
...
тогда вы должны создать этот том:
docker volume create db-data
и использовать его как объем данных для вашей базы данных:
...
db:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
ports:
- 5432:5432
...
В производстве есть много факторов, которые следует учитывать при использовании докера для безопасного хранения постоянных данных, особенно в режиме роя или в кластере kubernetes.