С участием 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 master
-филиал Справка по конфигурации тома, Документы Docker Compose Справочник по Volume / Volume-Driver и просмотрел Примеры на GitHub чтобы найти правильный синтаксис, который ожидается. Кажется, что никто уже не использует это (GitHub), и документация далека от завершения (docker.com). Еще я пробовал построить отдельный том как service
и ссылаться на него в volumes
, но это тоже не работает. Есть идеи, как должен выглядеть этот синтаксис?
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 ssh
и sudo -i
прежде чем делать ls -la /mnt/…
этого тома - ваш хост-компьютер - это виртуальная машина, предоставленная Докер машина.
Насколько я понимаю, вы можете использовать глобальный 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
Проверять, выписываться Версия 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
$
Я думаю, что вы пытаетесь сделать примерно то же, что видели Вот. Вкратце: в настоящее время невозможно создать именованный том, который ссылается на точку монтирования на хосте. Вы можете создать именованный том для обмена данными между контейнерами, но данные будут существовать только в самом томе и исчезнут, когда вы удалите том.
Было предложено монтирование именованных томов, но, к сожалению, в ближайшее время он не будет добавлен в ядро. Однако это возможно с помощью подключаемого модуля докера с именем местный-настойчивый.