使用Docker Compose v1.6.0 +, docker-compose.yml
文件现在有一个新的/ version 2文件语法。 这些更改包括一个名为volumes
的单独顶级密钥。 这允许在一个地方“集中”卷定义。
我想要做的是在那里命名卷,并在我的本地主机磁盘上有一个卷引用多个path。 以下是一个例子,用一个以Traceback
结尾的exception引发exception
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
-branch卷configuration参考, Docker Compose文档 Volume / Volume-Driver参考,并通过GitHub示例查找以查找预期的正确语法。 似乎没有人已经在使用(GitHub),文档还远远没有完成(docker.com)。 我也试图build立一个单独的卷作为service
,并在volumes
引用它,但是这不起作用。 任何想法如何这个语法应该看起来像?
volumes
键的用途 它在那里创build命名卷 。
如果你不使用它,那么你会发现自己有一堆你的卷的哈希值。 例:
$ 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" } ]
旁注:您可能希望在创build卷之前先使用Docker构build服务以重新开始。
如果你使用的是Boot2Docker / Docker Machine ,那么在执行该卷的ls -la /mnt/…
之前,你将不得不使用docker docker-machine ssh
和sudo -i
– 你的主机是Docker Machineconfiguration的VM。
我了解它的方式,你可以使用全局volumes:
节来
全局部分的卷将自动创build,除非您指定external: true
。 您仍然需要告知volumes:
每个服务volumes:
安装该卷的位置。
这是一个非常简单的例子:
version: '2' volumes: project: services: one: volumes: - project:/bar two: volumes: - project:/foo
全局volumes:
项目的project
将导致创build一个命名卷project
。 然后,它被挂载为/foo
服务一,并/bar
服务二。 这两个服务共享卷的数据,并可以读取/写入。
我不认为你正在尝试做什么是可能的(将多个path变成一个单一的卷,并且具有不同的r / w标志)。 如果可能的话,那么可能通过find一种方法来通过其他方式创build具有这些属性的命名卷,然后将其添加为外部卷:
volumes: mymagicvolume: external: true
我认为你要做的事情大致和这里所看到的一样。 简而言之:目前无法创build一个指向主机上挂载点的命名卷。 您可以创build一个命名卷来在容器之间共享数据,但是数据只会存在于卷本身中,并且在删除卷时会消失。
已经提出了挂载命名卷 ,但不幸的是它不会在不久的将来被添加到核心中。 但是,通过使用名为local-persist的docker插件是可能的。
查看版本2 ,例如,还有卷configuration参考 :
我的例子:(版本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 $