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

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

Я пытаюсь назвать там тома и иметь на моем локальном хост-диске ссылку на один том с несколькими путями. Ниже приведен пример выдачи исключения с 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 docs Справочник по тому / том-драйверу и просмотрел примеры GitHub , чтобы найти правильный синтаксис, который ожидается. Кажется, что никто уже не использует это (GitHub), и документация далека от завершения (docker.com). Я также попытался создать отдельный том как сервис и сослаться на него в томах , но это тоже не работает. Есть идеи, как должен выглядеть этот синтаксис?

43
задан 22 November 2016 в 23:31
4 ответа

Назначение ключа томов

Он предназначен для создания именованных томов .

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

$ 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"
    }
]

Заметка на полях: Вы можете захотеть докер-компоновку ваших сервисов, чтобы получить свежий начните перед тем, как создавать тома.

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

40
ответ дан 28 November 2019 в 19:41

См. Версия 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
$ 
5
ответ дан 28 November 2019 в 19:41

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

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

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

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

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

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

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

volumes:
  mymagicvolume:
    external: true
13
ответ дан 28 November 2019 в 19:41

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

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

5
ответ дан 28 November 2019 в 19:41

Теги

Похожие вопросы