Docker Compose 第 2 版“卷”语法应该是什么样子的?

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 sshsudo -i做之前,ls -la /mnt/…该卷的-你的主机是虚拟机配置的由泊坞窗机

编辑:关于 SO 上命名卷的另一个相关答案

  • 这是不正确的;这不会做它看起来像的事情。`volumes_from` 是从另一个容器 *继承* 卷列表。要使用命名卷,请使用服务级别语法 `-NAME:DEST`,并在顶级 `volumes` 键中设置路径。这个例子所做的(在撰写本文时)是在 *addition* 命名卷中创建一个标准卷,并且根本不使用命名卷。 (2认同)

小智 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)


ale*_*xus 5

例如,查看版本 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
$ 
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为你想要做的与这里看到的大致相同。简而言之:目前无法创建引用主机上安装点的命名卷。您可以创建一个命名卷来在容器之间共享数据,但数据只会存在于卷本身中,并在您删除卷时消失。

已经提出了挂载命名卷,但不幸的是,它不会在不久的将来添加到核心中。但是,可以使用名为local-persist的 docker 插件。

  • _挂载命名卷_ [现在是一件事](https://github.com/docker/docker/issues/19990#issuecomment-248955005) ...从 1.11 或 1.12 开始。 (3认同)