Как сохранить данные в докеризованной базе данных postgres с помощью томов
мой docker compose file имеет три контейнера: web, nginx и postgres. Сервер выглядит так:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
моя цель-смонтировать том, который соответствует локальной папке под названием ./database
внутри контейнера postgres как /var/lib/postgres
. Когда я запускаю эти контейнеры и вставляю данные в postgres, я проверяю, что /var/lib/postgres/data/base/
полна данных, которые я добавляю (в контейнере postgres), но в моей локальной системе,./database
получает только data
папка в нем, т. е. ./database/data
is создан, но он пуст. Зачем?
Примечания:
- это предполагает, что мой выше файл должен работать.
- этот человек использует услуги docker, что интересно
обновление 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": ""
}
],
из-за чего кажется, что данные украдены другим Томом, который я сам не кодировал. Не знаю, почему это так. Изображение Постгреса создаешь этот том для меня? Если да, то есть ли способ использовать , объем вместо Тома, который я монтирую при перезапуске? В противном случае, есть ли хороший способ отключить этот другой Том и использовать мой собственный,./database
?
обновление 2
я нашел решение, благодаря Нику! (и еще один друг) Ответ ниже.
4 ответа:
Как ни странно, решение закончилось тем, чтобы изменить
volumes: - ./postgres-data:/var/lib/postgresql
до
volumes: - ./postgres-data:/var/lib/postgresql/data
вы можете создать общие объем для всех данных Postgres
docker volume create pgdata
или вы можете установить его в файл compose
version: "3" services: db: image: postgres environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgress - POSTGRES_DB=postgres ports: - "5433:5432" volumes: - pgdata:/var/lib/postgresql/data networks: - suruse volumes: pgdata:
он создаст имя Тома pgdata и установите этот том на путь контейнера.
вы можете проверить это громкости
docker volume inspect pgdata // output will be [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/pgdata/_data", "Name": "pgdata", "Options": {}, "Scope": "local" } ]
Я бы избегал использовать относительный путь. Помните, что docker-это отношение демона/клиента.
когда вы выполняете compose, он по существу просто разбивается на различные команды клиента docker, которые затем передаются демону. Это
./database
тогда относительно демон, а не клиента.теперь команда разработчиков docker имеет некоторые взад и вперед по этому вопросу, но он может иметь некоторые неожиданные результаты.
короче говоря, не используйте относительный путь, используйте абсолютный путь.
Я думаю, вам просто нужно сначала создать свой том вне docker с помощью
docker create -v /location --name
и затем повторно использовать его.и к тому времени, когда я использовал docker много, было невозможно использовать статический том docker с определением dockerfile, поэтому я предлагаю попробовать командную строку (в конечном итоге со скриптом ) .