如何寫docker-compose.yml,Docker compose file 參考文件
Compose 檔案是一個YAML檔案,用於定義services
、netword
和volumes
。 Compose 檔案的預設路徑為./docker-compose.yml
(字尾為.yml和.yaml都可以)。
一個service
配置將會應用到容器的啟動中,很像將命令列引數傳遞給docker run
。 同樣,network和volume定義類似於docker network create
和docker volume create
。 與Docker執行一樣,預設情況下尊重Dockerfile中指定的選項(例如CMD
,EXPOSE
,VOLUME
,ENV
) - 您不需要在docker-compose.yml
您可以在配置中使用具有類似Bash的${VARIABLE}
語法使用環境變數 - 有關詳細資訊,請參閱Variable substitution。
Service 配置參考
注意
:有多個版本的Compose檔案格式 - 版本1(舊版格式,不支援卷或網路)和版本2以及2.1(最新的)。 有關更多資訊,請參閱版[Versioning]部分。
此部分包含服務定義支援的所有配置選項的列表。
build
在構建時應用的配置選項。
build
可以指定為包含構建上下文路徑,也可以根據上下文選擇 dockerfile 和 args 指定的路徑物件。
build: ./dir build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
如果指定image
欄位來build
,則Compose
使用image
中指定的webapp
和tag
(可選)命名構建的image
:
build: ./dir
image: webapp:tag
這裡從./dir
構建了一個映象名為webapp
,並打上標記為tag
的映象。
注意
:在版本1檔案格式中,build有兩種不同的方法:
- 只允許字串形式(build:.) - 而不是物件形式。
- 不允許與
image
一起build
。 嘗試這樣做會導致錯誤。
context
版本2及以上使用,版本1只使用build。
它的值可以是Dockerfile
git
倉庫的url。
當提供的值是相對路徑時,它被解釋Compose檔案位置的相對路徑。 目錄裡的資訊會被當做構建內容 傳送到Docker守護程序。
Compose將使用生成的名字build
和tag
它,然後使用該image
。
build:
context: ./dir
dockerfile
備用Dockerfile。
撰寫將使用一個備用檔案來構建。 還必須指定構建路徑。
build:
context: .
dockerfile: Dockerfile-alternate
注意
:在版本1檔案格式中,dockerfile有兩種不同的方法:
- 它與build同級出現,而不是子選項:
build: . dockerfile: Dockerfile-alternate
- 不允許與image一起使用dockerfile。 嘗試這樣做會導致錯誤。
args
支援版本2及以上
新增構建引數,它們是隻有在構建過程中才可訪問的環境變數。
首先,在Dockerfile中指定引數:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
然後,指定build
欄位下的引數args
。您可以mapping或list:
build:
context: .
args:
buildno: 1
password: secret
build:
context: .
args:
- buildno=1
- password=secret
指定build引數時,可以忽略該值,在這種情況下,構建時其值為執行Compose的環境中的值。
args:
- buildno
- password
注意
:YAML布林值(true,false,yes,no,on,off)必須用引號引起來,以便解析器將其解釋為字串。
cap_add, cap_drop
新增或刪除容器功能。 有關完整列表,請參閱man 7功能。
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
command
覆蓋預設命令
command: bundle exec thin -p 3000
該命令也可以是一個list,在方式類似於dockerfile:
command: [bundle, exec, thin, -p, 3000]
cgroup_parent
為容器指定可選的父cgroup。
cgroup_parent: m-executor-abcd
container_name
指定自定義容器名稱,而不是生成的預設名稱。
container_name: my-web-container
由於Docker容器名稱必須是唯一的,因此如果您指定了自定義名稱,則無法將服務擴充套件到1個容器之外。 嘗試這樣做會導致錯誤。
devices
裝置對映列表。 使用與--device
docker client create選項相同的格式。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
depends_on
Express之間的依賴關係,有兩個效果:
docker-compose up
將按照依賴順序啟動服務。 在下面的示例中,db和redis將在web之前啟動。docker-compose up SERVICE
將自動包含SERVICE的依賴關係。 在以下示例中,docker-compose up web也將建立並啟動db和redis。
列子:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意
:在啟動web之前,depends_on不會等待db和redis“就緒”,直到它們被啟動。 如果您需要等待服務準備就緒,請參閱控制啟動順序瞭解有關此問題的更多資訊以及解決問題的策略。
dns
自定義DNS伺服器。可以是單個值或列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
自定義DNS搜尋域。可以是單個值或列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
tmpfs
在容器中安裝臨時檔案系統。可以是單個值或列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
entrypoint
覆蓋預設的entrypoint
。
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
env_file
從檔案新增環境變數。可以是單個值或列表。
如果已使用docker-compose -f FILE
指定了一個Compose檔案,則env_file
中的路徑相對於該檔案所在的目錄。
在環境中指定的環境變數會覆蓋這些值。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
Compose期望env檔案中的每一行都處於VAR = VAL
格式。 以#開頭的行(即註釋)將被忽略,空行也是如此。
# Set Rails/Rack environment
RACK_ENV=development
注意
:如果您的service指定了build選項,則在build過程中將不會自動顯示環境檔案中定義的變數。 使用build的args子選項來定義構建時環境變數。
environment
新增環境變數。您可以使用陣列或字典。 任意布林值:true,false,yes no,需要用引號括起來,以確保它們不會被YML解析器轉換為True或False。
只有一個鍵的環境變數被解析為它在Compose正在執行的機器上的值,這對於secret或host-specific values是有幫助的。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
注意
:如果您的服務指定了build選項,則在build期間將不會自動顯示在環境中定義的變數。 使用build的args子選項來定義構建時環境變數。
expose
公開埠,而不將其釋出到主機 - 它們只能訪問連結服務。只能指定內部埠。
expose:
- "3000"
- "8000"
extends
在當前檔案或另一個檔案中擴充套件另一個服務,可選地覆蓋配置。
您可以將extends
與其他配置欄位一起使用。 extends
值必須是使用必需的server
和可選file
欄位定義的字典。
extends:
file: common.yml
service: webapp
server
正在擴充套件的服務的名稱,例如web
或資料庫。 該檔案是定義該服務的Compose配置檔案的位置。
如果省略file
Compose在當前檔案中查詢服務配置。 file
值可以是絕對路徑或相對路徑。 如果指定相對路徑,則Compose將其視為相對於當前檔案的位置。
您可以擴充套件本身擴充套件其他服務。 您可以無限期地延長。 Compose不支援迴圈引用,如果遇到一個,docker-compose會返回一個錯誤。
有關擴充套件的更多資訊,請參閱擴充套件文件。
external_links
連結到在docker-compose.yml
外部啟動的容器,甚至在Compose之外,特別是對於提供共享或公共服務的容器。 external_links
在指定容器名稱和連結別名(CONTAINER:ALIAS
)時遵循類似於links
的語義。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
注意
:如果您使用的是版本2檔案格式,則外部建立的容器必須連線到至少一個與連結到它們的服務相同的網路。
extra_hosts
新增主機名對映。使用與docker client --add-host
引數相同的值。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
具有ip地址和主機名的條目將在此服務的容器中的/etc/hosts
中建立,例如:
162.242.195.82 somehost
50.31.209.229 otherhost
group_add
指定容器中的使用者將成為其成員的其他組(按名稱或號碼)。 組必須存在於要新增的容器和主機系統中。 這是有用的一個例子是當多個容器(作為不同的使用者執行)需要在主機系統上讀取或寫入相同的檔案。 該檔案可以由所有容器共享的組擁有,並在group_add
中指定。 有關更多詳細資訊,請參閱Docker文件。
version: '2'
services:
image: alpine
group_add:
- mail
在建立的容器中執行id
將顯示使用者屬於mail
組,如果未使用group_add
,則不會是這種情況。
image
指定要從中啟動容器的映像。可以是儲存庫/標記或部分影象ID。
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果image不存在,Compose會嘗試拉取它,除非你也指定了build,在這種情況下,它使用指定的選項構建它,並用指定的標籤標記它。
注意
:在版本1檔案格式中,不允許與image一起使用build。 嘗試這樣做會導致錯誤。
isolation
Added in version 2.1 file format. 指定容器的隔離技術。在Linux上,唯一支援的值為
default
。 在Windows上,可接受的值為default
,process
和hyperv
。 有關詳細資訊,請參閱Docker Engine文件。
labels
使用Docker labels向容器新增元資料。 您可以使用list或mapping。
建議您使用reverse-DNS符號來防止您的標籤與其他軟體使用的標籤衝突。
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"
links
連結到另一個服務中的容器。請指定服務名稱和連結別名(SERVICE:ALIAS
),或僅指定服務名稱。
web:
links:
- db
- db:database
- redis
如果未指定別名,則可以在與別名相同的主機名或服務名稱處訪問連結服務的容器。
連結也以與depends_on相同的方式表示服務之間的依賴關係,因此它們確定服務啟動的順序。
注意
:如果您定義連結和networks,則具有它們之間的連結的服務必須共享至少一個公共網路以便進行
logging
Version 2 file format and up. In version 1, use log_driver and log_opt.
記錄服務的配置。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver
名稱指定了服務容器的日誌驅動程式,,如docker執行的--log-driver
選項(documented here)。
預設值為json-file。
driver: "json-file"
driver: "syslog"
driver: "none"
注意
:只有json-file
和journald
驅動程式使日誌可以直接從docker-compose up
和docker-compose logs
獲取。 使用任何其他驅動程式將不會列印任何日誌。
使用options
鍵為記錄驅動程式指定日誌記錄選項,例如docker run
的--log-opt
選項。
日誌記錄選項是key-value
對。 syslog
選項的示例:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
log_driver
Version 1 file format only. In version 2, use logging.
指定日誌驅動程式。預設值為json-file
。
log_driver: syslog
log_opt
Version 1 file format only. In version 2, use logging.
將記錄選項指定為key-value
對。 syslog
選項的示例:
log_opt:
syslog-address: "tcp://192.168.0.42:123"
net
Version 1 file format only. In version 2, use network_mode.
網路模式。 使用與docker client --net
引數相同的值。 container:...
形式可以接受服務名稱,而不是容器名稱或ID。
net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
network_mode
Version 2 file format and up. In version 1, use net.
網路模式。 使用與docker client --net
引數相同的值,以及特殊表單 service:[service name]
。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
Version 2 file format and up. In version 1, use net.
要加入的網路, 引用top-level networks key 下的條目。
services:
some-service:
networks:
- some-network
- other-network
aliases
網路上此服務的別名(備用主機名)。同一網路上的其他容器可以使用服務名稱或此別名連線到服務的容器之一。
由於aliases
是網路範圍的,所以相同的服務可以在不同的網路上具有不同的別名。
注意:網路範圍的別名可以由多個容器共享,甚至可以由多個服務共享。 如果是,那麼該名稱將解析為哪個容器不能保證。
一般格式如下所示。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
在下面的示例中,提供了三個服務(web
,worker
和db
),以及兩個網路(new
和legacy
)。 db
服務在new
網路上的主機名db
或database
,legacy
網路中的db
或mysql
是可達的。
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:
ipv4_address, ipv6_address
在加入網路時為此服務的容器指定靜態IP地址。
頂級網路部分中的相應網路配置必須具有包含每個靜態地址的子網和閘道器配置的ipam塊。 如果需要IPv6定址,則com.docker.network.enable_ipv6驅動程式選項必須設定為true。
version: '2'
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
driver_opts:
com.docker.network.enable_ipv6: "true"
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
link_local_ips
Added in version 2.1 file format.
指定link-local IPs。 link-local IPs是屬於眾所周知的子網並且完全由運營商管理的特殊IP,通常取決於它們被部署的架構。 因此,它們不由docker(IPAM driver)管理。
用法示例:
version: '2.1'
services:
app:
image: busybox
command: top
networks:
app_net:
link_local_ips:
- 57.123.22.11
- 57.123.22.13
networks:
app_net:
driver: bridge
pid
pid: "host"
將PID模式設定為主機PID模式。 這將開啟容器和主機作業系統之間的PID地址空間的共享。 使用此標誌啟動的容器將能夠訪問和操作裸機機器名稱空間中的其他容器,反之亦然。
ports
公開埠。 指定兩個埠(HOST:CONTAINER
),或只指定容器埠(將選擇隨機主機埠)。
注意
:當對映HOST:CONTAINER
格式的埠時,當使用低於60的容器埠時,您可能會遇到錯誤的結果,因為YAML將解析格式為xx:yy
的數字為六進位制(基數60)。 因此,我們建議您始終明確指定埠對映為字串。
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"
security_opt
覆蓋每個容器的預設標籤方案。
security_opt:
- label:user:USER
- label:role:ROLE
stop_signal
設定停止容器的備用訊號。 預設情況下停止使用SIGTERM
。 使用stop_signal
設定備用訊號將導致停止傳送該訊號。
stop_signal: SIGUSR1
ulimits
覆蓋容器的預設ulimits。 您可以將單個限制指定為整數或soft/hard限制作為對映。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes, volume_driver
裝載路徑或命名卷(可選)指定主機上的路徑(HOST:CONTAINER
)或訪問模式(HOST:CONTAINER:ro
)。 對於版本2檔案,命名卷需要使用top-level volumes key`指定。 當使用版本1時,Docker Engine將自動建立命名卷(如果不存在)。
您可以在主機上安裝相對路徑,相對於正在使用的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
如果不使用主機路徑,則可以指定volume_driver
。
volume_driver: mydriver
請注意,對於版本2檔案,此驅動程式將不適用於named volumes(在使用declaring the volume時,應使用driver
選項)。 對於版本1,named volumes和container volumes都將使用指定的驅動程式。
注意
:如果您還指定了volume_driver
,則不會執行路徑擴充套件。
有關更多資訊,請參閱https://docs.docker.com/engine/userguide/dockervolumes/和Volume Plugins
volumes_from
從另一個服務或容器裝入所有卷,可選擇指定只讀訪問(ro
)或讀寫(rw
)。 如果未指定訪問級別,則將使用讀寫。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
注意
:container:...
格式僅支援版本2檔案格式。 在版本1中,您可以使用容器名稱,而不將其標記為:- service_name - service_name:ro - container_name - container_name:rw
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, oom_score_adj, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
每個都是一個單一的值,類似於它的docker執行對應。
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
memswap_limit: 2000000000
privileged: true
oom_score_adj: 500
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true
注意
:以下選項僅適用於版本2及更高版本:* oom_score_adj
Volume configuration reference
雖然可以作為服務宣告的一部分來即時宣告卷,但是此部分允許您建立可以跨多個服務重用的命名卷(不依賴volumes_from
),並且可以使用docker命令列輕鬆檢索和檢查 或API。 有關更多資訊,請參閱docker volume子命令文件。
driver
指定應為此卷使用哪個卷驅動程式。 預設為local
。 如果驅動程式不可用,Docker Engine將返回錯誤。
driver: foobar
driver_opts
將選項列表指定為要傳遞給此卷的驅動程式的key-value pairs。 這些選項是驅動程式相關的 - 請參閱驅動程式文件以獲取更多資訊。 可選的。
driver_opts:
foo: "bar"
baz: 1
external
如果設定為true
,則指定該卷已在Compose外部建立。 docker-compose up
不會嘗試建立它,並且如果它不存在將會引發一個錯誤。
external
不能與其他卷配置鍵(driver
,driver_opts
)一起使用。
在下面的示例中,不是嘗試建立名為[projectname] _data
的卷,Compose將查詢現有的卷,簡單地稱為資料,並將其掛載到db服務的容器中。
version: '2'
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
您還可以指定卷的名稱與用於在Compose檔案中引用它的名稱:
volumes:
data:
external:
name: actual-name-of-volume
labels
Added in version 2.1 file format.
使用Docker labels向容器新增元資料。 您可以使用陣列或字典。
建議您使用反向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"
Network configuration reference
頂層網路鍵允許您指定要建立的網路。 有關Compose使用Docker網路功能的完整說明,請參閱Networking guide。
driver
指定應為此網路使用哪個驅動程式。
預設驅動程式取決於您使用的Docker引擎是如何配置的,但在大多數情況下,它將是單個主機上的bridge
和Swarm上的overlay
。
如果驅動程式不可用,Docker Engine將返回錯誤。
driver: overlay
driver_opts
指定選項列表作為要傳遞給此網路驅動程式的鍵值對。 這些選項是driver-dependent - consult的驅動程式文件的更多資訊。 可選的。
driver_opts:
foo: "bar"
baz: 1
enable_ipv6
Added in version 2.1 file format.
在此網路上啟用IPv6網路。
ipam
指定自定義IPAM配置。 這是一個具有多個屬性的物件,每個屬性都是可選的:
- driver:自定義IPAM驅動程式,而不是預設值。
- config:具有零個或多個配置塊的列表,每個配置塊包含以下任意鍵:
subnet
: 表示網段的CIDR格式的子網ip_range
: 從中分配容器IPs的IP範圍gateway
: 主子網的IPv4或IPv6閘道器aux_addresses
:網路驅動程式使用的輔助IPv4或IPv6地址,作為從主機名到IP地址的對映
options
: 作為鍵值對映的驅動特定選項。
A full example:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
aux_addresses:
host1: 172.28.1.5
host2: 172.28.1.6
host3: 172.28.1.7
options:
foo: bar
baz: "0"
internal
Version 2 file format and up.
預設情況下,Docker還將橋接網路連線到它以提供外部連線。 如果要建立外部隔離的覆蓋網路,您可以將此選項設定為true。
labels
Added in version 2.1 file format.
使用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
不會嘗試建立它,並且如果它不存在將會引發一個錯誤。
外部不能與其他網路配置鍵(driver
,driver_opts
,group_add
,ipam
,internal
)一起使用。
在下面的示例中,proxy
是到外部世界的閘道器。 而不是嘗試建立一個名為[projectname] _outside
的網路,Compose將查詢一個現有的網路,簡單地呼叫外outside
並連線outside
服務的容器。
version: '2'
services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default
networks:
outside:
external: true
您還可以單獨指定網路的名稱,與用於在Compose檔案中引用它的名稱:
networks:
outside:
external:
name: actual-name-of-network
Versioning
目前有三個版本的Compose檔案格式:
- 版本1,傳統格式。 這是通過省略YAML根目錄下的版本鍵來指定的。
- 版本2,推薦格式。 這是使用版本:’2’條目在YAML的根目錄指定。
- 版本2.1,升級超過版本2,利用了Docker Engine的最新特性。 使用版本:“2.1”條目指定YAML根目錄。
要將專案從版本1移動到2,請參閱升級部分。
注意:如果您使用多個Compose檔案或擴充套件服務,每個檔案必須是相同的版本 - 您不能在單個專案中混合版本1和2。
根據您使用的版本,有幾點不同:
- 結構和允許的配置鍵
- 必須執行的最低Docker Engine版本
- 撰寫關於網路的行為 這些差異如下所述。
Version 1
未宣告版本的組合檔案被視為“版本1”。 在這些檔案中,所有服務都在文件的根目錄處宣告。
版本1由Compose到1.6.x支援。 它將在未來的Compose版本中被棄用。
版本1檔案無法宣告命名卷,網路或構建引數。
例:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis
Version 2
使用版本2語法的撰寫檔案必須指示文件根目錄下的版本號。 所有服務必須在服務鍵下宣告。
Compose 1.6.0+支援版本2檔案,並需要版本1.10.0+的Docker引擎。
可以在volumes鍵下宣告命名卷,並且可以在networks關鍵字下宣告網路。
簡單示例:
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis
一個更廣泛的例子,定義卷和網路:
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
networks:
- front-tier
- back-tier
redis:
image: redis
volumes:
- redis-data:/var/lib/redis
networks:
- back-tier
volumes:
redis-data:
driver: local
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
Version 2.1
升級版本2,引入僅適用於Docker Engine版本1.12.0+的新引數
引入以下附加引數: * link_local_ips * isolation * labels
for volumes and networks
Upgrading
在大多數情況下,從版本1移動到2是一個非常簡單的過程:
- 將整個檔案縮排一級,並在頂部放置一個
services:
鍵。 - 新增一個
version: '2'
行在檔案的頂部。
如果您使用特定的配置功能,則更復雜: * dockerfile
: This now lives under the build key:
build:
context: .
dockerfile: Dockerfile-alternate
log_driver
,log_opt
: These now live under thelogging
key:logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
- 與環境變數的連結:如環境變數引用中所述,由連結建立的環境變數已經過時了一段時間。 在新的Docker網路系統中,它們已被刪除。 您應該直接連線到相應的主機名,或者自己設定相關的環境變數,使用link hostname: ``` web: links:
- db environment:
- DB_PORT=tcp://db:5432 ```
external_links
:Compose在執行版本2專案時使用Docker網路,因此連結的行為略有不同。 特別地,兩個容器必須共同連線到至少一個網路,以便進行通訊,即使明確地連結在一起。 將外部容器連線到應用程式的預設網路,或者將外部容器和服務的容器都連線到外部網路。-
net
: 這現在由network_mode替換:net: host -> network_mode: host net: bridge -> network_mode: bridge net: none -> network_mode: none
如果你使用
net: "container:[service name]"
, 用network_mode: "service:[service name]"
替換。net: "container:web" -> network_mode: "service:web"
如果你使用
net: "container:[container name/id]"
, 值可以不變。net: "container:cont-name" -> network_mode: "container:cont-name" net: "container:abc12345" -> network_mode: "container:abc12345"
-
具有命名卷的卷:這些必須現在必須在Compose檔案的頂級卷部分中顯式宣告。 如果服務裝載稱為資料的命名卷,則必須在頂層卷部分中宣告資料卷。 整個檔案可能如下所示:
version: '2' services: db: image: postgres volumes: - data:/var/lib/postgresql/data volumes: data: {}
預設情況下,Compose會建立一個以專案名稱為字首的卷。 如果你想要它只是被稱為資料,宣告它為外部
volumes: data: external: true
Variable substitution
您的配置選項可以包含環境變數。 Compose使用執行docker-compose的shell環境中的變數值。 例如,假設shell包含EXTERNAL_PORT = 8000
,並且您提供此配置:
web:
build: .
ports:
- "${EXTERNAL_PORT}:5000"
當使用此配置執行docker-compose up
時,Compose會在shell中查詢EXTERNAL_PORT
環境變數並將其值代入。在本示例中,Compose在建立Web容器之前將埠對映解析為“8000:5000”
。
如果未設定環境變數,則Compose將替換為空字串。 在上面的示例中,如果未設定EXTERNAL_PORT
,則埠對映的值為:5000
(這當然是無效的埠對映,並且將在嘗試建立容器時導致錯誤)。
支援$VARIABLE
和${VARIABLE}
語法。 此外,當使用2.1檔案格式時,可以使用典型的shell語法提供內聯預設值: * 如果VARIABLE在
環境中未設定或為空,${VARIABLE:-default}
將評估為預設值。 * 只有在環境中未設定VARIABLE
的情況下,${VARIABLE-default}
才會評估為預設值。
不支援其他擴充套件的shell樣式功能,例如${VARIABLE/foo/bar}
。
當您的配置需要一個字母美元符號時,您可以使用$$
(雙美元符號)。 這也防止了Compose內插值,所以$$
允許你引用你不想由Compose處理的環境變數。
web:
build: .
command: "$$VAR_NOT_INTERPOLATED_BY_COMPOSE"
如果您忘記並使用單個美元符號($
),Compose將該值解釋為環境變數並將警告您:
未設定VAR_NOT_INTERPOLATED_BY_COMPOSE。 替換空字串。
參考地址: [1]https://docs.docker.com/compose/compose-file
本文連結:https://deepzz.com/post/docker-compose-file.html,參與評論 »