Ответ 1
Как ни странно, решение оказалось для изменения
volumes:
- ./postgres-data:/var/lib/postgresql
to
volumes:
- ./postgres-data:/var/lib/postgresql/data
В файле my 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 как /var/lib/postgres
. Когда я запускаю эти контейнеры и вставляю данные в postgres, я проверяю, что /var/lib/postgres/data/base/
заполнен данными, которые я добавляю (в контейнере postgres), но в моей локальной системе ./database
получает только data
папку в он, т.е. ./database/data
, но пуст. Зачем?
Примечания:
По предложению Ника, я сделал 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
?
Я нашел решение, благодаря Нику! (и еще один друг). Ответ ниже.
Как ни странно, решение оказалось для изменения
volumes:
- ./postgres-data:/var/lib/postgresql
to
volumes:
- ./postgres-data:/var/lib/postgresql/data
docker volume create pgdata
или вы можете установить его в файл компоновки
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:
Он создаст имя тома pgdatastrong > и смонтирует этот том в контейнерный путь.
docker volume inspect pgdata
// output will be
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
"Name": "pgdata",
"Options": {},
"Scope": "local"
}
]
Я бы не использовал относительный путь. Помните, что докер - это отношение демона/клиента.
Когда вы выполняете компоновку, он по существу просто разбивается на различные команды клиента докеров, которые затем передаются демону. То, что ./database
тогда относится к демонам, а не клиенту.
Теперь команда docker dev имеет некоторые проблемы в этой области, но в итоге это может привести к неожиданным результатам.
Короче говоря, не используйте относительный путь, используйте абсолютный путь.
Я думаю, вам просто нужно создать свой объем снаружи докера сначала с помощью docker create -v /location --name
, а затем повторно использовать его.
И к тому времени, когда я часто использовал докеры, не удалось использовать статический том докеров с определением dockerfile, поэтому мое предложение - попробовать использовать командную строку (в конечном итоге с помощью script).