В моем файле создания докеров есть три контейнера: 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, но оно пустое. Почему?

Примечания:

ОБНОВЛЕНИЕ 1

По предложению Ника, я проверил докер и обнаружил:

    "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

Я нашел решение, спасибо Нику! (и еще один друг) Ответ ниже.

Ответы (4)

Как ни странно, решение закончилось заменой

volumes:
  - ./postgres-data:/var/lib/postgresql
От

до

volumes:
  - ./postgres-data:/var/lib/postgresql/data

Вы можете создать общий том для всех данных Postgres

 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:

Он создаст том с именем pgdata и подключит этот том к пути контейнера.

Вы можете осмотреть этот том

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

Я думаю, вам просто нужно сначала создать свой том вне докера с помощью docker create -v / location --name, а затем повторно использовать его.

И к тому времени, когда я много использовал докер, было невозможно использовать статический том докера с определением файла докера, поэтому я предлагаю попробовать командную строку (в конечном итоге со скриптом).

Я бы не использовал относительный путь. Помните, что докер - это отношения демон / клиент.

Когда вы выполняете композицию, она, по сути, просто разбивается на различные клиентские команды докера, которые затем передаются демону. Тогда этот . / Database относится к демону, а не к клиенту.

Теперь, , команда разработчиков докеров обсуждает эту проблему, но суть в том, что это может привести к неожиданным результатам.

Короче говоря, не используйте относительный путь, используйте абсолютный путь.

2022 WebDevInsider