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

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

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 -ils -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

答案3

查看版本 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
$ 

答案4

我认为你想做的事情和看到的大致相同这里。简而言之:目前无法创建指向主机上的挂载点的命名卷。您可以创建命名卷以在容器之间共享数据,但数据仅存在于卷本身中,并在删除卷时消失。

已提议安装命名卷,但不幸的是,它不会在不久的将来被添加到核心中。但是,可以使用名为本地持久化

相关内容