Как сохранить данные в докеризованной базе данных 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 создан, но он пуст. Зачем?

Примечания:

обновление 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 87

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, поэтому я предлагаю попробовать командную строку (в конечном итоге со скриптом ) .