zoukankan      html  css  js  c++  java
  • docker-compose文件语法解析(v3.x)

    文件配置

    compose文件是一个定义服务(service)、网络(network)和卷(volume)的YAML文件 。Compose 文件的默认路径是 ./docker-compose.yml

    提示:可以是用 .yml 或 .yaml 作为文件扩展名

    服务(service)定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数给docker container create一样。同样,网络和卷的定义类似于给 docker network create 和 docker volume create传递参数。

    正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,不需要在docker-compose.yml中再次指定它们。

    可以使用 Bash 类 ${VARIABLE} 语法在配置值中使用环境变量。

    配置选项

    .bulid

    服务除了可以基于指定的镜像(从docker hub中拉取),还可以基于Dockerfile构建的镜像,在使用 up 启动时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在目录的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器

    build: /path/to/build/dir

    也可以是相对路径,当提供的值是相对路径时,它被解释为相对于Compose文件的位置

    build: ./dir

    设定上下文根目录,然后以该目录为准指定 Dockerfile

    build:

      context: ./

      dockerfile: path/of/Dockerfile

    示例:

    version: '3'

    services:

      webapp:

        build: ./dir

    如果 context 中有指定的路径,并且可以指定Dockerfile和args。那么arg这个标签,就像 Dockerfile 中的 ARG 指令一样,它可以在构建过程中指定环境变量,但是在构建成功后取消,在docker-compose.yml 文件中也支持这样的写法:

    version: '3'

    services:

      webapp:

        build:

          context: ./dir

          dockerfile: Dockerfile-alternate

          args:

            buildno: 1

    与 ENV 不同的是,ARG 可以为空值

    args:

      - buildno

      - password

    如果要指定 image 以及 build ,选项格式为

    build: ./dir

    image: webapp:tag

    这会在 ./dir 目录生成一个名为 webaapp 和标记为 tag 的镜像

    注意:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为 docker stack 命令只接受预先构建的镜像

    2. context

    context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url

    当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

    build:

      context: ./dir

    . dockerfile

    使用此 dockerfile 文件来构建,必须指定构建路径

    build:

      context: .

      dockerfile: Dockerfile-alternate

    . args

    添加构建参数,这些参数是仅在构建过程中可访问的环境变量

    首先,在Dockerfile中指定参数:

    ARG buildno

    ARG password

    RUN echo "Build number: $buildno"

    RUN script-requiring-password.sh "$password"

    然后指定 build 下的参数,可以传递映射或列表

    build:

      context: .

      args:

        buildno: 1

        password: secret

    build:

      context: .

      args:

        - buildno=1

        - password=secret

    指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值

    args:

      - buildno

      - password

    Note YAML 布尔值(true,false,yes,no,on,off)必须使用引号括起来,以为了能够正常被解析为字符串

    . cache_from

    编写缓存解析镜像列表

    build:

      context: .

      cache_from:

        - alpine:latest

        - corp/web_app:3.14

    6. labels

    使用 Docker标签 将元数据添加到生成的镜像中,可以使用数组或字典。

    建议使用反向 DNS 标记来防止签名与其他软件所使用的签名冲突

    build:

      context: .

      labels:

        com.example.description: "Accounting webapp"

        com.example.department: "Finance"

        com.example.label-with-empty-value: ""

    build:

      context: .

      labels:

        - "com.example.description=Accounting webapp"

        - "com.example.department=Finance"

        - "com.example.label-with-empty-value"

    7.shm_size

    3.5版本中新增

    设置容器 /dev/shm 分区的大小,值为表示字节的整数值或表示字符的字符串

    build:

      context: .

      shm_size: '2gb'

    build:

      context: .

      shm_size: 10000000

    8. target

    3.4版本中新增

    根据对应的 Dockerfile 构建指定 Stage,即停留在特定的构建阶段

    build:

        context: .

        target: prod

    9. cap_addcap_drop

    添加或删除容器功能,权限清单详见:http://linux.die.net/man/7/capabilities 

    cap_add:

      - ALL

    cap_drop:

      - NET_ADMIN

      - SYS_ADMIN

    注意:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为 docker stack 命令只接受预先构建的镜像

    10. command

    覆盖容器启动后默认执行的命令

    command: bundle exec thin -p 3000

    该命令也可以是一个列表,方法类似于 dockerfile:

    command: ["bundle", "exec", "thin", "-p", "3000"]

    11. configs

    使用服务 configs 配置,为每个服务赋予相应的访问权限,支持两种不同的语法。

    注意:配置必须存在或在configs堆栈文件的顶层中定义,否则堆栈部署失效

    11.1.SHORT 语法

    SHORT 语法只能指定配置名称,这允许容器访问配置并将其安装在 /<config_name> 容器内,源名称和目标装入点都设为配置名称。

    version: "3.3"

    services:

      redis:

        image: redis:latest

        deploy:

          replicas: 1

        configs:

          - my_config

          - my_other_config

    configs:

      my_config:

        file: ./my_config.txt

      my_other_config:

        external: true

    以上实例使用 SHORT 语法将 redis 服务访问授予 my_config 和 my_other_config ,并被 my_other_config 定义为外部资源,这意味着它已经在 Docker 中定义。可以通过 docker config create 命令或通过另一个堆栈部署。如果外部部署配置都不存在,则堆栈部署会失败并出现config not found 错误。

    注意:config定义仅在 3.3 版本或在更高版本中受支持,YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。

    11.2. LONG 语法

    LONG 语法提供了创建服务配置的更加详细的信息

    • source:Docker中存在的config的名称
    • target:要在服务的任务中装载的文件的路径或名称。如果未指定则默认为/<source>
    • uid和gid:在服务的任务容器中拥有安装的配置文件的数字UID或GID。如果未指定,在Linux上默认为0。Windows不支持。
    • mode:在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444。如果配置文件无法写入,是因为它们安装在临时文件系统中,所以如果设置了可写位,它将被忽略,可设置执行位。

    下面示例在容器中将 my_config 名称设置为 redis_config,将mode设置为 0440(group-readable)并将用户和组设置为103。redis服务无法访问my_other_config配置。

    version: "3.3"

    services:

      redis:

        image: redis:latest

        deploy:

          replicas: 1

        configs:

          - source: my_config

            target: /redis_config

            uid: '103'

            gid: '103'

            mode: 0440

    configs:

      my_config:

        file: ./my_config.txt

      my_other_config:

        external: true

    可以同时授予多个配置的服务相应的访问权限,也可以混合使用 LONG 和 SHORT 语法,定义配置并不意味着授予服务访问权限。

    12. cgroup_parent

    可以为容器选择一个可选的父 cgroup

    cgroup_parent: m-executor-abcd

    注意:当使用(Version 3)Compose 文件在群集模式下部署堆栈时,忽略此选项

    13. container_name

    为自定义的容器指定一个名称,而不是使用默认的名称

    container_name: my-web-container

    因为 docker 容器名称必须是唯一的,因此如果已指定自定义名称,则无法将服务扩展到1个容器之外

    14. credential_spec

    3.3版本中新增

    为托管服务账户配置凭据规范,此选项仅适用于 Windows 容器服务

    在 credential_spec 上的配置列表格式为 file://<filename> 或 registry://<value-name>

    使用 file: 应该注意引用的文件必须存在于CredentialSpecs,docker 数据目录的子目录中。在 Windows 上,该目录默认为 C:ProgramDataDocker。

    以下示例从名为C:ProgramDataDockerCredentialSpecsmy-credential-spec.json 的文件加载凭证规范 :

    credential_spec:

      file: my-credential-spec.json

    使用 registry: 将从守护进程主机上的 Windows 注册表中读取凭据规范。其注册表值必须位于:

    HKLMSOFTWAREMicrosoftWindows NTCurrentVersionVirtualizationContainersCredentialSpecs

    下面的示例通过 my-credential-spec 注册表中指定的值加载凭证规范:

    credential_spec:

      registry: my-credential-spec

    15. deploy

    仅用于v3版本中

    指定与部署和运行服务相关的配置

    只有当使用docker stack deploy部署到swarm时生效,并且被docker-compose updocker-compose run忽略

    version: '3'

    services:

      redis:

        image: redis:alpine

        deploy:

          replicas: 6

          update_config:

            parallelism: 2

            delay: 10s

          restart_policy:

            condition: on-failure

    这里有几个子选项

    1. endpoint_mode

    仅3.3版本

    指定连接到群组外部客户端服务发现方法

    • endpoint_mode:vip :Docker为该服务分配了一个虚拟IP(VIP),作为客户端到达网络服务的“前端”, Docker在客户端和服务的可用工作节点之间路由请求,而无需客户端知道有多少节点参与服务或其IP地址或端口(默认设置)。
    • endpoint_mode: dnsrr : DNS轮询(DNSRR)服务发现不使用单个虚拟 IP。Docker为服务设置 DNS 条目,使得服务名称的 DNS 查询返回一个 IP 地址列表,并且客户端直接连接到其中的一个。如果想使用自己的负载均衡器,或者混合 Windows 和 Linux 应用程序,则 DNS 轮询调度(round-robin)功能就非常实用。

    version: "3.3"

    services:

      wordpress:

        image: wordpress

        ports:

          - 8080:80

        networks:

          - overlay

        deploy:

          mode: replicated

          replicas: 2

          endpoint_mode: vip

      mysql:

        image: mysql

        volumes:

           - db-data:/var/lib/mysql/data

        networks:

           - overlay

        deploy:

          mode: replicated

          replicas: 2

          endpoint_mode: dnsrr

    volumes:

      db-data:

    networks:

      overlay:

    2.labels

    指定服务的标签,这些标签仅在服务上设置,而不是在服务的任何容器上设置。

    version: "3"

    services:

      web:

        image: web

        deploy:

          labels:

            com.example.description: "This label will appear on the web service"

    要在容器上设置标签,而不是在deploy中设置,在deploy外设置:

    version: "3"

    services:

      web:

        image: web

        labels:

          com.example.description: "This label will appear on all containers for the web service"

    3.mode

    • global:集群中每个节点只会为服务启动一个容器
    • replicated:指定容器数量(默认)

    version: '3'

    services:

      worker:

        image: dockersamples/examplevotingapp_worker

        deploy:

          mode: global

    4. placement

    指定 constraints 和 preferences

    version: '3'

    services:

      db:

        image: postgres

        deploy:

          placement:

            constraints:

              - node.role == manager

              - engine.labels.operatingsystem == ubuntu 14.04

            preferences:

              - spread: node.labels.zone

    .replicas

    如果服务是 replicated(默认),需要指定运行的容器数量

    version: '3'

    services:

      worker:

        image: dockersamples/examplevotingapp_worker

        networks:

          - frontend

          - backend

        deploy:

          mode: replicated

          replicas: 6

    6. resources

    配置资源限制

    version: '3'

    services:

      redis:

        image: redis:alpine

        deploy:

          resources:

            limits:

              cpus: '0.50'

              memory: 50M

            reservations:

              cpus: '0.25'

              memory: 20M

    此例子中,redis 服务限制使用不超过50M 的内存和 0.50(50%)可用处理时间(CPU),并且 保留 20M 了内存和 0.25 CPU时间

    7. restart_policy

    配置容器的重新启动,取代restart

    • condition:值可以为 none 、on-failure 以及 any(默认)
    • delay:尝试重启的等待时间,默认为 0
    • max_attempts:在放弃之前尝试重新启动容器次数(默认:never give up)。如果在window配置中重新启动没有成功,则此尝试不计入配置max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。
    • window:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:decide immediately)。

    version: "3"

    services:

      redis:

        image: redis:alpine

        deploy:

          restart_policy:

            condition: on-failure

            delay: 5s

            max_attempts: 3

            window: 120s

    8rollback_config

    3.7版本及以上支持

    配置在更新失败的情况下应如何回滚服务。

    • parallelism:同时回滚的容器数。如果设置为0,则所有容器同时回滚
    • delay:每个容器组的回滚之间等待的时间(默认为0)。
    • failure_action:如果回滚失败该怎么办。continue或pause(默认pause)
    • monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0
    • max_failure_ratio:回滚期间容忍的失败率(默认值为0
    • order:回滚期间的操作顺序。其中之一:
      stop-first(旧任务在启动新任务之前停止),或
      start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)。

    9. update_config

    配置更新服务,用于无缝更新应用(rolling update)

    • parallelism:一次性更新的容器数量
    • delay:更新一组容器之间的等待时间。
    • failure_action:如果更新失败,可以执行的的是 continue、rollback 或 pause (默认)
    • monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为0)
    • max_failure_ratio:在更新期间能接受的失败率
    • order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first)

    注意order仅支持v3.4及更高版本

    version: '3.4'

    services:

      vote:

        image: dockersamples/examplevotingapp_vote:before

        depends_on:

          - redis

        deploy:

          replicas: 2

          update_config:

            parallelism: 2

            delay: 10s

            order: stop-first

    不支持 Docker stack deploy 的几个子选项
    build、cgroup_parent、container_name、devices、tmpfs、external_links、links、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode

    16. devices

    设置映射列表,与 Docker 客户端的 --device 参数类似 :

    devices:

      - "/dev/ttyUSB0:/dev/ttyUSB0"

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项

    17. depends_on

    此选项解决了启动顺序的问题

    在使用 Compose 时,最大的好处就是很少需要输入启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

    指定服务之间的依赖关系,有两种效果:

    • docker-compose up 以依赖顺序启动服务,下面例子中redis和db服务在web启动前启动
    • docker-compose up SERVICE 自动包含 SERVICE 的依赖性,下面例子中,例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

    version: '3'

    services:

      web:

        build: .

        depends_on:

          - db

          - redis

      redis:

        image: redis

      db:

        image: postgres

    注意:

    1)、默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系

    2)、版本3不再支持condition形式depends_on

    3)、使用版本3 Compose文件在swarm模式下部署堆栈depends_on时,将忽略该选项

    18. dns

    自定义 DNS 服务器,与 --dns 具有一样的用途,可以是单个值或列表

    dns: 8.8.8.8

    dns:

      - 8.8.8.8

      - 9.9.9.9

    19. dns_search

    自定义 DNS 搜索域,可以是单个值或列表

    dns_search: example.com

    dns_search:

      - dc1.example.com

      - dc2.example.com

    20. tmpfs

    适用于版本2及以上

    挂载临时文件目录到容器内部,与 run 的参数一样效果,可以是单个值或列表

    tmpfs: /run

    tmpfs:

      - /run

      - /tmp

    注意:使用(版本3-3.5)Compose文件在swarm模式下部署堆栈时,将忽略此选项。

    3.6版本及以上:

    在容器内安装临时文件系统。Size参数指定tmpfs mount的大小(以字节为单位),默认无限制。

     - type: tmpfs

         target: /app

         tmpfs:

           size: 1000

    21. entrypoint

    在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定入口点。在 docker-compose.yml 中可以定义入口点,覆盖 Dockerfile中的定义

    entrypoint: /code/entrypoint.sh

    entrypoint 也可以是一个列表,方法类似于dockerfile

    entrypoint:

        - php

        - -d

        - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so

        - -d

        - memory_limit=-1

        - vendor/bin/phpunit

    21. env_file

    从文件中添加环境变量,可以是单个值或是列表
    如果已经用docker-compose -f FILE 指定了 Compose 文件,那么 env_file 路径值为相对于该文件所在的目录

    environment环境中的设置的变量会覆盖这些值,无论这些值未定义还是为 None

    env_file: .env

    或者根据 docker-compose.yml 设置多个:

    env_file:

      - ./common.env

      - ./apps/web.env

      - /opt/secrets.env

    环境配置文件 env_file 中的声明每行都是以 VAR=VAL 格式,以#开头的行被视为注释并被忽略,空行也被忽略。

    # Set Rails/Rack environment

    RACK_ENV=development

    注意环境变量配置列表的顺序,例如下面例子

    docker_compose.yml

    services:

      some-service:

        env_file:

          - a.env

          - b.env

    a.env 文件

    # a.env

    VAR=1

    b.env文件

    # b.env

    VAR=hello

    对于在文件a.env 中指定的相同变量但在文件 b.env 中分配了不同的值,则在 a.env 设置的值被 b.env 相同变量的值覆盖,此时 $VAR 值为 hello。此外,这里所说的环境变量是对宿主机的 Compose 而言的,如果在配置文件中有 build 操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选 arg 标签

    22. environment

    添加环境变量,可以使用数组或字典,任何布尔值:true,false,yes,no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。与上面的 env_file 选项完全不同,反而和 arg 有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像中,也就是说启动的容器也会包含这些变量设置,这是与 arg 最大的不同。
    一般 arg 标签的变量仅用在构建过程中。而 environment Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果

    environment:

      RACK_ENV: development

      SHOW: 'true'

      SESSION_SECRET:

    environment:

      - RACK_ENV=development

      - SHOW=true

      - SESSION_SECRET

    23. expose

    暴露端口,但不映射到宿主机,只被连接的服务访问。这个标签与 Dockerfile 中的 EXPOSE 指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上 docker-compose.yml 的端口映射还得 ports 这样的标签

    expose:

     - "3000"

     - "8000"

    24. external_links

    链接到 docker-compose.yml 外部的容器,甚至并非Compose 项目文件管理的容器,尤其是对于提供共享或公共服务的容器。参数格式跟过时的 links 类似

    在使用Docker过程中,会有许多单独使用 docker run 启动的容器的情况,为了使 Compose 能够连接这些不在docker-compose.yml 配置文件中定义的容器,那么就需要一个特殊的标签,就是 external_links,它可以让Compose 项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面,连接到同一网络上的各个容器才能够相互通信)。

    格式如下:

    external_links:

     - redis_1

     - project_db_1:mysql

     - project_db_1:postgresql

    注意:在群集模式下使用(版本3)Compose文件部署堆栈时,将忽略此选项

    25. extra_hosts

    添加主机名的标签,就是往 /etc/hosts 文件中添加一些记录,与Docker客户端 中的--add-host类似:

    extra_hosts:

     - "somehost:162.242.195.82"

     - "otherhost:50.31.209.229"

    具有 IP 地址和主机名的条目在 /etc/hosts 内部容器中创建。启动之后查看容器内部 hosts ,例如:

    162.242.195.82  somehost

    50.31.209.229   otherhost

    26.healthcheck

    2.1版本及以上

    用于检查测试服务使用的容器是否正常

    healthcheck:

      test: ["CMD", "curl", "-f", "http://localhost"]

      interval: 1m30s

      timeout: 10s

      retries: 3

      start_period: 40s

    interval,timeout 以及 start_period 都定为持续时间

    注意:start_period仅支持v3.4及更高版本

    test 必须是字符串或列表,如果它是一个列表,第一项必须是 NONE,CMD 或 CMD-SHELL ;如果它是一个字符串,则相当于指定CMD-SHELL 后跟该字符串。

    # Hit the local web app

    test: ["CMD", "curl", "-f", "http://localhost"]

    # As above, but wrapped in /bin/sh. Both forms below are equivalent.

    test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]

    test: curl -f https://localhost || exit 1

    如果需要禁用镜像的所有检查项目,可以使用 disable: true,相当于 test:["NONE"]

    healthcheck:

      disable: true

    27. image

    从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID

    image: redis

    image: ubuntu:14.04

    image: tutum/influxdb

    image: example-registry.com:4000/postgresql

    image: a4bc65fd

    如果镜像不存在,Compose 会自动拉去镜像

    除非还指定了build,在这种情况下,它使用指定的选项构建,并使用这里指定的镜像名称镜像名称及tag,命名及标记构建的镜像。

     

    28init

    3.7版本中添加

    在容器内运行init,转发信号并重新获取进程。设置布尔值以使用默认值init,或指定自定义路径的路径。

    version: '3.7'

    services:

      web:

        image: alpine:latest

        init: true

    version: '2.2'

    services:

      web:

        image: alpine:latest

        init: /usr/libexec/docker-init

    29. isolation

    指定容器的隔离技术。Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和hyperv

    30. labels

    使用 Docker 标签将元数据添加到容器,可以使用数组或字典。与 Dockerfile 中的 LABELS 类似:

    labels:

      com.example.description: "Accounting webapp"

      com.example.department: "Finance"

      com.example.label-with-empty-value: ""

    labels:

      - "com.example.description=Accounting webapp"

      - "com.example.department=Finance"

      - "com.example.label-with-empty-value"

    31.links

    警告

    --link是Docker的遗留功能。它最终可能被删除。除非绝对需要继续使用它,否则建议使用用户定义的网络来促进两个容器之间的通信,而不是使用--link。
    当不支持用户定义的网络,可以使用--link功能在容器之间共享环境变量。但是,也可使用其他机制(如卷)以更可控的方式在容器之间共享环境变量

    链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS),或仅指定服务名称(此时别名和服务名称相同)。与Docker客户端的--link效果一样,会连接到其它服务中的容器

    web:

      links:

       - db

       - db:database

       - redis

    使用的别名alias将会自动在服务容器中的/etc/hosts 里创建。例如:

    172.12.2.186  db

    172.12.2.186  database

    172.12.2.187  redis

    相应的环境变量也将被创建

    32. logging

    配置日志服务

    logging:

      driver: syslog

      options:

        syslog-address: "tcp://192.168.0.42:123"

    driver指定服务器的日志记录驱动程序,默认值为 json-file,与 --log-diver 选项一样

    driver: "json-file"

    driver: "syslog"

    driver: "none"

    注意:只有驱动程序 json-file 和 journald 驱动程序可以直接从 docker-compose up 和 docker-compose logs 获取日志。使用任何其他方式不会显示任何日志。

    对于可选值,可以使用 options 指定日志记录中的日志记录选项

    driver: "syslog"

    options:

      syslog-address: "tcp://192.168.0.42:123"

    默认驱动程序 json-file 具有限制存储日志文件大小及轮替的选项

    options:

      max-size: "200k"

      max-file: "10"

    上面实例将存储日志文件,直到它们达到max-size:200kB将会被轮替,存储的轮替的日志文件保留数量由max-file 值指定。随着日志增长超出最大限制,旧日志文件将被删除以存储新日志

    docker-compose.yml 限制日志存储的示例

    services:

      some-service:

        image: some-service

        logging:

          driver: "json-file"

          options:

            max-size: "200k"

            max-file: "10"

    33. network_mode

    网络模式,用法类似于 Docke 客户端的 --network选项,及特殊形式service:[service name]

    network_mode: "bridge"

    network_mode: "host"

    network_mode: "none"

    network_mode: "service:[service name]"                           #使用某个服务使用的网络

    network_mode: "container:[container name/id]"                 #使用某个容器使用的网络

    可以指定使用服务或者容器的网络

    34. networks

    要加入的网络,引用顶级networks下的条目

    services:

      some-service:

        networks:

         - some-network

         - other-network

    注意:

    • 在群集模式下使用(版本3)Compose文件部署堆栈时,将忽略此选项。
    • network_mode: "host"不能与links混在一起使用。

    35. aliases

    网络上此服务的别名。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。

    aliases是网络范围的,因此相同的服务可以在不同的网络上具有不同的别名

    注意:网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。

    services:

      some-service:

        networks:

          some-network:

            aliases:

             - alias1

             - alias3

          other-network:

            aliases:

             - alias2

    下面实例中,提供 web 、worker以及db 服务,有两个网络 new 和 legacy 。

    version: '2'

    services:

      web:

        build: ./web

        networks:

          - new

      worker:

        build: ./worker

        networks:

          - legacy

      db:

        image: mysql

        networks:

          new:

            aliases:

              - database

          legacy:

            aliases:

              - mysql

    networks:

      new:

      legacy:

    相同的服务可以在不同的网络可以有不同的别名

    36. ipv4_addressipv6_address

    为服务的容器指定一个静态IP地址

    顶级网络部分中的相应网络配置必须具包含每个静态地址的子网配置的块。如果需要IPv6寻址,则必须设置选项enable_ipv6,并且必须使用版本2.x Compose文件,如下所示。

    注意:这些选项目前不适用于群集模式。

    version: '2.1'

    services:

      app:

        image: busybox

        command: ifconfig

        networks:

          app_net:

            ipv4_address: 172.16.238.10

            ipv6_address: 2001:3984:3989::10

    networks:

      app_net:

        driver: bridge

        enable_ipv6: true

        ipam:

          driver: default

          config:

          -

            subnet: 172.16.238.0/24

          -

            subnet: 2001:3984:3989::/64

    37. PID

    pid: "host"

    将 PID 模式设置为主机 PID 模式,可以打开容器与主机操作系统之间的共享 PID 地址空间。使用此标志启动的容器可以访问和操作宿主机的其他容器,反之亦然。

    38. ports

    映射端口

    注意:端口映射与network_mode: host不兼容

    1. SHORT 语法

    可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口

    ports:

     - "3000"

     - "3000-3005"

     - "8000:8000"

     - "9090-9091:8080-8081"

     - "49100:22"

     - "127.0.0.1:8001:8001"

     - "127.0.0.1:5000-5010:5000-5010"

     - "6060:6060/udp"

    注意:当使用 HOST:CONTAINER 格式来映射端口时,如果使用的容器端口小于 60 可能会得到错误得结果,因为YAML 将会解析 xx:yy 这种数字格式为 base-60,所以建议采用字符串格式。

    2. LONG 语法

    LONG 语法支持 SHORT 语法不支持的附加字段

    • published:公开的端口,即映射到宿主机上的端口
    • target:容器内的端口
    • protocol:端口协议(tcp或udp)
    • mode:host用于在每个节点上发布主机端口,或ingress用于负载平衡的群集模式端口

    ports:

      - target: 80

        published: 8080

        protocol: tcp

        mode: host

    39. secrets

    通过secrets为每个服务授予相应的访问权限

    注意:secret必须已存在或在此堆栈文件的顶级配置中定义secrets,否则堆栈部署将失败

    1. SHORT语法

    短语法仅指定secret名称。这允许容器访问secret并将其安装在容器内/run/secrets/<secret_name>。源名称和目标安装点都设置为secret名称。

    以下示例使用短语法授予redis服务访问my_secret和my_other_secret secret的权限。my_secret的值设置为文件./my_secret.txt的内容,且my_other_secret定义为外部资源,这意味着它已经在Docker中定义,可以通过运行docker secret create命令或通过其他堆栈部署来定义。如果外部secret不存在,则堆栈部署失败并显示secret not found错误

    version: "3.1"

    services:

      redis:

        image: redis:latest

        deploy:

          replicas: 1

        secrets:

          - my_secret

          - my_other_secret

    secrets:

      my_secret:

        file: ./my_secret.txt

      my_other_secret:

        external: true

    2.. LONG 语法

    长语法提供了在服务的任务容器中如何创建secret的更多粒度。

    • source:Docker中存在的secret名称。
    • target:在服务任务容器中需要装载在 /run/secrets/ 中的文件名称,如果未指定,则默认为source。
    • uid和gid:/run/secrets/在服务的任务容器中拥有该文件的UID或GID。如果未指定,则默认为默认值0。
    • mode:以八进制表示法将文件装载到服务的任务容器中 /run/secrets/ 的权限。例如,0444 代表可读。Docker 1.13.1中的默认值是0000,但是在较新的版本中为0444。secret不能写,因为它们安装在临时文件系统中,因此如果设置了可写位,则会被忽略。可以设置可执行位

    version: "3.1"

    services:

      redis:

        image: redis:latest

        deploy:

          replicas: 1

        secrets:

          - source: my_secret

            target: redis_secret

            uid: '103'

            gid: '103'

            mode: 0440

    secrets:

      my_secret:

        file: ./my_secret.txt

      my_other_secret:

        external: true

    40. security_opt

    为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签,比如设置全部服务的 user 标签值为 USER

    security_opt:

      - label:user:USER

      - label:role:ROLE

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项

    41. stop_grace_period

    在发送 SIGKILL 之前指定 stop_signal ,如果试图停止容器(如果它没有处理 SIGTERM(或指定的任何停止信号)),则需要等待的时间

    stop_grace_period: 1s

    stop_grace_period: 1m30s

    默认情况下,stop 在发送SIGKILL之前等待10秒钟容器退出

    42. stop_signal

    设置另一个信号来停止容器。在默认情况下使用的 SIGTERM来停止容器。设置另一个信号可以使用 stop_signal 标签:

    stop_signal: SIGUSR1

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。

    43. sysctls

    在容器中设置的内核参数,可以为数组或字典

    sysctls:

      net.core.somaxconn: 1024

      net.ipv4.tcp_syncookies: 0

    sysctls:

      - net.core.somaxconn=1024

      - net.ipv4.tcp_syncookies=0

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。

    44. ulimits

    覆盖容器的默认限制,可以单一地将限制值设为一个整数,也可以将soft/hard 限制指定为映射

    ulimits:

      nproc: 65535

      nofile:

        soft: 20000

        hard: 40000

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。

    45. userns_mode

    userns_mode: "host"

    如果Docker守护程序配置了用户名称空间,则禁用此服务的用户名称空间。

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项。

    46. volumes

    注意:顶级卷定义了命名卷,并从每个服务volumes列表中引用它。取代了早期版本Compose文件中的volumes_from

    挂载一个目录或命名卷,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统

    可以将宿主机路径作为单个服务的定义的一部分进行挂载(即绑定挂载),而无需在顶级volumes中定义它

    如果要跨多个服务重用卷,需要在顶级volumes中定义命名卷,将命名卷与服务,群组和堆栈文件一起使用。

    示例:

    version: "3.2"

    services:

      web:

        image: nginx:alpine

        volumes:

          - type: volume

            source: mydata

            target: /data

            volume:

              nocopy: true

          - type: bind

            source: ./static

            target: /opt/app/static

      db:

        image: postgres:latest

        volumes:

          - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"

          - "dbdata:/var/lib/postgresql/data"

    volumes:

      mydata:

      dbdata:

    1SHORT语法

    (可选)指定主机(HOST:CONTAINER)上的路径或访问模式(HOST:CONTAINER:ro)。

    可以在主机上安装相对路径,该路径相对于正在使用的Compose配置文件所在目录,相对路径应始终以.或开头..。

    volumes:

      # Just specify a path and let the Engine create a volume

      - /var/lib/mysql

      # Specify an absolute path mapping

      - /opt/data:/var/lib/mysql

      # Path on the host, relative to the Compose file

      - ./cache:/tmp/cache

      # User-relative path

      - ~/configs:/etc/configs/:ro

      # Named volume

      - datavolume:/var/lib/mysql

    2LONG语法

    长格式语法允许配置无法以简短形式表示的其他字段。

    • type:挂载类型可以为volume,bind或tmpfs
    • source:mount的源,宿主机上用于绑定挂载的路径,或顶级volumes中定义的卷的名称。不适用于tmpfs挂载。
    • target:容器中安装卷的路径
    • read_only:将卷设置为只读
    • bind:配置其他绑定选项
      • propagation:用于绑定的propagation模式(volume固定为rprivate,不可更改;bind mount默认为rprivate可更改)
    • volume:配置其他卷选项
      • nocopy:用于在创建卷时禁用从容器复制数据
    • tmpfs:配置其他tmpfs选项
      • size:tmpfs mount的大小(以字节为单位)

    version: "3.2"

    services:

      web:

        image: nginx:alpine

        ports:

          - "80:80"

        volumes:

          - type: volume

            source: mydata

            target: /data

            volume:

              nocopy: true

          - type: bind

            source: ./static

            target: /opt/app/static

    networks:

      webnet:

    volumes:

      mydata:

    注意:长语法是v3.2中的新增功能

    47. 用于服务service、群集swarm以及堆栈文件的卷

    在使用服务,群集和 docker-stack.yml 文件时,记住支持服务的任务(容器)可以部署在群集中的任何节点上,并且每次更新服务时都可能是不同的节点。

    在不指定源的命名卷的情况下,Docker为支持服务的每个任务创建一个匿名卷,关联的容器被移除后,匿名卷不会保留。

    如果希望数据持久存在,使用可识别多主机的命名卷和卷驱动程序,以便可以从任何节点访问数据。或对该服务设置约束,以便将其任务部署在具有该卷的节点上。

    示例:

    Docker Labs 中 votingapp 示例的 docker-stack.yml文件中定义了一个称为 db 的服务,被配置为一个命名卷来保存swarm上的数据, 并且仅限于在manager节点上运行。

    下面是该文件的部分内容:

    version: "3"

    services:

      db:

        image: postgres:9.4

        volumes:

          - db-data:/var/lib/postgresql/data

        networks:

          - backend

        deploy:

          placement:

            constraints: [node.role == manager]

    48. restart

    默认值为 no ,即在任何情况下都不会重新启动容器;当值为 always 时,容器总是重新启动;当值为 on-failure 时, on-failure 如果退出代码指示的故障错误政策,重启容器

    restart: "no"

    restart: always

    restart: on-failure

    restart: unless-stopped

    注意:使用(版本3)Compose文件在群集模式下部署堆栈时,将忽略此选项,改用restart_policy

    49. 其他选项

    关于标签: domainname、hostname、ipc、mac_address、privileged、read_only、shm_size、stdin_open、tty、user、working_dir

    上面这些都是一个单值的标签,类似于使用docker run的效果

    user: postgresql

    working_dir: /code

    domainname: foo.com

    hostname: foo

    ipc: host

    mac_address: 02:42:ac:11:65:43

    privileged: true

    read_only: true

    shm_size: 64M

    stdin_open: true

    tty: true

    50、指定持续时间Specifying durations

    某些配置选项(例如interval和timeout子选项check)接受持续时间作为字符串,格式如下所示:

    2.5s

    10s

    1m30s

    2h32m

    5h34m56s

    支持的单位有 us、ms、s、m 以及 h

    51. 指定字节值Specifying byte values

    某些配置选项接受字节值作为字符串,格式如下所示:

    2b

    1024kb

    2048k

    300m

    1gb

    支持的单位是 b,k,m 以及 g,或 kb, mb 和 gb。目前不支持十进制值

    52、卷配置参考Volume configuration reference

    虽然可以在文件上声明作为服务声明的一部分,但这里允许创建可在多个服务中重用的命名卷(不依赖于volumes_from),并且可以使用docker命令行轻松检索和检查API。

    以下是双服务设置的示例,其中数据库的数据目录与另一个服务共享卷,以便可以定期备份:

    version: "3"

    services:

      db:

        image: db

        volumes:

          - data-volume:/var/lib/db

      backup:

        image: backup-service

        volumes:

          - data-volume:/var/lib/backup/data

    volumes:

      data-volume:

    顶级volumes下的条目可以为空,在这种情况下,它使用引擎配置的默认驱动程序(在大多数情况是local驱动程序)。(可选)可以使用以下选项进行配置:

    driver

    为此卷指定应使用哪个卷驱动程序。默认为Docker Engine配置使用的任何驱动程序,在大多数情况下是local。如果驱动程序不可用,则在docker-compose up尝试创建卷时Engine会返回错误。

     driver: foobar

    driver_opts

    将选项列表指定为键值对,以传递给此卷的驱动程序。这些选项取决于驱动程序,可选。

     driver_opts:

       foo: "bar"

       baz: 1

    external

    如果设置为true,则指定在Compose之外创建此卷。docker-compose up不会尝试创建它,如果它不存在则引发错误。

    external不能与其他卷配置项(driver,driver_opts)一起使用

    在下面的示例中,不会尝试创建名为[projectname]_data的卷,Compose查找名为data的卷,并将其挂载到db服务的容器中。

    version: '2'

    services:

      db:

        image: postgres

        volumes:

          - data:/var/lib/postgresql/data

    volumes:

      data:

        external: true

    不支持在3.4版本中使用external.name,可使用name代替。

    还可以在Compose文件中与用于引用它的名称分别指定卷的名称:

    volumes:

      data:

        external:

          name: actual-name-of-volume

    始终使用docker stack deploy创建外部卷

    如果使用docker stack deploy以swarm群集模式启动应用程序(而不是docker compose up),则会创建不存在的外部卷。在群集模式下,当服务定义卷时,会自动创建卷。由于服务任务是在新节点上调度的,因此swarmkit会在本地节点上创建卷。

    labels

    使用Docker标签向容器添加元数据。可使用数组或字典。

    建议使用反向DNS表示法来防止标签与其他软件使用的标签冲突

    labels:

      com.example.description: "Database volume"

      com.example.department: "IT/Ops"

      com.example.label-with-empty-value: ""

    labels:

      - "com.example.description=Database volume"

      - "com.example.department=IT/Ops"

      - "com.example.label-with-empty-value"

    name

    在3.4版本中添加

    为此卷设置自定义名称

    version: '3.4'

    volumes:

      data:

        name: my-app-data

    也可与external属性结合使用:

    version: '3.4'

    volumes:

      data:

        external: true

        name: my-app-data

    53、网络配置参考Network configuration reference

    顶级networks选项允许指定要创建的网络。

    driver

    为此网络指定应该使用哪个驱动程序。

    默认驱动程序取决于正在使用的Docker Engine的配置方式,但在大多数情况下,为位于独立容器上的bridge和位于Swarm上的overlay。

    如果驱动程序不可用,Docker引擎会返回错误。

    driver: overlay

    bridge

    Docker默认使用bridge独立独立容器上的网络。

    overlay

    overlay驱动程序创建一个跨多个节点命名的网络群。

    host none

    使用主机的网络堆栈,或不使用网络。相当于docker run --network=host或docker run --network=none。仅在使用docker stack命令时使用。如果使用docker-compose命令,改用network_mode。

    使用内置的网络, host和none语法略有不同。使用名称host或none(Docker已自动创建)和Compose可以使用的别名(hostnet或nonet在这些示例中)定义外部网络,然后使用别名授予对该网络的服务访问权限。

    services:

      web:

        ...

        networks:

          hostnet: {}

    networks:

      hostnet:

        external: true

        name: host

    services:

      web:

        ...

        networks:

          nonet: {}

    networks:

      nonet:

        external: true

        name: none

    driver_opts

    将选项列表指定为键值对,以传递给此网络的驱动程序。这些选项取决于驱动程序,可选。

      driver_opts:

        foo: "bar"

        baz: 1

    attachable

    注意:仅支持v3.2及更高版本。

    仅在driver设置为overlay时使用。如果设置为true,则除swarm服务外,独立容器可以附加到此网络。如果独立容器连接到覆盖网络,它可以与也从其他Docker守护程序连接到overlay网络的服务和独立容器进行通信。

    networks:

      mynet1:

        driver: overlay

        attachable: true

    enable_ipv6

    在此网络上启用IPv6网络。

    版本3不支持

    enable_ipv6要求使用版本2 的Compose文件,因为Swarm模式下尚不支持此指令。

    ipam

    指定自定义IPAM配置。这是一个具有多个属性的对象,每个属性都是可选的:

    • driver:自定义IPAM驱动程序,而不是默认值。
    • config:包含零个或多个配置块的列表,每个配置块包含以下任意选项:
      • subnet:CIDR格式的子网,表示网段

    一个完整的例子:

    ipam:

      driver: default

      config:

        - subnet: 172.28.0.0/16

    注意:其他IPAM配置,例如,gateway仅适用于版本2。

    internal

    默认情况下,Docker还将桥接网络连接到它以提供外部连接。如果要创建外部隔离的overlay,可以将此选项设置为true。

    labels

    使用Docker标签向容器添加元数据。您可以使用数组或字典。

    建议使用反向DNS表示法来防止标签与其他软件使用的标签冲突。

    labels:

      com.example.description: "Financial transaction network"

      com.example.department: "Finance"

      com.example.label-with-empty-value: ""

    labels:

      - "com.example.description=Financial transaction network"

      - "com.example.department=Finance"

      - "com.example.label-with-empty-value"

    external

    如果设置为true,则指定已在Compose之外创建的网络。docker-compose up不会尝试创建它,如果它不存在则引发错误。

    external可以不与其它网络配置选项(结合使用driver,driver_opts,ipam,internal)混用

    在下面的示例中,proxy是通往外部世界的网关。而不是尝试创建一个名为[projectname]_outside的网络,Compose寻找一个简单调用的现有网络outside,并将proxy服务的容器连接到它。

    version: '2'

    services:

      proxy:

        build: ./proxy

        networks:

          - outside

          - default

      app:

        build: ./app

        networks:

          - default

    networks:

      outside:

        external: true

    不支持在版本3.5中使用external.name,可使用name。

    还可以在Compose文件中与用于引用它的名称分开指定网络名称:

    networks:

      outside:

        external:

          name: actual-name-of-network

    name

    在3.5版本中添加

    为此网络设置自定义名称

    version: '3.5'

    networks:

      network1:

        name: my-app-net

    它也可以与external属性结合使用:

    version: '3.5'

    networks:

      network1:

        external: true

        name: my-app-net

    54configs配置参考configs configuration reference

    顶级configs声明定义或引用可以授予此堆栈中的服务的configs。配置的来源是file或external。

    • file:使用指定路径上的文件内容创建configs。
    • external:如果设置为true,则指定已创建的外部configs。Docker不会尝试创建它,如果它不存在,则会发生config not found错误。
    • name:Docker中configs对象的名称,3.5版本中引入。

    在此示例中,当部署堆栈时,my_first_config被创建(如<stack_name>_my_first_config),my_second_config已存在于Docker中)。

    configs:

      my_first_config:

        file: ./config_data

      my_second_config:

        external: true

    外部configs的另一个变体是Docker中的configs名称与服务中存在的名称不同。

    以下示例修改前一个示例以使用调用的外部redis_config

    configs:

      my_first_config:

        file: ./config_data

      my_second_config:

        external:

          name: redis_config

    仍然需要为堆栈中的每个服务授予对configs的访问权限。

    55secrets配置参考

    顶级secrets声明定义或引用可以授予此堆栈中的服务的secrets。secret的来源是file或external。

    • file:使用指定路径上的文件内容创建secrets。
    • external:如果设置为true,则指定已创建的外部secrets。Docker不会尝试创建它,如果它不存在,则会发生secret not found错误。
    • name:Docker中的secrets对象的名称,3.5版本引入。

    在此示例中,当部署堆栈时,my_first_secret被创建(如<stack_name>_my_first_secret),my_second_secret已存在于Docker中)。

    secrets:

      my_first_secret:

        file: ./secret_data

      my_second_secret:

        external: true

    外部secret的另一个变体是当Docker中的secrets名称与服务中存在的名称不同。

    以下示例修改前一个示例以使用调用的外部redis_secret。

    secrets:

      my_first_secret:

        file: ./secret_data

      my_second_secret:

        external:

          name: redis_secret

    仍然需要授予对堆栈中每个服务的secrets的访问权限。

    56、变量替换Variable substitution

    配置选项可以包含环境变量。Compose使用docker-compose运行的shell环境中的变量值。例如,假设shell包含POSTGRES_VERSION=9.3并提供此配置:

    db:

      image: "postgres:${POSTGRES_VERSION}"

    docker-compose up使用此配置运行时,Compose会在shell中查找环境变量POSTGRES_VERSION并将替换为其值。对于此示例,Compose在运行配置之前解析image为postgres:9.3。

    如果未设置环境变量,Compose使用空字符串替换。在上面的示例中,如果POSTGRES_VERSION未设置,则image选项的值为postgres:。

    可以使用.env文件为环境变量设置默认值(Compose会自动查找),shell环境中设置的值将覆盖.env文件中设置的值

    重要说明

    .env file功能仅在使用docker-compose up命令时才有效,对docker stack deploy不起作用。

    支持$VARIABLE和${VARIABLE}两种语法。此外,使用2.1版本时,可以使用典型的shell语法提供内联默认值:

    • ${VARIABLE:-default}环境中VARIABLE未设置或为空,变量值设为default
    • ${VARIABLE-default}只有当环境中VARIABLE未设置时,变量值才设置为default

    同样,以下语法允许指定必需变量:

    • ${VARIABLE:?err}或为空的错误消息,退出显示errif。
    • ${VARIABLE?err}只有当在环境中变量未设置时,退出显示err。

    其他扩展的shell样式功能,例如,${VARIABLE/foo/bar}不支持

    当配置需要文字$符号时,可以使用$$(双美元符号),因此$$允许引用不希望由Compose处理的环境变量。

    web:

      build: .

      command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"

    如果忘记并使用了单个美元符号($),Compose会将该值解释为环境变量并发出警告:

    未设置VAR_NOT_INTERPOLATED_BY_COMPOSE,并替换空字符串。

    57Extension fields

    在3.4版本中添加

    可以使用扩展字段重用配置片段。这些特殊字段可以是任何格式,只要它们位于Compose文件的根目录,并且它们的名称以x-字符序列开头。

    注意

    从3.7(对于3.x系列)和2.4(对于2.x系列)开始,还允许在services,volumes,networks,configs和secrets定义的根目录中使用扩展字段。

    version: '2.1'

    x-custom:

      items:

        - a

        - b

      options:

        max-size: '12m'

      name: "custom"

    Compose会忽略这些字段的内容,但可以使用YAML锚点(即&)将它们插入到资源定义中。例如,如果希望多个服务使用相同的日志记录配置:

    logging:

      options:

        max-size: '12m'

        max-file: '5'

      driver: json-file

    可以按如下方式编写Compose文件:

    version: '3.4'

    x-logging:

      &default-logging

      options:

        max-size: '12m'

        max-file: '5'

      driver: json-file

    services:

      web:

        image: myapp/web:latest

        logging: *default-logging

      db:

        image: mysql:latest

        logging: *default-logging

    也可以使用YAML合并类型部分覆盖扩展字段中的值。例如:

    version: '3.4'

    x-volumes:

      &default-volume

      driver: foobar-storage

    services:

      web:

        image: myapp/web:latest

        volumes: ["vol1", "vol2", "vol3"]

    volumes:

      vol1: *default-volume

      vol2:

        << : *default-volume

        name: volume02

      vol3:

        << : *default-volume

        driver: default

        name: volume-local

  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9716370.html
Copyright © 2011-2022 走看看