В моем файле docker compose есть три контейнера: web, nginx и postgres. Postgres выглядит так:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Моя цель - смонтировать том, который соответствует локальной папке, называемой ./database
внутри контейнера postgres as /var/lib/postgres
. Когда я запускаю эти контейнеры и вставляю данные в postgres, я проверяю, что они /var/lib/postgres/data/base/
полны данных, которые я добавляю (в контейнер postgres), но в моей локальной системе ./database
получает только data
папку в ней, т.е. ./database/data
создается, но она пуста , Зачем?
Ноты:
- Это говорит о том, что мой файл должен работать.
- Этот человек пользуется услугами докера, что интересно
ОБНОВЛЕНИЕ 1
По предложению Ника, я сделал docker inspect
и нашел:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Это создает впечатление, что данные украдены другим томом, который я сам не кодировал. Не уверен, почему это так. Является ли изображение postgres тем объемом для меня? Если да, есть ли способ использовать этот том вместо тома, который я монтирую при перезапуске? Иначе, есть ли хороший способ отключить этот другой том и использовать мой собственный ./database
?
ОБНОВЛЕНИЕ 2
Я нашел решение, благодаря Нику! (и еще один друг) Ответ ниже.
источник
initdb
командную строку для инициализации кластера базы данных?from app import db
иdb.create_all()
от Аdocker run
после запуска контейнеров. Я неinitdb
прямо из командной строки.sudo su -
и посмотреть./database/data
. Насколько я могу судить, там ничего нет.Ответы:
Как ни странно, решение закончилось тем, что изменилось
в
источник
/var/lib/postgresql/data
- вы можете прочитать примечания к переменным PGDATA здесь: store.docker.com/images/….dockerignore
файл, особенно если вы когда-нибудь добавите его в рабочий образ. См. Codefresh.io/blog/not-ignore-dockerignore для обсуждения.docker rm my_postgres_container_1
прежде чем это сработало (также High Sierra).Вы можете создать общий том для всех данных Postgres
или вы можете установить его в файл композиции
Он создаст имя тома pgdata и подключит этот том к пути контейнера.
Вы можете проверить этот объем
источник
docker-compose down -v
. И каково решение этого?docker-compose down --rmi all
без по-v
выбору , и она будет очистить «все» за исключением объемов, т.е. контейнеров, сети, изображения и т.д. Я , что при развертывании, позволяя сохранение данных.Я бы не использовал относительный путь. Помните, что docker - это отношения демон / клиент.
Когда вы выполняете compose, он просто разбивается на различные клиентские команды docker, которые затем передаются демону. Это
./database
относится к демону , а не к клиенту.Теперь у команды разработчиков докеров есть кое-что по этому вопросу , но суть в том, что у нее могут быть неожиданные результаты.
Короче говоря, не используйте относительный путь, используйте абсолютный путь.
источник
database/data
папка все еще пуста = (docker inspect
контейнер и убедиться, что контейнер знает о томе (на случай, если compose запутался или что-то в этом роде). (примечание: у docker inspect могут быть конфиденциальные данные, поэтому не вставляйте их сюда, не обнажая ;-) После этого нужно проверять разрешения (хотя обычно этоЯ думаю, что вам просто нужно создать свой том вне докера сначала с помощью
docker create -v /location --name
а затем использовать его повторно.И к тому времени, когда я часто использовал docker, было невозможно использовать статический том docker с определением dockerfile, поэтому я предлагаю попробовать командную строку (в конце концов, с помощью скрипта).
источник