В 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). Я также попытался создать отдельный том как сервис
и сослаться на него в томах
, но это тоже не работает. Есть идеи, как должен выглядеть этот синтаксис?
томов
Он предназначен для создания именованных томов .
Если вы используете , а не ] используйте его, тогда вы получите кучу хешированных значений для ваших томов. Пример:
$ 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 .
См. Версия 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
$
Насколько я понимаю, вы можете использовать глобальные тома :
, чтобы
Тома в глобальном разделе будут созданы автоматически, если вы не укажете external: true
. Вам все равно нужно будет указать каждой службе в ее разделах :
, где смонтировать этот том.
Вот очень простой пример:
version: '2'
volumes:
project:
services:
one:
volumes:
- project:/bar
two:
volumes:
- project:/foo
Глобальные тома:
запись для проект
вызовет создание именованного тома проекта
. Затем он монтируется как / bar
в первом сервисе и как / foo
во втором сервисе. Обе службы совместно используют данные тома и могут читать / записывать их.
Я не думаю, что то, что вы пытаетесь сделать, возможно (превращение нескольких путей в один том и с разными флагами r / w). Если это возможно, то, вероятно, найдя способ создать именованный том с этими свойствами с помощью других средств, а затем добавив его как внешний том:
volumes:
mymagicvolume:
external: true
Я думаю, что то, что вы пытаетесь сделать, примерно такое же, как показано здесь . Вкратце: в настоящее время невозможно создать именованный том, который ссылается на точку монтирования на хосте. Вы можете создать именованный том для обмена данными между контейнерами, но данные будут существовать только в самом томе и исчезнут, когда вы удалите том.
Было предложено монтировать именованные тома , но, к сожалению, в ближайшем будущем оно не будет добавлено в ядро. Однако это возможно с помощью подключаемого модуля докера local-persist .