Подтвердить что ты не робот

Докеры с начальными данными не сохраняются за фиксации

Я создал приложение rails в среде докеров, и он ссылается на экземпляр postgres. Я редактировал postgres для добавления исходных данных (путем запуска rake db: настройка из приложения rails). Теперь я запустил базу данных postgres, но, похоже, она не запоминает мои данные, когда я создаю новый контейнер (из объявленного изображения postgres).

Невозможно сохранить данные в фиксации, а затем повторно использовать его?

Я использовал изображение postgres: https://registry.hub.docker.com/_/postgres/

4b9b3361

Ответ 1

Проблема заключается в том, что postgres Dockerfile объявляет "/var/lib/postgresql/data" в качестве тома. Это обычный нормальный каталог, который живет за пределами файловой системы Union, используемой изображениями. Объемы действуют до тех пор, пока никакие контейнеры не свяжутся с ними, и они будут явно удалены.

У вас есть несколько вариантов:

  • Используйте команду --volumes-from для обмена данными с новыми контейнерами. Это будет работать только в том случае, если одновременно воспроизводится только одно изображение postgres, но это лучшее решение.
  • Напишите свой собственный файл Docker, который создает данные перед объявлением тома. Эти данные затем будут скопированы в том, когда контейнер будет создан.
  • Введите точку входа или cmd script, которая заполняет базу данных во время выполнения.

Все эти предложения требуют использования томов для управления данными после запуска контейнера. Кроме того, вы можете написать свой собственный файл Docker и просто не объявлять том. Затем вы можете использовать docker commit для создания нового изображения после добавления данных. Вероятно, это будет работать в краткосрочной перспективе, но определенно не так, как вы должны работать с контейнерами - это не повторяется, и вы, в конечном итоге, исчерпаете слои в файловой системе Union.

Посмотрите официальные документы Docker на управление данными в контейнерах для получения дополнительной информации.

Ответ 2

Создайте новый файл Docker и измените PGDATA:

FROM postgres:9.2.10

RUN mkdir -p /var/lib/postgresql-static/data
ENV PGDATA /var/lib/postgresql-static/data

Ответ 3

Невозможно сохранить данные во время фиксации, так как данные находятся на монтировании, специфичном для этого контейнера, и будут удалены после запуска docker rm <container ID>, но вы можете использовать тома данных для совместного использования и повторного использования данных между контейнером и сделанные изменения непосредственно связаны с объемом.

Вы можете использовать docker run -v /host/path:/Container/path для установки тома в новый контейнер.

Обратитесь к: https://docs.docker.com/userguide/dockervolumes/

Ответ 4

Для хранения постоянных данных, таких как базы данных, вы должны определить эти тома данных как внешние, поэтому они не будут удаляться или создаваться автоматически каждый раз, когда вы запускаете команды 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.

Ответ 5

Вы должны быть все настроены с помощью следующей команды. Самая важная часть - местоположение PGDATA, которое должно быть чем угодно, но не по умолчанию.

docker run -e PGDATA=/var/lib/postgresql/pgdata -e POSTGRES_PASSWORD=YourPa$$W0rd -d postgres