services:
redis:
image: redis:latest
configs:
- source: my_config
target: /redis_config
uid: "103"
gid: "103"
mode: 0440
configs:
my_config:
external: true
my_other_config:
external: true
container_name
是一個字串,用於指定自訂容器名稱,而不是預設產生的名稱。
如果 Compose 檔案指定了 container_name
,Compose 不會將服務擴展到超過一個容器。嘗試這樣做會導致錯誤。
container_name
遵循 [a-zA-Z0-9][a-zA-Z0-9_.-]+
的正規表達式格式。
credential_spec
設定受管服務帳戶的憑證規格。
如果您有使用 Windows 容器的服務,則可以將 file:
和 registry:
協定用於 credential_spec
。Compose 也支援其他協定以用於自訂用例。
credential_spec
必須採用 file://<filename>
或 registry://<value-name>
的格式。
使用 registry:
時,會從守護行程主機上的 Windows 註冊表讀取憑證規格。具有給定名稱的註冊表值必須位於
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
以下範例從註冊表中名為 my-credential-spec
的值載入憑證規格
為服務設定 gMSA 憑證規格時,您只需使用 config
指定憑證規格,如下例所示
使用 depends_on
屬性,您可以控制服務啟動和關閉的順序。如果服務緊密耦合,且啟動順序會影響應用程式的功能,則此屬性很有用。
簡短語法變體僅指定相依服務的名稱。服務相依性會導致以下行為
簡單範例
Compose 保證在啟動相依服務之前已啟動相依服務。Compose 會等待相依服務「就緒」後再啟動相依服務。
完整語法允許設定簡短格式無法表示的其他欄位。
restart
:設定為 true
時,Compose 會在更新相依服務後重新啟動此服務。這適用於由 Compose 作業控制的顯式重新啟動,但不包括容器在終止後由容器運行時自動重新啟動。Docker Compose 版本 2.17.0 引進的功能。
condition
:設定將相依性視為已滿足的條件
service_started
:等同於上述簡短語法service_healthy
:指定一個依賴服務在啟動其相依服務之前,必須處於「健康」狀態(由健康檢查指示)。service_completed_successfully
:指定一個依賴服務必須成功完成運行,才能啟動其相依服務。
required
:當設為 false
時,Compose 只會在依賴服務未啟動或不可用時發出警告。如果未定義,則 required
的預設值為 true
。此功能於 Docker Compose 版本 2.20.0 中引入。
服務依賴關係會導致以下行為
Compose 按相依性順序建立服務。在以下範例中,db
和 redis
會在 web
之前建立。
Compose 會等待標記為 service_healthy
的依賴服務通過健康檢查。在以下範例中,db
必須處於「健康」狀態,才能建立 web
。
Compose 按相依性順序移除服務。在以下範例中,web
會在 db
和 redis
之前移除。
Compose 保證在啟動相依服務之前,先啟動依賴服務。Compose 保證在啟動相依服務之前,標記為 service_healthy
的依賴服務處於「健康」狀態。
deploy
指定服務的部署和生命週期配置,如 Compose 部署規範 中所定義。
此功能於 Docker Compose 版本 2.22.0 中引入 develop
指定用於維護容器與程式碼同步的開發配置,如 開發章節 中所定義。
device_cgroup_rules
定義此容器的設備 cgroup 規則清單。格式與 Linux 核心在 控制群組設備白名單控制器 中指定的格式相同。
devices
以 HOST_PATH:CONTAINER_PATH[:CGROUP_PERMISSIONS]
的形式定義已建立容器的設備映射清單。
dns
定義要在容器網路介面配置上設定的自訂 DNS 伺服器。它可以是單一值或清單。
dns_opt
列出自訂 DNS 選項,要傳遞給容器的 DNS 解析器(Linux 上的 /etc/resolv.conf
檔案)。
dns_search
定義要在容器網路介面配置上設定的自訂 DNS 搜尋網域。它可以是單一值或清單。
domainname
宣告用於服務容器的自訂網域名稱。它必須是有效的 RFC 1123 主機名稱。
此功能於 Docker Compose 版本 2.27.1 中引入 driver_opts
指定要傳遞給驅動程式的選項清單,以鍵值對的形式表示。這些選項取決於驅動程式。
請參閱 網路驅動程式文件 以取得更多資訊。
entrypoint
宣告服務容器的預設進入點。這會覆寫服務 Dockerfile 中的 ENTRYPOINT
指令。
如果 entrypoint
不是 null,Compose 會忽略映像檔中的任何預設命令,例如 Dockerfile 中的 CMD
指令。
另請參閱 command
以設定或覆寫進入點程序要執行的預設命令。
在其簡短形式中,值可以定義為字串
或者,值也可以是清單,其方式類似於 Dockerfile 的 CMD
指令。
如果值為 null
,則使用映像檔中的預設進入點。
如果值為 []
(空清單)或 ''
(空字串),則忽略映像檔宣告的預設進入點,也就是覆寫為空。
env_file
屬性用於指定一個或多個包含要傳遞給容器的環境變數的檔案。
相對路徑會從 Compose 檔案的父資料夾解析。由於絕對路徑會導致 Compose 檔案無法移植,因此當使用絕對路徑設定 env_file
時,Compose 會發出警告。
環境 章節中宣告的環境變數會覆寫這些值。即使這些值為空或未定義,也是如此。
env_file
也可以是清單。清單中的檔案會由上而下處理。對於在兩個環境變數檔案中指定的相同變數,以清單中最後一個檔案的值為準。
清單元素也可以宣告為映射,這樣就可以設定其他屬性。
此功能於 Docker Compose 版本 2.24.0 中引入 required
屬性預設為 true
。當 required
設為 false
且 .env
檔案遺失時,Compose 會靜默忽略該項目。
此功能於 Docker Compose 版本 2.30.0 中引入 format
屬性允許您對 env_file
使用替代檔案格式。如果未設定,則會根據 Env_file 格式 中概述的 Compose 規則剖析 env_file
。
raw
格式允許您使用具有鍵=值項目的 env_file
,但 Compose 不會嘗試剖析值以進行插值。這讓您可以按原樣傳遞值,包括引號和 $
符號。
.env
檔案中的每一行都必須採用 VAR[=[VAL]]
格式。適用以下語法規則
- 以
#
開頭的行會被視為註釋並忽略。 - 空行會被忽略。
- 未加引號和雙引號 (
"
) 的值會套用 插值。 - 每一行代表一個鍵值對。值可以選擇性地加上引號。
VAR=VAL
-> VAL
VAR="VAL"
-> VAL
VAR='VAL'
-> VAL
- 未加引號的值的內嵌註釋前面必須加上空格。
VAR=VAL # 註釋
-> VAL
VAR=VAL# 不是註解
-> VAL# 不是註解
- 引用值的內嵌註解必須跟在結尾引號之後。
VAR="VAL # 不是註解"
-> VAL # 不是註解
VAR="VAL" # 註解
-> VAL
- 單引號 (
'
) 值會被原樣使用。VAR='$OTHER'
-> $OTHER
VAR='${OTHER}'
-> ${OTHER}
- 引號可以使用
\
跳脫。VAR='Let\'s go!'
-> Let's go!
VAR="{\"hello\": \"json\"}"
-> {"hello": "json"}
- 常見的 shell 跳脫序列,包括
\n
、\r
、\t
和 \\
,在雙引號值中都支援。VAR="some\tvalue"
-> some value
VAR='some\tvalue'
-> some\tvalue
VAR=some\tvalue
-> some\tvalue
VAL
可以省略,這種情況下變數值為空字串。 =VAL
可以省略,這種情況下變數未設定。
environment
屬性定義在容器中設定的環境變數。 environment
可以使用陣列或映射。任何布林值;true、false、yes、no,都應該用引號括起來,以確保它們不會被 YAML 解析器轉換為 True 或 False。
環境變數可以由單一鍵值宣告(沒有等號的值)。在這種情況下,Compose 依賴您來解析值。如果值未解析,則變數未設定並從服務容器環境中移除。
映射語法
陣列語法
當服務同時設定了 env_file
和 environment
時,environment
設定的值具有優先權。
expose
定義 Compose 從容器暴露的(輸入)埠或埠範圍。這些埠必須可供連結的服務存取,並且不應發佈到主機。只能指定內部容器埠。
語法為 <portnum>/[<proto>]
或 <startport-endport>/[<proto>]
(適用於埠範圍)。未明確設定時,使用 tcp
協定。
**注意**
如果映像檔的 Dockerfile 已經暴露了埠,則即使 Compose 檔案中沒有設定 expose
,其他容器在網路上也能看到它。
extends
讓您可以在不同的檔案,甚至完全不同的專案之間共享通用配置。使用 extends
,您可以在一個地方定義一組通用的服務選項,並從任何地方引用它。您可以參考另一個 Compose 檔案並選擇您也想在自己的應用程式中使用的服務,並能夠根據自己的需求覆蓋某些屬性。
您可以在任何服務上將 extends
與其他配置鍵一起使用。 extends
值必須是使用必要的 service
鍵和可選的 file
鍵定義的映射。
service
:定義被參考作為基礎的服務的名稱,例如 web
或 database
。file
:定義該服務的 Compose 配置檔案的位置。
當服務使用 extends
時,它也可以指定對其他資源的依賴關係,例如明確的 volumes
宣告。但是,請務必注意,extends
並不會自動將目標磁碟區定義併入擴展的 Compose 檔案中。相反,您有責任確保存在等效的資源以供擴展的服務使用,以保持一致性。Docker Compose 會驗證 Compose 模型中是否存在具有參考 ID 的資源。
extends
目標中對其他資源的依賴關係可以是
- 透過
volumes
、networks
、configs
、secrets
、links
、volumes_from
或 depends_on
的明確參考 - 在命名空間宣告 (
ipc
、pid
、network_mode
) 中使用 service:{name}
語法參考另一個服務
不支援 extends
的循環參考,Compose 在偵測到循環參考時會傳回錯誤。
file
值可以是
- 不存在。這表示正在參考同一個 Compose 檔案中的另一個服務。
- 檔案路徑,可以是
- 相對路徑。此路徑被視為相對於主 Compose 檔案的位置。
- 絕對路徑。
service
表示的服務必須存在於已識別的參考 Compose 檔案中。如果出現以下情況,Compose 會傳回錯誤:
- 找不到
service
表示的服務。 - 找不到
file
表示的 Compose 檔案。
兩個服務定義(目前 Compose 檔案中的主要定義和 extends
指定的參考定義)按以下方式合併:
- 映射:主要服務定義中映射的鍵值會覆蓋參考服務定義中映射的鍵值。未被覆蓋的鍵值會按原樣包含。
- 序列:項目會組合成一個新的序列。元素的順序會保留,參考項目在前,主要項目在後。
- 純量:主要服務定義中的鍵值優先於參考定義中的鍵值。
以下鍵值應被視為映射:annotations
、build.args
、build.labels
、build.extra_hosts
、deploy.labels
、deploy.update_config
、deploy.rollback_config
、deploy.restart_policy
、deploy.resources.limits
、environment
、healthcheck
、labels
、logging.options
、sysctls
、storage_opt
、extra_hosts
、ulimits
。
適用於 healthcheck
的一個例外是,主要映射不能指定 disable: true
,除非參考映射也指定 disable: true
。否則 Compose 會傳回錯誤。
例如,以下輸入
會為 cli
服務產生以下配置。如果使用陣列語法,則會產生相同的輸出。
blkio_config.device_read_bps
、blkio_config.device_read_iops
、blkio_config.device_write_bps
、blkio_config.device_write_iops
、devices
和 volumes
下的項目也被視為映射,其中鍵值是容器內的路徑。
例如,以下輸入
會為 cli
服務產生以下配置。請注意,掛載路徑現在指向新的磁碟區名稱,並且套用了 ro
旗標。
如果參考服務定義包含 extends
映射,則其下的項目會被簡單地複製到新的合併定義中。然後再次啟動合併程序,直到沒有剩餘的 extends
鍵值為止。
例如,以下輸入
會為 cli
服務產生以下配置。這裡,cli
服務從 common
服務取得 user
鍵值,而 common
服務又從 base
服務取得此鍵值。
以下鍵值應被視為序列:cap_add
、cap_drop
、configs
、deploy.placement.constraints
、deploy.placement.preferences
、deploy.reservations.generic_resources
、device_cgroup_rules
、expose
、external_links
、ports
、secrets
、security_opt
。合併產生的任何重複項都會被移除,以便序列僅包含唯一元素。
例如,以下輸入
會為 cli
服務產生以下配置。
如果使用列表語法,以下鍵也應被視為序列:dns
、dns_search
、env_file
、tmpfs
。與上述序列欄位不同,合併產生的重複項不會被移除。
服務定義中任何其他允許的鍵都應被視為純量值。
external_links
將服務容器連結到 Compose 應用程式外部管理的服務。 external_links
定義要使用平台查找機制檢 retrieval 的現有服務的名稱。可以指定格式為 SERVICE:ALIAS
的別名。
extra_hosts
將主機名稱映射新增到容器網路介面配置(Linux 的 /etc/hosts
)。
簡短語法在列表中使用純文字字串。值必須以 HOSTNAME=IP
的形式設定其他主機的主機名稱和 IP 位址。
IPv6 位址可以用方括號括起來,例如
分隔符號 =
是首選,但也可以使用 :
。在 Docker Compose 版本 2.24.1 中引入。例如
或者,extra_hosts
可以設定為主機名稱和 IP 之間的映射
Compose 在容器的網路配置中建立具有 IP 位址和主機名稱的匹配項目,這表示 Linux 的 /etc/hosts
會新增額外的行
group_add
指定容器內使用者必須是其成員的額外群組,可以通過名稱或數字指定。
一個有用的例子是當多個容器(以不同使用者身分執行)需要在共享卷上讀取或寫入同一個檔案時。該檔案可以由所有容器共享的群組擁有,並在 group_add
中指定。
在建立的容器內執行 id
必須顯示使用者屬於 mail
群組,如果未聲明 group_add
,則情況並非如此。
healthcheck
屬性宣告了一個檢查,用於判斷服務容器是否「健康」。它的工作方式與服務的 Docker 映像檔設定的 HEALTHCHECK Dockerfile 指令集相同,並且具有相同的預設值。您的 Compose 檔案可以覆寫 Dockerfile 中設定的值。
有關 HEALTHCHECK
的更多資訊,請參閱 Dockerfile 參考。
interval
、timeout
、start_period
和 start_interval
指定為持續時間。在 Docker Compose 版本 2.20.2 中引入。
test
定義 Compose 執行以檢查容器健康狀況的指令。它可以是字串或列表。如果是列表,第一個項目必須是 NONE
、CMD
或 CMD-SHELL
。如果是字串,則相當於指定 CMD-SHELL
後跟該字串。
使用 CMD-SHELL
使用容器的預設 shell(Linux 的 /bin/sh
)以字串形式執行配置的指令。以下兩種形式是等效的
NONE
禁用健康檢查,主要用於禁用服務的 Docker 映像檔設定的 Healthcheck Dockerfile 指令。或者,可以通過設定 disable: true
來禁用映像檔設定的健康檢查。
hostname
宣告用於服務容器的自訂主機名稱。它必須是有效的 RFC 1123 主機名稱。
image
指定啟動容器的映像檔。 image
必須遵循 Open Container Specification 可定址映像檔格式,如 [<registry>/][<project>/]<image>[:<tag>|@<digest>]
。
如果平台上不存在該映像檔,Compose 會嘗試根據 pull_policy
拉取它。如果您還使用了 Compose 建置規格,則可以使用其他選項來控制拉取優先於從來源建置映像檔的順序,但是拉取映像檔是預設行為。
只要宣告了 build
區段,就可以從 Compose 檔案中省略 image
。如果您未使用 Compose 建置規格,如果 Compose 檔案中缺少 image
,Compose 將無法正常工作。
init
在容器內執行一個 init 進程(PID 1),用於轉發訊號和回收進程。將此選項設定為 true
可為服務啟用此功能。
使用的 init 二進制檔案是特定於平台的。
ipc
配置服務容器設定的 IPC 隔離模式。
shareable
:為容器提供其專用的 IPC 命名空間,並可以與其他容器共享。service:{name}
:使容器加入另一個容器的(shareable
)IPC 命名空間。
isolation
指定容器的隔離技術。支援的值是特定於平台的。
labels
將中繼資料新增到容器。您可以使用陣列或映射。
建議您使用反向 DNS 標記法,以防止您的標籤與其他軟體使用的標籤衝突。
Compose 使用規範標籤建立容器
com.docker.compose.project
設定在 Compose 建立的所有資源上,設定為使用者專案名稱com.docker.compose.service
設定在服務容器上,服務名稱定義在 Compose 檔案中
com.docker.compose
標籤前綴是保留的。在 Compose 檔案中指定帶有此前綴的標籤會導致執行階段錯誤。
links
定義到另一個服務中容器的網路連結。指定服務名稱和連結別名 (SERVICE:ALIAS
),或者只指定服務名稱。
連結服務的容器可以在與別名相同的主機名稱,或者如果未指定別名,則在服務名稱的主機名稱上訪問。
不需要連結來啟用服務之間的通訊。未設定特定網路配置時,任何服務都可以在 `default` 網路上以該服務的名稱連線到任何其他服務。如果服務確實宣告了它們所連接的網路,則 `links` 不會覆蓋網路配置,並且未連接到共享網路的服務將無法通訊。Compose 不會警告您配置不匹配。
連結也以與 depends_on 相同的方式表達服務之間的隱式依賴關係,因此它們決定了服務啟動的順序。
logging
定義服務的日誌記錄配置。
driver
指定服務容器的日誌驅動程式。預設值和可用值會因平台而異。可以使用 options
以鍵值對的形式設定特定驅動程式的選項。
適用於 Docker Compose 2.24.0 及更高版本。
mac_address
設定服務容器的 MAC 地址。
**注意**
容器執行環境可能拒絕此值(例如 Docker Engine >= v25.0)。在此情況下,您應該改用 networks.mac_address。
mem_limit
設定容器可以分配的記憶體量上限,設定為表示 位元組值 的字串。
設定時,mem_limit
必須與 部署規範 中的 limits.memory
屬性一致。
mem_reservation
設定容器可以分配的記憶體量保留值,設定為表示 位元組值 的字串。
設定時,mem_reservation
必須與 部署規範 中的 reservations.memory
屬性一致。
mem_swappiness
定義主機核心將容器使用的匿名記憶體頁面交換出去的百分比值,介於 0 到 100 之間。
0
:關閉匿名頁面交換。100
:將所有匿名頁面設定為可交換。
預設值會因平台而異。
memswap_limit
定義容器允許交換到磁碟的記憶體量。這是一個修飾符屬性,僅在同時設定了 memory
時才有意義。使用交換允許容器在耗盡所有可用記憶體時將超出記憶體需求寫入磁碟。對於經常將記憶體交換到磁碟的應用程式,會產生效能損失。
- 如果
memswap_limit
設定為正整數,則必須同時設定 memory
和 memswap_limit
。memswap_limit
表示可以使用的記憶體和交換的總量,而 memory
控制非交換記憶體使用的量。因此,如果 memory
="300m" 且 memswap_limit
="1g",則容器可以使用 300m 的記憶體和 700m (1g - 300m) 的交換空間。 - 如果
memswap_limit
設定為 0,則該設定將被忽略,並將該值視為未設定。 - 如果
memswap_limit
設定為與 memory
相同的值,且 memory
設定為正整數,則容器無法存取交換空間。 - 如果未設定
memswap_limit
,但設定了 memory
,則如果主機容器已設定交換記憶體,則容器可以使用與 memory
設定一樣多的交換空間。例如,如果 memory
="300m" 且未設定 memswap_limit
,則容器總共可以使用 600m 的記憶體和交換空間。 - 如果
memswap_limit
明確設定為 -1,則容器可以使用無限的交換空間,最多可達主機系統上的可用量。
network_mode
設定服務容器的網路模式。
none
:關閉所有容器網路。host
:使容器可以直接存取主機的網路介面。service:{name}
:透過參考其服務名稱,使容器可以存取指定的容器。container:{name}
:透過參考其容器 ID,使容器可以存取指定的容器。
有關容器網路的更多資訊,請參閱 Docker Engine 文件。
設定時,不允許使用 networks
屬性,Compose 將拒絕任何同時包含這兩個屬性的 Compose 檔案。
networks
屬性定義服務容器連接到的網路,參考 networks
頂層元素下的項目。networks
屬性有助於管理容器的網路層面,控制服務如何在 Docker 環境中進行分段和互動。此屬性用於指定該服務的容器應連接到哪些網路。這對於定義容器之間以及與外部的通訊方式非常重要。
有關 networks
頂層元素的更多資訊,請參閱 網路。
aliases
宣告服務在網路上的替代主機名稱。同一網路上的其他容器可以使用服務名稱或別名來連接到該服務的其中一個容器。
由於 aliases
是網路範圍的,因此同一服務可以在不同的網路上具有不同的別名。
**注意**
網路範圍的別名可以由多個容器,甚至多個服務共用。如果是這樣,則無法保證名稱解析到哪個容器。
在以下範例中,服務 frontend
能夠在 back-tier
網路上透過主機名稱 backend
或 database
連接到 backend
服務。服務 monitoring
能夠在 admin
網路上透過 backend
或 mysql
連接到相同的 backend
服務。
加入網路時,為服務容器指定靜態 IP 地址。
頂層網路區段 中的相應網路設定必須具有 ipam
屬性,其中包含涵蓋每個靜態地址的子網路設定。
link_local_ips
指定鏈路本地 IP 列表。鏈路本地 IP 是屬於眾所周知子網路的特殊 IP,完全由操作員管理,通常取決於部署它們的架構。
範例
Docker Compose 2.23.2 版引入 mac_address
設定服務容器連接到此特定網路時使用的 MAC 地址。
priority
指示 Compose 將服務的容器連接到其網路的順序。如果未指定,則預設值為 0。
在以下範例中,app 服務首先連接到 app_net_1
,因為它具有最高優先順序。然後它連接到 app_net_3
,再連接到使用預設優先順序值 0 的 app_net_2
。
如果設定了 oom_kill_disable
,Compose 將設定平台,使其在記憶體不足的情況下不會終止容器。
oom_score_adj
調整平台在記憶體不足的情況下終止容器的偏好。值必須在 -1000 到 1000 的範圍內。
pid
設定 Compose 建立的容器的 PID 模式。支援的值會因平台而異。
pids_limit
調整容器的 PID 限制。設定為 -1 表示無限制的 PID。
設定時,pids_limit
必須與 部署規範 中的 pids
屬性一致。
platform
定義服務容器在其上運行的目標平台。它使用 os[/arch[/variant]]
語法。
os
、arch
和 variant
的值必須符合 OCI Image Spec 所使用的慣例。
Compose 使用此屬性來決定要提取哪個版本的映像檔,以及/或在哪个平台上執行服務的建置。
ports
用於定義主機與容器之間的連接埠映射。這對於允許外部存取容器內執行的服務至關重要。可以使用簡短語法進行簡單的連接埠映射,或使用包含通訊協定類型和網路模式等額外選項的長語法來定義。
**注意**
連接埠映射不得與 network_mode: host
一起使用,否則會發生執行階段錯誤。
簡短語法是以冒號分隔的字串,用於設定主機 IP、主機連接埠和容器連接埠,格式如下:
[HOST:]CONTAINER[/PROTOCOL]
,其中
HOST
為 [IP:](port | range)
CONTAINER
為 port | range
PROTOCOL
用於將連接埠限制為指定的通訊協定。 規範定義了 tcp
和 udp
值,Compose 支援特定平台的通訊協定名稱。
如果未設定主機 IP,則會綁定到所有網路介面。連接埠可以是單一值或範圍。主機和容器必須使用相同的範圍。
可以指定兩個連接埠 (HOST:CONTAINER
),或只指定容器連接埠。在後一種情況下,容器執行階段會自動分配主機上任何未分配的連接埠。
HOST:CONTAINER
應始終指定為(帶引號的)字串,以避免與 yaml base-60 浮點數