Compose 構建規範
Build 是 Compose 規範的可選部分。它告訴 Compose 如何從原始碼(重新)構建應用程式,並允許你以可移植的方式在 Compose 檔案中定義構建過程。build 可以指定為定義上下文路徑的單個字串,也可以指定為詳細的構建定義。
在前一種情況下,整個路徑用作 Docker 上下文來執行 Docker 構建,並在目錄根目錄中查詢規範的 Dockerfile。路徑可以是絕對路徑或相對路徑。如果它是相對路徑,則從包含 Compose 檔案的目錄解析。如果它是絕對路徑,則該路徑會阻止 Compose 檔案的可移植性,因此 Compose 會顯示警告。
在後一種情況下,可以指定構建引數,包括備用的 Dockerfile 位置。路徑可以是絕對路徑或相對路徑。如果它是相對路徑,則從包含 Compose 檔案的目錄解析。如果它是絕對路徑,則該路徑會阻止 Compose 檔案的可移植性,因此 Compose 會顯示警告。
使用 build 和 image
當 Compose 遇到服務的 build 子部分和 image 屬性時,它遵循由 pull_policy 屬性定義的規則。
如果服務定義中缺少 pull_policy,Compose 會嘗試首先拉取映象,如果登錄檔或平臺快取中未找到該映象,則從原始碼構建。
釋出已構建映象
支援 build 的 Compose 提供了將構建映象推送到登錄檔的選項。在此過程中,它不會嘗試推送沒有 image 屬性的服務映象。Compose 會警告你缺少 image 屬性,這會阻止映象被推送。
示例說明
以下示例透過具體的示例應用程式說明了 Compose 構建規範概念。該示例是非規範性的。
services:
frontend:
image: example/webapp
build: ./webapp
backend:
image: example/database
build:
context: backend
dockerfile: ../backend.Dockerfile
custom:
build: ~/custom當用於從原始碼構建服務映象時,Compose 檔案會建立三個 Docker 映象
example/webapp:Docker 映象使用 Compose 檔案資料夾內的webapp子目錄作為 Docker 構建上下文進行構建。此資料夾中缺少Dockerfile會返回錯誤。example/database:Docker 映象使用 Compose 檔案資料夾內的backend子目錄進行構建。backend.Dockerfile檔案用於定義構建步驟,此檔案相對於上下文路徑進行搜尋,這意味著..解析為 Compose 檔案資料夾,因此backend.Dockerfile是一個同級檔案。- Docker 映象使用使用者
$HOME中的custom目錄作為 Docker 上下文進行構建。Compose 會顯示有關用於構建映象的不可移植路徑的警告。
推送時,example/webapp 和 example/database Docker 映象都會推送到預設登錄檔。custom 服務映象被跳過,因為沒有設定 image 屬性,Compose 會顯示有關此缺失屬性的警告。
屬性
build 子部分定義了 Compose 應用於從原始碼構建 Docker 映象的配置選項。build 可以指定為包含構建上下文路徑的字串,也可以指定為詳細結構。
使用字串語法時,只能將構建上下文配置為
Compose 檔案資料夾的相對路徑。此路徑必須是一個目錄,並且必須包含一個
Dockerfile。services: webapp: build: ./dirGit 儲存庫 URL。Git URL 在其片段部分接受上下文配置,用冒號 (
:) 分隔。第一部分表示 Git 檢出的引用,可以是分支、標籤或遠端引用。第二部分表示儲存庫內用作構建上下文的子目錄。services: webapp: build: https://github.com/mycompany/example.git#branch_or_tag:subdirectory
或者,build 可以是具有以下定義的欄位的物件
additional_contexts
additional_contexts 定義了映象構建器在映象構建過程中應使用的命名上下文列表。
additional_contexts 可以是對映或列表。
build:
context: .
additional_contexts:
- resources=/path/to/resources
- app=docker-image://my-app:latest
- source=https://github.com/myuser/project.gitbuild:
context: .
additional_contexts:
resources: /path/to/resources
app: docker-image://my-app:latest
source: https://github.com/myuser/project.git用作列表時,語法遵循 NAME=VALUE 格式,其中 VALUE 是一個字串。超出此範圍的驗證是映象構建器(並且是構建器特定的)的責任。Compose 至少支援目錄的絕對路徑和相對路徑以及 Git 儲存庫 URL,就像 context 一樣。其他上下文型別必須加上字首以避免與 type:// 字首產生歧義。
如果映象構建器不支援額外的上下文,Compose 會發出警告,並可能列出未使用的上下文。
有關 Buildx 中如何使用此功能的說明性示例,請參閱此處。
additional_contexts 還可以引用由另一個服務構建的映象。這允許使用另一個服務映象作為基礎映象來構建服務映象,並在服務映象之間共享層。
services:
base:
build:
context: .
dockerfile_inline: |
FROM alpine
RUN ...
my-service:
build:
context: .
dockerfile_inline: |
FROM base # image built for service base
RUN ...
additional_contexts:
base: service:baseargs
args 定義構建引數,即 Dockerfile ARG 值。
以下 Dockerfile 為例
ARG GIT_COMMIT
RUN echo "Based on commit: $GIT_COMMIT"args 可以在 Compose 檔案中的 build 鍵下設定,以定義 GIT_COMMIT。args 可以設定為對映或列表。
build:
context: .
args:
GIT_COMMIT: cdc3b19build:
context: .
args:
- GIT_COMMIT=cdc3b19在指定構建引數時可以省略值,在這種情況下,其構建時值必須透過使用者互動獲得,否則在構建 Docker 映象時不會設定構建引數。
args:
- GIT_COMMITcache_from
cache_from 定義了映象構建器應用於快取解析的源列表。
快取位置語法遵循全域性格式 [NAME|type=TYPE[,KEY=VALUE]]。簡單的 NAME 實際上是 type=registry,ref=NAME 的快捷方式。
Compose 構建實現可能支援自定義型別,Compose 規範定義了必須支援的規範型別。
registry用於從由鍵ref設定的 OCI 映象中檢索構建快取。
build:
context: .
cache_from:
- alpine:latest
- type=local,src=path/to/cache
- type=gha不支援的快取會被忽略,不會阻止你構建映象。
cache_to
cache_to 定義了用於與未來構建共享構建快取的匯出位置列表。
build:
context: .
cache_to:
- user/app:cache
- type=local,dest=path/to/cache快取目標使用與 cache_from 定義的相同的 type=TYPE[,KEY=VALUE] 語法進行定義。
不支援的快取會被忽略,不會阻止你構建映象。
context
context 定義了包含 Dockerfile 的目錄路徑,或 Git 儲存庫的 URL。
當提供的值是相對路徑時,它被解釋為相對於專案目錄。Compose 會警告你用於定義構建上下文的絕對路徑,因為這些路徑會阻止 Compose 檔案的可移植性。
build:
context: ./dirservices:
webapp:
build: https://github.com/mycompany/webapp.git如果未明確設定,context 預設為專案目錄 (.)。
dockerfile
dockerfile 設定備用 Dockerfile。相對路徑從構建上下文解析。Compose 會警告你用於定義 Dockerfile 的絕對路徑,因為它會阻止 Compose 檔案的可移植性。
設定後,不允許使用 dockerfile_inline 屬性,並且 Compose 會拒絕任何同時設定這兩個屬性的 Compose 檔案。
build:
context: .
dockerfile: webapp.Dockerfiledockerfile_inline
dockerfile_inline 將 Dockerfile 內容定義為 Compose 檔案中的內聯字串。設定後,不允許使用 dockerfile 屬性,並且 Compose 會拒絕任何同時設定這兩個屬性的 Compose 檔案。
建議使用 YAML 多行字串語法來定義 Dockerfile 內容。
build:
context: .
dockerfile_inline: |
FROM baseimage
RUN some commandentitlements
entitlements 定義了在構建期間允許的額外特權許可權。
entitlements:
- network.host
- security.insecureextra_hosts
extra_hosts 在構建時新增主機名對映。使用與 extra_hosts 相同的語法。
extra_hosts:
- "somehost=162.242.195.82"
- "otherhost=50.31.209.229"
- "myhostv6=::1"IPv6 地址可以括在方括號中,例如
extra_hosts:
- "myhostv6=[::1]"首選分隔符 =,但也可以使用 :。在 Docker Compose 2.24.1 版本中引入。例如
extra_hosts:
- "somehost:162.242.195.82"
- "myhostv6:::1"Compose 在容器的網路配置中建立與 IP 地址和主機名匹配的條目,這意味著對於 Linux,/etc/hosts 將獲得額外的行。
162.242.195.82 somehost
50.31.209.229 otherhost
::1 myhostv6isolation
isolation 指定構建的容器隔離技術。與 isolation 一樣,支援的值是平臺特定的。
labels
labels 將元資料新增到生成的映象。labels 可以設定為陣列或對映。
建議使用反向 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"網路
設定在構建期間 RUN 指令連線的網路容器。
build:
context: .
network: hostbuild:
context: .
network: custom_network_1使用 none 在構建期間停用網路。
build:
context: .
network: noneno_cache
no_cache 停用映象構建器快取,並強制所有映象層從原始碼完全重建。這僅適用於 Dockerfile 中宣告的層,只要登錄檔上的標籤已更新,就可以從本地映象儲存中檢索引用的映象(請參閱 pull)。
platforms
platforms 定義了目標 平臺 列表。
build:
context: "."
platforms:
- "linux/amd64"
- "linux/arm64"當省略 platforms 屬性時,Compose 會將服務的平臺包含在預設構建目標平臺列表中。
當定義了 platforms 屬性時,Compose 會包含服務的平臺,否則使用者將無法執行他們構建的映象。
在以下情況下,Compose 會報告錯誤
當列表中包含多個平臺,但實現無法儲存多平臺映象時。
當列表中包含不支援的平臺時。
build: context: "." platforms: - "linux/amd64" - "unsupported/unsupported"當列表非空且不包含服務的平臺時。
services: frontend: platform: "linux/amd64" build: context: "." platforms: - "linux/arm64"
privileged
privileged 配置服務映象以提升許可權進行構建。支援和實際影響是平臺特定的。
build:
context: .
privileged: trueprovenance
provenance 配置構建器將 來源證明 新增到已釋出的映象中。
該值可以是布林值以啟用/停用來源證明,也可以是 key=value 字串以設定來源配置。你可以透過設定 mode 引數來選擇要包含在來源證明中的詳細程度。
build:
context: .
provenance: truebuild:
context: .
provenance: mode=maxpull
pull 要求映象構建器拉取引用的映象(FROM Dockerfile 指令),即使這些映象已在本地映象儲存中可用。
sbom
sbom 配置構建器將 來源證明 新增到已釋出的映象中。該值可以是布林值以啟用/停用 SBOM 證明,也可以是 key=value 字串以設定 SBOM 生成器配置。這允許你選擇備用的 SBOM 生成器映象(請參閱 https://github.com/moby/buildkit/blob/master/docs/attestations/sbom-protocol.md)。
build:
context: .
sbom: truebuild:
context: .
sbom: generator=docker/scout-sbom-indexer:latest # Use an alternative SBOM generatorsecrets
secrets 授予對按服務構建定義的 secrets 敏感資料的訪問許可權。支援兩種不同的語法變體:短語法和長語法。
如果秘密未在此 Compose 檔案的 secrets 部分中定義,Compose 會報告錯誤。
短語法
短語法變體僅指定秘密名稱。這授予容器對秘密的訪問許可權,並將其作為只讀檔案掛載到容器內的 /run/secrets/<secret_name>。源名稱和目標掛載點都設定為秘密名稱。
以下示例使用短語法授予 frontend 服務的構建訪問 server-certificate 秘密的許可權。server-certificate 的值設定為檔案 ./server.cert 的內容。
services:
frontend:
build:
context: .
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert長語法
長語法提供了更精細的控制,用於在服務的容器中建立秘密。
source:秘密在平臺上的名稱。target:Dockerfile 中宣告的秘密 ID。如果未指定,則預設為source。uid和gid:服務任務容器中/run/secrets/中檔案的數字 uid 或 gid。預設值為USER。mode:服務任務容器中/run/secrets/中要掛載的檔案的許可權,以八進位制表示。預設值為全域性可讀許可權(模式0444)。如果設定了可寫位,則必須忽略。可執行位可以設定。
以下示例將 server-certificate 秘密檔名在容器內設定為 server.crt,將模式設定為 0440(組可讀),並將使用者和組設定為 103。server-certificate 秘密的值由平臺透過查詢提供,秘密生命週期不由 Compose 直接管理。
services:
frontend:
build:
context: .
secrets:
- source: server-certificate
target: cert # secret ID in Dockerfile
uid: "103"
gid: "103"
mode: 0440
secrets:
server-certificate:
external: true# Dockerfile
FROM nginx
RUN --mount=type=secret,id=cert,required=true,target=/root/cert ...服務構建可以獲得對多個秘密的訪問許可權。秘密的長語法和短語法可以在同一個 Compose 檔案中使用。在頂級 secrets 中定義秘密不應意味著授予任何服務構建訪問該秘密的許可權。此類授予必須在服務規範中明確宣告為 secrets 服務元素。
ssh
ssh 定義了映象構建器在映象構建過程中應使用的 SSH 認證(例如,克隆私有儲存庫)。
ssh 屬性語法可以是以下之一
default:讓構建器連線到 SSH 代理。ID=path:ID 及其關聯路徑的鍵/值定義。它可以是 PEM 檔案,也可以是 SSH 代理套接字的路徑。
build:
context: .
ssh:
- default # mount the default SSH agent或
build:
context: .
ssh: ["default"] # mount the default SSH agent使用自定義 ID myproject 和本地 SSH 金鑰的路徑。
build:
context: .
ssh:
- myproject=~/.ssh/myproject.pem映象構建器隨後可以依靠此在構建期間掛載 SSH 金鑰。
為了說明,SSH 掛載 可用於透過 ID 掛載 SSH 金鑰並訪問受保護資源。
RUN --mount=type=ssh,id=myproject git clone ...
shm_size
shm_size 設定為構建 Docker 映象分配的共享記憶體大小(Linux 上的 /dev/shm 分割槽)。指定為表示位元組數的整數值或表示位元組值的字串。
build:
context: .
shm_size: '2gb'build:
context: .
shm_size: 10000000tags
tags 定義了必須與構建映象關聯的標籤對映列表。此列表是服務部分中定義的 image 屬性的補充。
tags:
- "myimage:mytag"
- "registry/username/myrepos:my-other-tag"target
target 定義了在多階段 Dockerfile 中定義的要構建的階段。
build:
context: .
target: produlimits
ulimits 覆蓋容器的預設 ulimits。它指定為單個限制的整數或軟/硬限制的對映。
services:
frontend:
build:
context: .
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000