Docker-compose配置檔案詳解
原文連結:http://ju.outofmemory.cn/entry/287017
基本介紹
Compose 檔案是一個
YAML , 主要定義了 services
,
networks
和
volumes
, 其預設路徑是./docker-compose.yml
。
service
定義包含了應用與每個容器的配置,很像給docker run
傳參,同樣,network
和 volume
對於
docker network create
和
docker volume create
也類似。
像在 Dockerfile
(eg:
CMD
,
EXPOSE
, VOLUME
, ENV
)可以使用的選項也可以在
docker run
docker-compose.yml
裡就不需要再次指定了。
docker-compose.yml
裡可以使用環境變數,類似
Bash
格式${VARIABLE}
Service配置
composer 檔案格式有兩種版本:
- version 1: 已經廢棄, 不支援volumes 和 networks,預設
version
key 是省略的。 - version 2: 推薦的格式,目前是最新的,需要通過
version '2'
指定。 更多
build
有兩種用法:
- 直接使用路徑
- 傳入物件, 包含
context ,
dockerfile ,
args ,
dockerfile
args
預設可不傳。
build:./dir
build:
context:./dir
dockerfile:Dockerfile-alternate
args:
buildno:1
如果指定 image
, 那麼Compose
會基於
webapp
和可選的
tag
來構建映象。
build:./dir
image: webapp:tag
上面的指令會生成一個基於 ./dir
名稱為
webapp
,tag為
tag
的映象。
在 version 1 格式的檔案裡,兩種方式是不同的
- 僅支援字串形式:
build:.
, 不支援物件形式。- 不能同時使用
build
和image
, 如果嘗試這麼做的話會導致錯誤。
context
只支援version2, version1 只能使用
build
值可以是一個目錄路徑,也可以是一個git repository url。
當所提供的值是相對路徑的時候,它被解釋為compose檔案位置的相對路徑。目錄裡的資訊會被當做構建內容 傳送到Docker daemon。
dockerfile
備用的dockerfile.
Compose 將會使用備用的檔案去構建,但必須指定路徑。如:
build:
context:.
dockerfile:Dockerfile-alternate
args
僅支援 Version2
新增構建環境變數引數,但是僅構建過程期間可以使用。如:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
args
可以使用 mapping 或 list:
build:
context:.
args:
buildno:1
password: secret
build:
context:.
args:- buildno=1- password=secret
depends_on
表示服務之間的依賴關係, 有兩個影響:
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 服務啟動前並不會等待db和redis到ready狀態才啟動。如果需要等待其他服務到ready狀態,可以參考 Controlling startup order
environment
新增環境變數。可以是陣列或者字典格式。任何的boolean值(eg:
true
,false
,
yes
,
no
)都需要被引號引用,避免被
YAML
解析器解析為
True
或
False
.
environment:
RACK_ENV: development
SHOW:'true'
SESSION_SECRET:
environment:- RACK_ENV=development
- SHOW=true- SESSION_SECRET
expose
對外暴露埠,但不是暴露給host機器的,而是對已經 linked 的service可訪問。
expose:-"3000"-"8000"
image
指定要啟動容器的映象,可以是 repository/tag
或
image ID
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
映象檔案不存在,Compose會嘗試去遠端拉取。
labels
新增 metadata
到容器中。可以使用陣列或字典
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
link到其他服務容器,可以使用服務名+alias(
SERVICE:ALIAS
), 也可以只使用服務名。
web:
links:- db
- db:database
- redis
pid
將 當前的 PID
設定為主機的PID
.這會開啟容器和host作業系統之間的PID
地址共享。 帶有 PID
啟動的容器可以訪問和操縱其他真實機器空間容器。 反之亦然。
pid:"host"
ports
暴露埠。既可以是 HOST:CONTAINER
,也可以只用容器埠(host埠會隨機選取)。
當以
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"
volumes
掛載指定的路徑或者named volumes, 可以在主機上指定一個路徑
HOST:CONTAINER
, 或者一個可訪問的
HOST:CONTAINER:ro
。
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
原文連結:http://ju.outofmemory.cn/entry/287017
另:docker compose中working_dir是docker run的時候用來設定工作路徑的引數
參考連結:https://segmentfault.com/q/1010000004674939