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

43

В 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 docs master-branch, справку по томам / драйверам тома Docker Compose и просматривал примеры GitHub, чтобы найти правильный ожидаемый синтаксис. Кажется, никто еще не использует это (GitHub), и документация далеко не полная (docker.com). Я также пытался создать отдельный том serviceи ссылаться на него volumes, но это также не работает. Любая идея о том, как этот синтаксис должен выглядеть?

кайзер
источник

Ответы:

40

Назначение 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 , вам придется docker-machine sshи sudo -iдо того, как сделать ls -la /mnt/…этот том - ваш хост-компьютер - это виртуальная машина, предоставляемая Docker Machine .

кайзер
источник
1
очень хороший ответ. веселит. Многое прояснилось, возвращаясь, чтобы найти новые тома для создания докеров.
Дерек Адэйр
Где ты нашел это? кажется гораздо больше, чем докер документы?
Дерек Адаир
1
@DerekAdair Спасибо, но, как вы можете прочитать в статистике в левом верхнем углу, этот ответ хорошо упоминается на страницах результатов поисковой системы Google по этой теме.
Кайзер
1
Вместо этого $(docker volume ls |awk '{print $2}')вы можете использовать $(docker volume ls -q)не только это проще, он не печатает «VOLUME» в первой строке.
Артур Такка
2
Это не правильно; это не делает то, что заставляет это казаться, что это делает. volumes_fromэто наследовать список томов из другого контейнера. Чтобы использовать именованный том, вы используете синтаксис уровня обслуживания - NAME:DESTи задаете путь в volumesключе верхнего уровня . То, что делает этот пример (на момент написания этого), делает стандартный том в дополнение к именованному тому, а названный том просто не используется.
Trevorj
13

Насколько я понимаю, вы можете использовать глобальный 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
головоломка
источник
1
Уже проголосовали, но только сегодня нашли время обойти это и добавили расширенные данные. Спасибо за вашу помощь! Вопрос: Когда вы называете том projectи затем ссылаетесь на него project:/bar, где на projectсамом деле определены пути?
Кайзер
docker-compose автоматически создаст их как именованные тома в / var / lib / docker / volume / coemename
JamesCW
Извините, до сих пор не понимаю, откуда докер получает путь для project:псевдонима? Как Docker знать , если я хочу поделиться, скажем , ./some_folder/some_subfolder/yet_another_subfolderк one:и two:контейнеров?
Александр
В этом случае это «проект: <whatpath>» в разделах верхнего уровня: раздел
Балинт Бако,
5

Посмотрите, например, версию 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
$ 
Alexus
источник
1
Это именно то, что я связал в вопросе и, следовательно, не отвечает на мой вопрос. Не могли бы вы опубликовать пример того, как сопоставить разные каталоги с хоста в качестве именованного тома с несколькими службами?
Кайзер
моя ссылка IS отличается, это указывает на Version 2раздел документа)
Alexus
Виноват. Я просто забыл связать это тоже. Когда вы посмотрите на материал YML в вопросе, вы увидите, что я явно пытался обойти, используя отдельную volumesклавишу верхнего уровня - что я не сделал, отсюда и вопрос. Что я не понимаю, так это то, что docker-compose.ymlпредназначено для объяснения в части с синтаксисом версии 1.
Кайзер
5

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

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

шлифовальная машинка
источник
3
Монтирование именованных томов теперь является делом … начиная с 1.11 или 1.12.
Кайзер