定義:Dockerfile用來建構鏡像的文本文檔,文本文檔包含了建構鏡像所需的指令和說明。
建構好的鏡像内會有一個 /usr/share/nginx/html/index.html的檔案。
在一個空目錄下,建立一個名為Dockerfile的檔案,并添加下面内容:
FROM nginx
RUN echo '建構nginx鏡像' 〉 /usr/share/nginx/html/index.html
FROM:定制的鏡像都是基于 FROM 的鏡像,這裡的 nginx 就是定制需要的基礎鏡像。後續的操作都是基于 nginx。
RUN:用于執行後續指令,有以下2種格式:
shell格式:RUN <指令行指令>
# <指令行指令> 等同于,在終端操作的 shell 指令。
exec格式:RUN["可執行檔案","參數1","參數2"]
# RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline
建構鏡像:docker build -t nginx:test .
“.”表示上下文路徑,是指docker在建構鏡像,有時候需要使用本機的檔案,docker build指令得知
這個路徑之後,會将路徑下的所有内容打包。
解析:docker的運作模式為C/S,本機為C,docker引擎是S。實際的建構過程在docker引擎下完成,需要
把我們本機的指定目錄下的檔案打包提供給docker引擎使用。如果未說明最後一個參數,
預設的上下文路徑就是dockerfile所在的目錄。
指令詳解:
COPY [--chown=<user>:<group>] <源路徑1> ... <目标路徑>
COPY [--chown=<user>:<group>] ["源路徑1" ... "目标路徑"]
[--chown=<user>:<group>]:可選參數,使用者改變複制到容器内檔案的擁有者和屬組。
<源路徑>:源檔案或者源目錄,這裡可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則
<目标路徑>:容器内的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。
ADD:與COPY使用的格式一緻,功能也類似,不同之處在于:
ADD 的優點:在執行 <源檔案> 為 tar 壓縮檔案的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,
會自動複制并解壓到 <目标路徑>。
ADD 的缺點:在不解壓的前提下,無法複制 tar 壓縮檔案。會令鏡像建構緩存失效,
進而可能會令鏡像建構變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
CMD:類似于RUN,CMD 在docker run 時運作。RUN 在 docker build時運作。
作用:為啟動的程式指定預設要運作的程式,程式運作結束,容器也結束。
CMD 指令指定的程式可被 docker run 指令行參數中指定要運作的程式所覆寫。
如果Dockerfile中存在多個CMD指令,僅最後一個生效。
ENTRYPOINT:類似于 CMD 指令,但其不會被 docker run 的指令行參數指定的指令所覆寫,
而且這些指令行參數會被當作參數送給 ENTRYPOINT 指令指定的程式。
但是, 如果運作 docker run 時使用了 --entrypoint 選項,
此選項的參數可當作要運作的程式覆寫 ENTRYPOINT 指令指定的程式。
優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運作所需的參數。
如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
ENV:設定環境變量
ARG:作用與ENV一樣,不過作用域不一樣,ARG設定的環境變量僅在Dockerfile内有效,
即隻在docker build的過程中有效,在建構好的鏡像内不存在此環境變量。
VOLUME:定義匿名資料卷。在啟動容器時忘記挂載資料卷,會自動挂載到匿名卷。
作用:(1)避免重要資料因重起而丢失。(2)避免容器不斷變大。
EXPOSE:聲明端口。
作用:(1)幫助鏡像使用者了解這個鏡像服務的端口,以友善配置映射。
(2)在運作時使用随機端口(docker run -P),會自動随機映射EXPOSE的端口。
WORKDIR:指定工作目錄。必須提前建好,會在建構鏡像的每一層中都存在。
USER:用于指定執行後續指令的使用者和使用者組,必須提前存在。
HEALTHCHECK:用于指定某個程式或者指令來監控docker容器的運作狀态。
ONBUILD:用于延遲建構指令的執行。在Dockerfile裡用ONDBUILD指定的指令,在本次建構鏡像的過程中不會執行。
參考:https://www.runoob.com/docker/docker-dockerfile.html