Реструктурируйте docker постоянный том / путь монтирования - PullRequest
0 голосов
/ 12 февраля 2020

Я некоторое время использовал образ Postgres: 11 docker, пока не заметил, что рядом с моим постоянным монтированием тома "pg-data" (назначение: "/ var / lib / postgresql / data / pgdata") ) был указан другой безымянный том при выполнении docker inspect pgcontainer, назначение: "/ var / lib / postgresql / data":

"Mounts": [
    {
        "Type": "volume",
        "Name": "pg-data",
        "Source": "/data/docker/docker/volumes/pg-data/_data",
        "Destination": "/var/lib/postgresql/data/pgdata",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "4d0ab5fd1d81b05f11805f19569e148427194ef465f0d4dc301b200b8308ada6",
        "Source": "/data/docker/docker/volumes/4d0ab5fd1d81b05f11805f19569e148427194ef465f0d4dc301b200b8308ada6/_data",
        "Destination": "/var/lib/postgresql/data",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

После дальнейшего исследования выясняется, что Dockerfile сам определяет путь монтирования тома, и я переопределял его с помощью моего docker -compose.yml:

services:
  db:
    volumes:
      - pg-data:/var/lib/postgresql/data/pgdata

volumes:
  pg-data:
  imposm-cache-data:

Похоже, теперь это вложенный том. Данные хранятся в томе pg-data, но перед ним всегда автоматически создается другой (безымянный) том. Это работает, но это не идеально, и я бы хотел это исправить.

Я могу предложить только два решения:

  1. Использовать другой контейнер (например, busybox ) смонтировать pg-данные с флагом --volume и скопировать на другой именованный том с подпапкой «data», затем использовать новый именованный том с измененным путем монтирования на /var/lib/postgresql/data

  2. Другой очевидной идеей было бы клонировать Dockerfile и создать новый без тома.

Поскольку этот том содержит около 100 ГБ данных, вариант 1 будет быть немного медленным Вариант 2 будет означать сохранение другого Docker изображения с этого момента. Оба варианта с оговорками. Есть ли другой подход для реструктуризации томов на основе нового пути монтирования?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я бы просто согласился с фактом почти пустых анонимных томов.

Docker дает вам довольно мало опций для непосредственного управления содержимым томов, а перечисленные вами опции в значительной степени выбор у вас есть, не пытаясь манипулировать Docker внутренних органов. Из этих двух разветвление образа PostgreSQL для удаления его VOLUME кажется серьезной проблемой постоянного обслуживания. Поэтому, если у вас есть время и место на диске, лучше сделать одноразовую копию тома.

Другой вариант, который у вас есть (и, вероятно, стоит попробовать это время от времени), - это установить новую чистую систему. Установите на него Docker и запустите PostgreSQL с нужной вам директорией / томом, но пустой. Теперь восстановите эту базу данных из резервной копии.

0 голосов
/ 12 февраля 2020

Здесь происходит то, что Dockerfile создает для вас анонимный том , и вы создаете внутри него еще один именованный том с именем pg-data.

Вы можете просто использовать именованный том на один уровень выше, и это должно решить вашу проблему.

pg-data:/var/lib/postgresql/data
...