
1. 摘要
Docker Compose 是 Docker 官方編排(Orchestration)項目之一,負責快速的部署分布式應用。
本章將介紹 Compose 項目情況以及安裝和使用。
2. 內(nèi)容
2.1 簡介
Compose 項目是 Docker 官方的開源項目,負責實現(xiàn)對 Docker 容器集群的快速編排。從功能上看,跟 OpenStack 中的 Heat 十分類似。
其代碼目前在 https://github.com/docker/compose 上開源。
Compose 定位是 「定義和運行多個 Docker 容器的應用(Defining and running multi-container Docker applications)」,其前身是開源項目 Fig。
通過第一部分中的介紹,我們知道使用一個 Dockerfile 模板文件,可以讓用戶很方便的定義一個單獨的應用容器。然而,在日常工作中,經(jīng)常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現(xiàn)一個 Web 項目,除了 Web 服務容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務容器,甚至還包括負載均衡容器等。
Compose 恰好滿足了這樣的需求。它允許用戶通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關(guān)聯(lián)的應用容器為一個項目(project)。
Compose 中有兩個重要的概念:
服務 (
service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。項目 (
project):由一組關(guān)聯(lián)的應用容器組成的一個完整業(yè)務單元,在docker-compose.yml文件中定義。
Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。
Compose 項目由 Python 編寫,實現(xiàn)上調(diào)用了 Docker 服務提供的 API 來對容器進行管理。因此,只要所操作的平臺支持 Docker API,就可以在其上利用 Compose 來進行編排管理。
2.2 安裝與卸載
Compose 支持 Linux、macOS、Windows 10 三大平臺。
Compose 可以通過 Python 的包管理工具 pip 進行安裝,也可以直接下載編譯好的二進制文件使用,甚至能夠直接在 Docker 容器中運行。
Docker Desktop for Mac/Windows 自帶 docker-compose 二進制文件,安裝 Docker 之后可以直接使用。
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
Linux 系統(tǒng)請使用以下介紹的方法安裝。
二進制包
在 Linux 上的也安裝十分簡單,從 官方 GitHub Release 處直接下載編譯好的二進制文件即可。
例如,在 Linux 64 位系統(tǒng)上直接下載對應的二進制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 國內(nèi)用戶可以使用以下方式加快下載
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
PIP 安裝
注: x86_64 架構(gòu)的 Linux 建議按照上邊的方法下載二進制包進行安裝,如果您計算機的架構(gòu)是 ARM (例如,樹莓派),再使用 pip 安裝。
這種方式是將 Compose 當作一個 Python 應用來從 pip 源中安裝。
執(zhí)行安裝命令:
$ sudo pip install -U docker-compose
可以看到類似如下輸出,說明安裝成功。
Collecting docker-compose
Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
bash 補全命令
$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
卸載
如果是二進制包方式安裝的,刪除二進制文件即可。
$ sudo rm /usr/local/bin/docker-compose
如果是通過 pip 安裝的,則執(zhí)行如下命令即可刪除。
$ sudo pip uninstall docker-compose
2.3 使用
術(shù)語
首先介紹幾個術(shù)語。
服務 (
service):一個應用容器,實際上可以運行多個相同鏡像的實例。項目 (
project):由一組關(guān)聯(lián)的應用容器組成的一個完整業(yè)務單元。
可見,一個項目可以由多個服務(容器)關(guān)聯(lián)而成,Compose 面向項目進行管理。
場景
最常見的項目是 web 網(wǎng)站,該項目應該包含 web 應用和緩存。
下面我們用 Python 來建立一個能夠記錄頁面訪問次數(shù)的 web 網(wǎng)站。
web 應用
新建文件夾,在該目錄中編寫 app.py 文件
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 該頁面已被訪問 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Dockerfile
編寫 Dockerfile 文件,內(nèi)容為
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
docker-compose.yml
編寫 docker-compose.yml 文件,這個是 Compose 使用的主模板文件。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
運行 compose 項目
$ docker-compose up
此時訪問本地 5000 端口,每次刷新頁面,計數(shù)就會加 1。
2.4 命令說明
命令對象與格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。
執(zhí)行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具體某個命令的使用格式。
docker-compose 命令的基本的使用格式是
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項
-f, --file FILE指定使用的 Compose 模板文件,默認為docker-compose.yml,可以多次指定。-p, --project-name NAME指定項目名稱,默認將使用所在目錄名稱作為項目名。--verbose輸出更多調(diào)試信息。-v, --version打印版本并退出。
命令使用說明
build
格式為 docker-compose build [options] [SERVICE...]。
構(gòu)建(重新構(gòu)建)項目中的服務容器。
服務容器一旦構(gòu)建后,將會帶上一個標記名,例如對于 web 項目中的一個 db 容器,可能是 web_db。
可以隨時在項目目錄下運行 docker-compose build 來重新構(gòu)建服務。
選項包括:
--force-rm刪除構(gòu)建過程中的臨時容器。--no-cache構(gòu)建鏡像過程中不使用 cache(這將加長構(gòu)建過程)。--pull始終嘗試通過 pull 來獲取更新版本的鏡像。
config
驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因。
down
此命令將會停止 up 命令所啟動的容器,并移除網(wǎng)絡
exec
進入指定的容器。
help
獲得一個命令的幫助。
images
列出 Compose 文件中包含的鏡像。
kill
格式為 docker-compose kill [options] [SERVICE...]。
通過發(fā)送 SIGKILL 信號來強制停止服務容器。
支持通過 -s 參數(shù)來指定發(fā)送的信號,例如通過如下指令發(fā)送 SIGINT 信號。
$ docker-compose kill -s SIGINT
logs
格式為 docker-compose logs [options] [SERVICE...]。
查看服務容器的輸出。默認情況下,docker-compose 將對不同的服務輸出使用不同的顏色來區(qū)分??梢酝ㄟ^ --no-color 來關(guān)閉顏色。
該命令在調(diào)試問題的時候十分有用。
pause
格式為 docker-compose pause [SERVICE...]。
暫停一個服務容器。
port
格式為 docker-compose port [options] SERVICE PRIVATE_PORT。
打印某個容器端口所映射的公共端口。
選項:
--protocol=proto指定端口協(xié)議,tcp(默認值)或者 udp。--index=index如果同一服務存在多個容器,指定命令對象容器的序號(默認為 1)。
ps
格式為 docker-compose ps [options] [SERVICE...]。
列出項目中目前的所有容器。
選項:
-
-q只打印容器的 ID 信息。
pull
格式為 docker-compose pull [options] [SERVICE...]。
拉取服務依賴的鏡像。
選項:
-
--ignore-pull-failures忽略拉取鏡像過程中的錯誤。
push
推送服務依賴的鏡像到 Docker 鏡像倉庫。
restart
格式為 docker-compose restart [options] [SERVICE...]。
重啟項目中的服務。
選項:
-
-t, --timeout TIMEOUT指定重啟前停止容器的超時(默認為 10 秒)。
rm
格式為 docker-compose rm [options] [SERVICE...]。
刪除所有(停止狀態(tài)的)服務容器。推薦先執(zhí)行 docker-compose stop 命令來停止容器。
選項:
-f, --force強制直接刪除,包括非停止狀態(tài)的容器。一般盡量不要使用該選項。-v刪除容器所掛載的數(shù)據(jù)卷。
run
格式為 docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]。
在指定服務上執(zhí)行一個命令。
例如:
$ docker-compose run ubuntu ping docker.com
將會啟動一個 ubuntu 服務容器,并執(zhí)行 ping docker.com 命令。
默認情況下,如果存在關(guān)聯(lián),則所有關(guān)聯(lián)的服務將會自動被啟動,除非這些服務已經(jīng)在運行中。
該命令類似啟動容器后運行指定的命令,相關(guān)卷、鏈接等等都將會按照配置自動創(chuàng)建。
兩個不同點:
給定命令將會覆蓋原有的自動運行命令;
不會自動創(chuàng)建端口,以避免沖突。
如果不希望自動啟動關(guān)聯(lián)的容器,可以使用 --no-deps 選項,例如
$ docker-compose run --no-deps web python manage.py shell
將不會啟動 web 容器所關(guān)聯(lián)的其它容器。
選項:
-d后臺運行容器。--name NAME為容器指定一個名字。--entrypoint CMD覆蓋默認的容器啟動指令。-e KEY=VAL設置環(huán)境變量值,可多次使用選項來設置多個環(huán)境變量。-u, --user=""指定運行容器的用戶名或者 uid。--no-deps不自動啟動關(guān)聯(lián)的服務容器。--rm運行命令后自動刪除容器,d模式下將忽略。-p, --publish=[]映射容器端口到本地主機。--service-ports配置服務端口并映射到本地主機。-T不分配偽 tty,意味著依賴 tty 的指令將無法運行。
scale
格式為 docker-compose scale [options] [SERVICE=NUM...]。
設置指定服務運行的容器個數(shù)。
通過 service=num 的參數(shù)來設置數(shù)量。例如:
$ docker-compose scale web=3 db=2
將啟動 3 個容器運行 web 服務,2 個容器運行 db 服務。
一般的,當指定數(shù)目多于該服務當前實際運行容器,將新創(chuàng)建并啟動容器;反之,將停止容器。
選項:
-
-t, --timeout TIMEOUT停止容器時候的超時(默認為 10 秒)。
start
格式為 docker-compose start [SERVICE...]。
啟動已經(jīng)存在的服務容器。
stop
格式為 docker-compose stop [options] [SERVICE...]。
停止已經(jīng)處于運行狀態(tài)的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。
選項:
-
-t, --timeout TIMEOUT停止容器時候的超時(默認為 10 秒)。
top
查看各個服務容器內(nèi)運行的進程。
unpause
格式為 docker-compose unpause [SERVICE...]。
恢復處于暫停狀態(tài)中的服務。
up
格式為 docker-compose up [options] [SERVICE...]。
該命令十分強大,它將嘗試自動完成包括構(gòu)建鏡像,(重新)創(chuàng)建服務,啟動服務,并關(guān)聯(lián)服務相關(guān)容器的一系列操作。
鏈接的服務都將會被自動啟動,除非已經(jīng)處于運行狀態(tài)。
可以說,大部分時候都可以直接通過該命令來啟動一個項目。
默認情況,docker-compose up 啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息,可以很方便進行調(diào)試。
當通過 Ctrl-C 停止命令時,所有容器將會停止。
如果使用 docker-compose up -d,將會在后臺啟動并運行所有的容器。一般推薦生產(chǎn)環(huán)境下使用該選項。
默認情況,如果服務容器已經(jīng)存在,docker-compose up 將會嘗試停止容器,然后重新創(chuàng)建(保持使用 volumes-from 掛載的卷),以保證新啟動的服務匹配 docker-compose.yml 文件的最新內(nèi)容。如果用戶不希望容器被停止并重新創(chuàng)建,可以使用 docker-compose up --no-recreate。這樣將只會啟動處于停止狀態(tài)的容器,而忽略已經(jīng)運行的服務。如果用戶只想重新部署某個服務,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 來重新創(chuàng)建服務并后臺停止舊服務,啟動新服務,并不會影響到其所依賴的服務。
選項:
-d在后臺運行服務容器。--no-color不使用顏色來區(qū)分不同的服務的控制臺輸出。--no-deps不啟動服務所鏈接的容器。--force-recreate強制重新創(chuàng)建容器,不能與--no-recreate同時使用。--no-recreate如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate同時使用。--no-build不自動構(gòu)建缺失的服務鏡像。-t, --timeout TIMEOUT停止容器時候的超時(默認為 10 秒)。
version
格式為 docker-compose version。
打印版本信息。
2.5 Compose 模板文件
模板文件是使用 Compose 的核心,涉及到的指令關(guān)鍵字也比較多。但大家不用擔心,這里面大部分指令跟 docker run 相關(guān)參數(shù)的含義都是類似的。
默認的模板文件名稱為 docker-compose.yml,格式為 YAML 格式。
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
注意每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)等來自動構(gòu)建生成鏡像。
如果使用 build 指令,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中重復設置。
下面分別介紹各個指令的用法。
build
指定 Dockerfile 所在文件夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構(gòu)建這個鏡像,然后使用這個鏡像。
version: '3'
services:
webapp:
build: ./dir
你也可以使用 context 指令指定 Dockerfile 所在文件夾的路徑。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定構(gòu)建鏡像時的變量。
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
使用 cache_from 指定構(gòu)建鏡像的緩存
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
cap_add, cap_drop
指定容器的內(nèi)核能力(capacity)分配。
例如,讓容器擁有所有能力可以指定為:
cap_add:
- ALL
去掉 NET_ADMIN 能力可以指定為:
cap_drop:
- NET_ADMIN
command
覆蓋容器啟動后默認執(zhí)行的命令。
command: echo "hello world"
configs
僅用于 Swarm mode,詳細內(nèi)容請查看 Swarm mode 一節(jié)。
cgroup_parent
指定父 cgroup 組,意味著將繼承該組的資源限制。
例如,創(chuàng)建了一個 cgroup 組名稱為 cgroups_1。
cgroup_parent: cgroups_1
container_name
指定容器名稱。默認將會使用 項目名稱_服務名稱_序號 這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱后,該服務將無法進行擴展(scale),因為 Docker 不允許多個容器具有相同的名稱。
deploy
僅用于 Swarm mode,詳細內(nèi)容請查看 Swarm mode 一節(jié)
devices
指定設備映射關(guān)系。
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on
解決容器的依賴、啟動先后的問題。以下例子中會先啟動 redis db 再啟動 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:
web服務不會等待redisdb「完全啟動」之后才啟動。
dns
自定義 DNS 服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
dns_search
配置 DNS 搜索域。可以是一個值,也可以是一個列表。
dns_search: example.com
dns_search:
- domain1.example.com
- domain2.example.com
tmpfs
掛載一個 tmpfs 文件系統(tǒng)到容器。
tmpfs: /run
tmpfs:
- /run
- /tmp
env_file
從文件中獲取環(huán)境變量,可以為單獨的文件路徑或列表。
如果通過 docker-compose -f FILE 方式來指定 Compose 模板文件,則 env_file 中變量的路徑會基于模板文件路徑。
如果有變量名稱與 environment 指令沖突,則按照慣例,以后者為準。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環(huán)境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
# common.env: Set development environment
PROG_ENV=development
environment
設置環(huán)境變量。你可以使用數(shù)組或字典兩種格式。
只給定名稱的變量會自動獲取運行 Compose 主機上對應變量的值,可以用來防止泄露不必要的數(shù)據(jù)。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
如果變量名稱或者值中用到 true|false,yes|no 等表達 布爾 含義的詞匯,最好放到引號里,避免 YAML 自動解析某些內(nèi)容為對應的布爾語義。這些特定詞匯,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內(nèi)部端口為參數(shù)
expose:
- "3000"
- "8000"
external_links
注意:不建議使用該指令。
鏈接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的外部容器。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
類似 Docker 中的 --add-host 參數(shù),指定額外的 host 名稱映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
會在啟動后的服務容器中 /etc/hosts 文件中添加如下兩條條目。
8.8.8.8 googledns
52.1.157.61 dockerhub
healthcheck
通過命令檢查容器是否健康運行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
labels
為容器添加 Docker 元數(shù)據(jù)(metadata)信息。例如可以為容器添加輔助說明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
links
注意:不推薦使用該指令。
logging
配置日志選項。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
目前支持三種日志驅(qū)動類型。
driver: "json-file"
driver: "syslog"
driver: "none"
options 配置日志驅(qū)動的相關(guān)參數(shù)。
options:
max-size: "200k"
max-file: "10"
network_mode
設置網(wǎng)絡模式。使用和 docker run 的 --network 參數(shù)一樣的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
配置容器連接的網(wǎng)絡。
version: "3"
services:
some-service:
networks:
- some-network
- other-network
networks:
some-network:
other-network:
pid
跟主機系統(tǒng)共享進程命名空間。打開該選項的容器之間,以及容器和宿主機系統(tǒng)之間可以通過進程 ID 來相互訪問和操作。
pid: "host"
ports
暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 并且沒放到引號里,可能會得到錯誤結(jié)果,因為 YAML 會自動解析 xx:yy 這種數(shù)字格式為 60 進制。為避免出現(xiàn)這種問題,建議數(shù)字串都采用引號包括起來的字符串格式。
secrets
存儲敏感數(shù)據(jù),例如 mysql 服務密碼。
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
security_opt
指定容器模板標簽(label)機制的默認屬性(用戶、角色、類型、級別等)。例如配置標簽的用戶名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE
stop_signal
設置另一個信號來停止容器。在默認情況下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1
sysctls
配置容器內(nèi)核參數(shù)。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits
指定容器的 ulimits 限制值。
例如,指定最大進程數(shù)為 65535,指定文件句柄數(shù)為 20000(軟限制,應用可以隨時修改,不能超過硬限制) 和 40000(系統(tǒng)硬限制,只能 root 用戶提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
數(shù)據(jù)卷所掛載路徑設置??梢栽O置為宿主機路徑(HOST:CONTAINER)或者數(shù)據(jù)卷名稱(VOLUME:CONTAINER),并且可以設置訪問模式 (HOST:CONTAINER:ro)。
該指令中路徑支持相對路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
如果路徑為數(shù)據(jù)卷名稱,必須在文件中配置數(shù)據(jù)卷。
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
# 其它指令
此外,還有包括 domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir 等指令,基本跟 docker run 中對應參數(shù)的功能一致。
指定服務容器啟動后執(zhí)行的入口文件。
entrypoint: /code/entrypoint.sh
指定容器中運行應用的用戶名。
user: nginx
指定容器中工作目錄。
working_dir: /code
指定容器中搜索域名、主機名、mac 地址等。
domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A
允許容器中運行一些特權(quán)命令。
privileged: true
指定容器退出后的重啟策略為始終重啟。該命令對保持服務始終運行十分有效,在生產(chǎn)環(huán)境中推薦配置為 always 或者 unless-stopped。
restart: always
以只讀模式掛載容器的 root 文件系統(tǒng),意味著不能對容器內(nèi)容進行修改。
read_only: true
打開標準輸入,可以接受外部輸入。
stdin_open: true
模擬一個偽終端。
tty: true
讀取變量
Compose 模板文件支持動態(tài)讀取主機的系統(tǒng)環(huán)境變量和當前目錄下的 .env 文件中的變量。
例如,下面的 Compose 文件將從運行它的環(huán)境中讀取變量 ${MONGO_VERSION} 的值,并寫入執(zhí)行的指令中。
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
如果執(zhí)行 MONGO_VERSION=3.2 docker-compose up 則會啟動一個 mongo:3.2 鏡像的容器;如果執(zhí)行 MONGO_VERSION=2.8 docker-compose up 則會啟動一個 mongo:2.8 鏡像的容器。
若當前目錄存在 .env 文件,執(zhí)行 docker-compose 命令時將從該文件中讀取變量。
在當前目錄新建 .env 文件并寫入以下內(nèi)容。
# 支持 # 號注釋
MONGO_VERSION=3.6
執(zhí)行 docker-compose up 則會啟動一個 mongo:3.6 鏡像的容器。
3. 參考
(1)Docker Compose https://yeasy.gitbook.io/docker_practice/compose