Dockerfile建立映象
使用Dockerfile可以快速建立自定義映象。
一、基本結構
Dockerfile由一行行命令列組成,並且支援以#開頭的註釋行。
Dockerfile主體內容分為四部分:基礎映象資訊、維護者資訊、映象操作指令和容器啟動時執行指令。
二、指令說明
Dockerfile指令的 一般格式為INSTRUCTION arguments,包括”配置指令“(配置映象資訊)和“操作指令”(具體執行操作),具體如下圖:
1.配置指令
1)ARG
定義建立映象過程中使用的變數。
格式:ARG <name>=<value>
在執行docker build時,可以通過-build-arg來為變數複製。當映象編譯完成後,ARG指定的變數將不再存在(ENV指定的變數將在映象中保留)。
Docker內建了一些映象建立變數,使用者可以直接使用而無需宣告。包括(不區分大小寫)HTTP_PROXY、HTTS_PROXY、FTP_PROXY、NO_PROXY。
2)FROM
指定所建立映象的基礎資訊。
格式:FROM <image> [AS name] 或 FROM <image>:<tag> [AS <name> 或 FROM <image>@<DIGEST> [AS <name>]。
任何Dockerfile中第一條指令必須為FROM指令。如果在同一個Dockerfile中建立多個映象時,可以使用多個FROM指令(每個映象一次)。
如:
ARG VERSION=1.0 FROM debian:${VERSION}
3)LABEL
LABEL指令可以為生成的映象新增元資料標籤資訊。這些資訊可以用來輔助過濾出特定的映象。
格式:LABEL <key>=<value> <key>=<value><key>=<value>....
如:
LABEL version="1.0" author="hello"
4)EXPOSE
宣告映象內服務監聽的埠。
格式:EXPOSE <port>=[<port>/<protocol>......]
如:
EXPOSE 22 808433
注意該指令只是起到宣告作用,並不會自動完成埠對映。
如果要對映端口出來,在啟動容器時可以使用-P引數或-p引數。
5)ENV
指定環境變數,在映象生成過程中會被後續的RUN指令使用,在映象啟動的容器中也會存在。
格式:ENV <key> <value> 或 ENV<key>=<value>......
指令指定的環境變數在執行時可以被覆蓋,如docker run -env <key>=<value> build_image。
6)ENTRYPOINT
指定映象的預設入口命令。該入口命令會在啟動容器時作為根命令執行,所有傳入值作為 該命令的引數。
格式:ENTRYPOINT ["executable", "param1","param2"]:exec呼叫執行;
ENTRYPOINT command param1 param2:shell中執行
此時,CMD指令指定值將作為根命令的引數。
每個Dockerfile中只能有一個ENTRYPOINT,當指定多個時只有最後一個起效。
在執行時,可以被--entrypoint引數覆蓋掉,如docker run --entrypoint
7)VOLUME
建立一個數據卷掛載點。
格式:VOLUME ["/data"]。
執行容器時可以從本地主機或其他容器掛載資料卷,一般用來存放資料庫和需要保持的資料等。
8)USER
指定執行容器時的使用者名稱或UID,後續的RUN等指令也會使用指定的使用者身份。
格式:USER daemon
當服務不需要管理員許可權時,可以通過該指令指定執行使用者,並且可以在Dockerfile中建立所需要的使用者,如:
RUN groupadd -r postgree && useradd --no-log-init -r -g postgres postgres
要零食獲取管理員許可權可以使用gosu命令。
9)WORKDIR
為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。
格式:WORKDIR /path/to/workdir
可以使用多個WORKDIR指令,後續命令如果引數是相對路徑,則會基於之前指令指定的路徑。如:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
則最終路徑為/a/b/c。
10)ONBUILD
當基於所生成映象建立子映象時,自動執行的操作指令。
格式:ONBUILD [INSTRUCTION]
11)HEALTHCHECK
配置所啟動容器如何進行健康檢查。
格式:HEALTHCHECK [OPTIONS] CMD command:根據所執行命令返回值是否為0來判斷;
HEALTHCHECK NONE:禁止基礎映象中的健康檢查。
OPTIONS支援如下引數:
- -interval=DURATION(default 30s):過多久檢查一次;
- -timeout=DURATION(default 30s):每次檢查等待結果的超時;
- -retries=N(default 3):如果失敗了,重試幾次才最終確定失敗。
13)SHELL
指定其他命令使用shell時的預設shell型別:SHELL ["executable","parameters"]
預設值為["/bin/sh","-c"]
注意:對於windows系統,Shell路徑中使用了“\”作為分隔符,建議在Dockerfile開頭新增#escape='來指定轉義符。
2.操作指令
1)RUN
執行指定指令。
格式:RUN <command>或RUN ["executable","param1","param2"]。注意後者指令會被解析為JSON陣列,因此必須用雙引號。
前者預設將在shell終端中執行命令,即/bin/sh -c;後者則使用exec執行,不會啟動shell環境。
2)CMD
用來指定啟動容器時預設指定的命令。
格式:
- CMD ["executable","param1","param2"]:相當於執行executable param1 param2,推薦方式
- CMD command param1 param2:在預設的shell中執行,提供給需要互動的應用
- CMD [“param1”,“param2”]:提供給ENTRYPOINT的預設引數
每個Dockerfile只能由一條CMD命令。如果指定了多條命令,只有最後一條會被執行。
如果使用者啟動容器時手動指定了執行的命令(作為run命令的引數),則會覆蓋掉CMD指定的命令。
3)ADD
將複製指定的<src>路徑下內容到容器中的<dest>路徑下。
其中<src>可以時Dockerfile所在目錄的一個相對路徑(檔案或目錄);也可以是一個URL;還可以是一個tar檔案(自動解壓為目錄)。<dest>可以時映象內絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑。
路徑支援格式,如:
ADD *.c /code/
4)COPY
複製內容到映象。
格式:COPY <src> <dest>
複製本地主機的<src>(為Dockerfile所在目錄的相對路徑,檔案或目錄)下內容到映象中的<dest>。目標路徑不存在時會自動建立。
路徑同樣支援正則格式。
COPYT於ADD指令功能類似,當使用 本地目錄為源目錄時,推薦使用COPY。
三、建立映象
編寫完Dockerfile之後,可以通過docker build命令來建立映象。
格式:docker build [OPTIONS] PATH [URL]-
該命令將讀取指定目錄下(包括子目錄)的Dockerfile,並將該路徑下所有的資料作為上下文傳送給Docker服務端,Docker服務端在校驗Dockerfile格式通過後,逐條執行其中定義的指令,碰到ADD、COPY和RUN指定會生成一層新的映象。最終如果建立映象成功,會返回最終映象的ID。