Docker Compose版本2“卷”语法应该看起来如何?

使用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 

如何创build命名卷

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 sshsudo -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 $