和Docker 组成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 文档卷/卷驱动程序参考并查看GitHub 示例找到预期的正确语法。似乎没有人使用它(GitHub),文档也远未完成(docker.com)。我还尝试构建一个单独的卷并service
在中引用它volumes
,但效果不佳。有没有人知道这个语法应该是什么样的?
答案1
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
在创建卷之前让您的服务重新开始。
如果你使用从启动到Docker/Docker 机器,在执行该卷之前docker-machine ssh
,你必须– 你的主机是sudo -i
ls -la /mnt/…
Docker 机器。
编辑:其他有关命名卷的相关答案。
答案2
根据我的理解,你可以使用全局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