Назад | Перейти на главную страницу

Как должен выглядеть синтаксис «томов» Docker Compose версии 2?

С участием Docker Compose v1.6.0 +, теперь есть новый синтаксис файла версии 2 для docker-compose.yml файл. Изменения включают отдельный ключ верхнего уровня с именем volumes. Это позволяет «централизовать» определения томов в одном месте.

Что я пытаюсь сделать, так это название тома там и имеют один том, ссылающийся на несколько путей на моем локальном диске. Ниже приведен пример выдачи исключения с Traceback это заканчивается

AttributeError: 'list' object has no attribute 'items'

пример docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

Пока я прочитал все Документы Docker Compose master-филиал Справка по конфигурации тома, Документы Docker Compose Справочник по Volume / Volume-Driver и просмотрел Примеры на GitHub чтобы найти правильный синтаксис, который ожидается. Кажется, что никто уже не использует это (GitHub), и документация далека от завершения (docker.com). Еще я пробовал построить отдельный том как service и ссылаться на него в volumes, но это тоже не работает. Есть идеи, как должен выглядеть этот синтаксис?

Цель volumes ключ

Он существует для создания именованные тома.

Если вы это сделаете не используйте его, тогда вы получите кучу хешированных значений для ваших томов. Пример:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

С именованными томами вы получите что-то вроде следующего:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Как создать именованные тома

В docker-compose.yml синтаксис:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Это что-то вроде показанных выше названных томов.

Как убрать тома оптом

Когда у вас есть куча хэшей, их может быть довольно сложно очистить. Вот однострочник:

docker volume rm $(docker volume ls |awk '{print $2}')

Редактировать: Как отметил @ArthurTacca в комментариях, есть более простой способ запомнить:

docker volume rm $(docker volume ls -q)

Как получить подробную информацию об именованном томе

Теперь, когда вам больше не нужно искать хэши, вы можете продолжить и называть их по…название:

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

Примечание: Вы можете захотеть docker-compose down ваши услуги, чтобы начать все сначала, прежде чем приступить к созданию томов.

Если вы используете Boot2Docker/ Докер машина, тебе придется docker-machine ssh и sudo -i прежде чем делать ls -la /mnt/… этого тома - ваш хост-компьютер - это виртуальная машина, предоставленная Докер машина.

Насколько я понимаю, вы можете использовать глобальный volumes: раздел к

  • определить имя тома
  • сделать именованный том доступным под другим именем
  • указать драйвер и параметры драйвера для именованного тома

Если вы не укажете, тома в глобальном разделе будут созданы автоматически. external: true. Вам все равно нужно будет сообщить каждой службе в ее volumes: раздел, где смонтировать этот том.

Вот очень простой пример:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

Глобальный volumes: запись для project вызовет именованный том project быть созданным. Затем он монтируется как /bar в обслуживании один, а как /foo в обслуживании два. Обе службы совместно используют данные тома и могут читать / записывать его.

Я не думаю, что то, что вы пытаетесь сделать, возможно (превращение нескольких путей в один том и с разными флагами r / w). Если возможно, тогда, вероятно, найдя способ создать именованный том с этими свойствами с помощью других средств, а затем добавив его в качестве внешнего тома:

volumes:
  mymagicvolume:
    external: true

Проверять, выписываться Версия 2 например, также Справочник по конфигурации тома:

Мой пример: (Версия 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

Я думаю, что вы пытаетесь сделать примерно то же, что видели Вот. Вкратце: в настоящее время невозможно создать именованный том, который ссылается на точку монтирования на хосте. Вы можете создать именованный том для обмена данными между контейнерами, но данные будут существовать только в самом томе и исчезнут, когда вы удалите том.

Было предложено монтирование именованных томов, но, к сожалению, в ближайшее время он не будет добавлен в ядро. Однако это возможно с помощью подключаемого модуля докера с именем местный-настойчивый.