Реструктурировать постоянный том / путь монтирования докера

Я некоторое время использовал образ докера Postgres: 11, пока не заметил, что рядом с моим постоянным монтированием тома «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-data с флагом --volume и скопируйте его в другой именованный том с подпапкой «data», затем используйте новый именованный том с измененным путем монтирования на /var/lib/postgresql/data

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

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


person Alex    schedule 12.02.2020    source источник


Ответы (2)


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

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

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

person David Maze    schedule 12.02.2020
comment
Спасибо, да, я подумывал оставить все как есть и обновить настройку громкости после того, как мы сделаем сброс системы с помощью docker system prune и docker volume prune. К счастью, это случается время от времени. Однако в производственной системе, которая работает годами, это не вариант. - person Alex; 12.02.2020

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

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

pg-data:/var/lib/postgresql/data
person kooskoos    schedule 12.02.2020
comment
Я знаю, но что, если на этом именованном томе есть данные, которые я хочу сохранить? Тогда мне придется каким-то образом изменить структуру внутри именованного тома (поскольку postgres ожидает свои данные в подкаталоге ./data/pgdata, а именованный том не содержит pgdata, так как это была предыдущая точка монтирования. - person Alex; 12.02.2020