docker-compose文件語法解析(v3.x)

文件配置php

compose文件是一個定義服務(service)、網絡(network)和卷(volume)的YAML文件 。Compose 文件的默認路徑是 ./docker-compose.yml前端

提示:能夠是用 .yml 或 .yaml 做爲文件擴展名node

服務(service)定義包含應用於爲該服務啓動的每一個容器的配置,就像傳遞命令行參數給docker container create同樣。一樣,網絡和卷的定義相似於給 docker network create 和 docker volume create傳遞參數。mysql

正如 docker container create 在 Dockerfile 指定選項,如 CMD、 EXPOSE、VOLUME、ENV,在默認狀況下,不須要在docker-compose.yml中再次指定它們。linux

可使用 Bash 類 ${VARIABLE} 語法在配置值中使用環境變量。nginx

配置選項git

.bulidweb

服務除了能夠基於指定的鏡像(從docker hub中拉取),還能夠基於Dockerfile構建的鏡像,在使用 up 啓動時執行構建任務,這個構建標籤就是 build,它能夠指定 Dockerfile 所在目錄的路徑。Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像啓動服務容器redis

build: /path/to/build/dirsql

也能夠是相對路徑,當提供的值是相對路徑時,它被解釋爲相對於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:\ProgramData\Docker\。

如下示例從名爲C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json 的文件加載憑證規範 :

credential_spec:

  file: my-credential-spec.json

使用 registry: 將從守護進程主機上的 Windows 註冊表中讀取憑據規範。其註冊表值必須位於:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs

 

下面的示例經過 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

相關文章
相關標籤/搜索