kai*_*ser 46 docker docker-compose
使用Docker Compose v1.6.0+,现在有一个新的/版本 2 文件语法docker-compose.yml。这些更改包括一个名为 的单独顶级密钥volumes。这允许在一个地方“集中”卷定义。
我想要做的是在那里命名卷,并在我的本地主机磁盘上有一个单一的卷引用多个路径。下面是一个例子,抛出一个以 aTraceback结尾的异常
AttributeError: 'list' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)
示例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
… ?
Run Code Online (Sandbox Code Playgroud)
到目前为止,我通读了所有Docker Compose 文档master-branch Volume 配置参考、Docker Compose 文档Volume/Volume-Driver 参考,并查看了GitHub 示例以找到预期的正确语法。似乎没有人已经在使用它 (GitHub) 并且文档远未完成 (docker.com)。我还尝试构建一个单独的卷service并在 中引用它volumes,但这也不起作用。关于这种语法应该是什么样子的任何想法?
kai*_*ser 42
volumes钥匙的用途它用于创建命名卷。
如果你不使用它,那么你会发现你的卷有一堆散列值。例子:
$ docker volume ls
DRIVER VOLUME NAME
local f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local 9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d
Run Code Online (Sandbox Code Playgroud)
使用命名卷,您会得到如下内容:
$ docker volume ls
local projectname_someconf
local projectname_otherconf
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
这类似于上面显示的命名卷。
当您有一堆散列时,可能很难清理。这是一个单行:
docker volume rm $(docker volume ls |awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)
编辑:正如@ArthurTacca 在评论中指出的那样,有一种更容易记住的方式:
docker volume rm $(docker volume ls -q)
Run Code Online (Sandbox Code Playgroud)
现在您不必再查找哈希,您可以继续使用它们的...名称来调用它们 :
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"
}
]
Run Code Online (Sandbox Code Playgroud)
旁注:docker-compose down在创建卷之前,您可能希望您的服务重新开始。
如果你正在使用Boot2Docker /泊坞窗机,你将不得不docker-machine ssh和sudo -i做之前,ls -la /mnt/…该卷的-你的主机是虚拟机配置的由泊坞窗机。
编辑:关于 SO 上命名卷的另一个相关答案。
小智 14
根据我的理解,您可以使用全局volumes:部分来
除非您指定,否则将自动创建全局部分中的卷external: true。您仍然需要在其volumes:部分中告诉每个服务在何处安装该卷。
这是一个非常简单的例子:
version: '2'
volumes:
project:
services:
one:
volumes:
- project:/bar
two:
volumes:
- project:/foo
Run Code Online (Sandbox Code Playgroud)
volumes:for的全局条目project将导致project创建命名卷。然后/bar在服务一和/foo服务二中安装它。这两个服务共享卷的数据并且可以读/写它。
我认为您尝试做的事情是不可能的(将多个路径变成一个卷,并使用不同的 r/w 标志)。如果可能,那么可能是通过其他方式找到一种方法来创建具有这些属性的命名卷,然后将其添加为外部卷:
volumes:
mymagicvolume:
external: true
Run Code Online (Sandbox Code Playgroud)
我的例子:(版本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
$
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为你想要做的与这里看到的大致相同。简而言之:目前无法创建引用主机上安装点的命名卷。您可以创建一个命名卷来在容器之间共享数据,但数据只会存在于卷本身中,并在您删除卷时消失。
已经提出了挂载命名卷,但不幸的是,它不会在不久的将来添加到核心中。但是,可以使用名为local-persist的 docker 插件。
| 归档时间: |
|
| 查看次数: |
87511 次 |
| 最近记录: |