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

С Компоновщик 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/sharemevolumes:  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  … ?

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

Цель этого volumes ключ

Он существует для того, чтобы создавать именованные тома.

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

$ docker volume ls DRIVER              VOLUME NAMElocal               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

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

$ docker volume lslocal               projectname_someconflocal               projectname_otherconf

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

То docker-compose.yml синтаксис - это:

version: '2'services:    app:        container_name: app        volumes_from:            - appconf    appconf:        container_name: appconf        volumes:            - ./Docker/AppConf:/var/www/confvolumes:    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/… этого тома – ваша хост-машина - это виртуальная машина, подготовленная Докерная Машина.

РЕДАКТИРОВАТЬ: Другой соответствующий ответ об именованных томах на SO.

Насколько я понимаю, вы можете использовать глобальный 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

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

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

Проверять Версия 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$