Как установить путь на хосте для именованного тома в docker-compose.yml

87

Пример ниже создает dbdata с именем volume и ссылается на него внутри службы db :

version: '2'
services:
  db:
    image: mysql
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:
    driver: local

(из https://stackoverflow.com/a/35675553/4291814 )

Я вижу, что путь к тому по умолчанию:

/var/lib/docker/volumes/<project_name>_dbdata

У меня вопрос, как настроить путь на хосте для dbdataтома?

миша
источник
См. Мой ответ о более новом / правильном методе -> stackoverflow.com/a/61743638/5079799
FreeSoftwareServers

Ответы:

76

С localдрайвером громкости появляется возможность использовать произвольные крепления; Используя крепление для привязки, вы можете добиться именно этого.

Для настройки именованного тома, в который монтируется /srv/db-data, ваш docker-compose.ymlбудет выглядеть так:

version: '2'
services:
  db:
    image: mysql
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/srv/db-data'

Я не тестировал его с версией 2 формата файла compose, но https://docs.docker.com/compose/compose-file/compose-versioning/#version-2 не указывает, что он не должен работать.

На винде тоже не тестировал ...

Кристиан Ульбрих
источник
3
Вы можете использовать bind mount с гораздо более простым синтаксисом, чем этот: volume: - ./dbdata:/var/lib/mysql. Единственная «проблема» монтирования привязки заключается в том, что она не копирует содержимое контейнера на хост автоматически, в отличие от именованного тома. docs.docker.com/compose/compose-file/#volumes
Майки
13
OP специально спросил об именованных томах, а не о том, как проще всего использовать привязку. Если вы хотите настроить путь для именованного тома, вы можете добиться этого с помощью привязки, как показано выше. Использование именованных томов имеет то преимущество, что вы можете просто повторно использовать их в своем docker-compose.yml.
Christian Ulbrich
1
@mikey Я разместил здесь вопрос с просьбой прояснить ваш первый комментарий: stackoverflow.com/questions/65176940/… . Был бы очень признателен, если бы вы ответили. Благодарю.
thanks_in_advance 07
1
@thanks_in_advance - похоже, меня опередили! tyvm за то, что пометил меня
майки
1
@mikey не стесняйтесь добавлять в обсуждение через комментарии.
thanks_in_advance
9

Расположение именованных томов управляется докером; Если вы хотите указать местоположение самостоятельно, вы можете либо «привязать монтирование» к каталогу хоста, либо использовать подключаемый модуль тома, который позволяет вам указать путь.

Вы можете найти некоторые подробности в другом ответе, который я недавно опубликовал; https://stackoverflow.com/a/36321403/1811501

ThaJeztah
источник
1
На самом деле вам просто нужно использовать localплагин громкости, который поставляется с самим докером; см. мой ответ для примера.
Christian Ulbrich
-2

По состоянию docker-compose v3.2теперь вы можете сделать это следующим образом :

Примечание. Многие, как я понял, если вы скажете, version: "3"будут использовать самую новую / последнюю версию V3, она не использует v3.0, вы ДОЛЖНЫ указать как минимум 3.2использовать метод конфигурации ниже.

https://docs.docker.com/compose/compose-file/#volumes

version: "3.2"
services:
  db:
    image: postgres:latest
    volumes: 
      - type: volume
        source: /opt/db/vols/dbdata
        target: /var/lib/postgresql/data
        volume:
          nocopy: true



volumes:
   dbdata:

Заметка:

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

БесплатноПрограммное обеспечениеСерверы
источник
Извините, если я не понял вашего ответа @FreeSoftwareServer, вопрос здесь - «Как мы можем сопоставить именованные тома с папкой хоста»?
Дирадж Кумар
Я попытался упростить свой ответ, возможно, задать новый вопрос по вашей конкретной проблеме. @Dheeraj Kumar
FreeSoftwareServers
Как dbdataсоотносится с сервисом dbкак его объем? @FreeSoftwareServers
Nam G VU
Исходная строка? @NamGVU Возможно, новый вопрос по вашей конкретной проблеме будет лучше
FreeSoftwareServers
Я не понимаю голосов против? Это гораздо более чистый и новый способ `установить путь на хосте для именованного тома в docker-compose.yml`
FreeSoftwareServers