Як повинен виглядати синтаксис "томів" 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- masterBranch Volume, посилання Docker Compose на документи / Volume-Driver та переглянув приклади 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"
    }
]

Sidenote: Ви можете захотіти, щоб docker-compose downваші служби почали по-новому, перш ніж створювати томи.

Якщо ви використовуєте Boot2Docker / Docker Machine , вам доведеться docker-machine sshі sudo -iдо того, як зробити ls -la /mnt/…цей обсяг, - ваша хост-машина - це VM, передбачений 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 / volumes /
volumename

На жаль, досі не розумію, куди докер отримує шлях для project:псевдоніму? Як докер знає, чи хочу я поділитися, сказати ./some_folder/some_subfolder/yet_another_subfolderна one:та two:контейнери?
Олександр Ломія

У цьому випадку це "проект: <будь-який шлях>" під томами верхнього рівня: розділ
Балінт Бако

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
$ 

1
Це саме те, що я пов’язав у запитанні, і тому не відповідає на моє запитання. Не хотіли б ви розмістити приклад того, як відображати різні каталоги від хоста як названого тома до кількох сервісів?
кайзер

моя посилання IS відрізняється, це вказує на Version 2розділ документа)
Alexus

Моє ліжко. Я просто забув пов'язати це. Коли ви дивитесь на YML-матеріали у запитанні, ви бачите, що я чітко намагався обійтись за допомогою окремої volumesклавіші верхнього рівня - чого я не зробив, звідси і питання. Чого я не отримую - це те, що docker-compose.ymlчастина із синтаксисом версії 1 має на меті пояснити мене.
кайзер

5

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

Запропоновано встановлення названих томів , але, на жаль, воно не буде додано до основної роботи найближчим часом. Однак це можливо за допомогою плагіна докера з назвою local-persist .


3
Встановлення названих томів - це річ ... починаючи з 1.11 або 1.12.
кайзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.