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

Как сохранить данные в докционированной базе данных postgres с помощью томов

В файле 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, но пуст. Зачем?

Примечания:

ОБНОВЛЕНИЕ 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

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

4b9b3361

Ответ 1

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

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

to

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

Ответ 2

Вы можете создать общий том для всех данных 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​​strong > и смонтирует этот том в контейнерный путь.

Вы можете проверить этот том

docker volume inspect pgdata

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

Ответ 3

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

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

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

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

Ответ 4

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

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