定義: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指定的命令,在本次構建鏡像的過程中不會執行。