4 WORKDIR
類似 linux 的cd 指令。
1. WORKDIR /test # 如果沒有會自動建立test目錄
2. WORKDIR demo
3. RUN pwd # 輸出結果應為/test/demo
最佳實踐
使用WORKDIR,不要用 RUN cd
盡量使用絕對目錄而非相對目錄。
5 ADD & COPY
COPY
複制指令,從上下文目錄中複制檔案或者目錄到容器裡指定路徑。
格式:
1. COPY [--chown=<user>:<group>] <源路徑1>... <目标路徑>
2. COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目标路徑>"]
[--chown=<user>:<group>]
:可選參數,使用者改變複制到容器内檔案的擁有者和屬組。
<源路徑>:源檔案或者源目錄,這裡可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路徑>:容器内的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。
ADD
ADD 指令和 COPY 的使用格式一緻(同樣需求下,官方推薦使用 COPY)。功能也類似,差別:
-
ADD 的優點
在執行 <源檔案> 為 tar 壓縮檔案的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會自動複制并解壓到 <目标路徑>。
-
ADD 的缺點
在不解壓的前提下,無法複制 tar 壓縮檔案。會令鏡像建構緩存失效,進而可能會令鏡像建構變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
ADD hello /
# 添加到根目錄并解壓
ADD test.tar.gz /
WORKDIR /root
ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test/
大部分情況,COPY優先于ADD
ADD比COPY多個解壓功能
添加遠端檔案/目錄請使用curl或者wget
6 ENV
ENV MYSQL VERSION 5.6 # 設定常量RUN apt-get install -y mysql-server= "$(MYSQL_VERSION]" \
&& rm -rf /var/lib/apt/lists/* # 引用常量
盡量使用,可增加項目的可維護性。
7 上下文路徑
指令最後一個
.
是上下文路徑
-
上下文路徑
指 docker 在建構鏡像,有時候想要使用到本機的檔案(比如複制),docker build 指令得知這個路徑後,會将路徑下的所有内容打包。
由于 docker 的運作模式是 C/S。我們本機是 C,docker 引擎是 S。實際的建構過程是在 docker 引擎下完成的,是以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。
如果未說明最後一個參數,那麼預設上下文路徑就是 Dockerfile 所在的位置。
上下文路徑下不要放無用的檔案,因為會一起打包發送給 docker 引擎,如果檔案過多會造成過程緩慢。
VOLUME & EXPOSE
存儲和網絡
CMD & ENTRYPOINT
實戰
- 項目源碼
-
阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD & COPY6 ENV7 上下文路徑VOLUME & EXPOSECMD & ENTRYPOINT實戰 - python app.py
-
阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD & COPY6 ENV7 上下文路徑VOLUME & EXPOSECMD & ENTRYPOINT實戰 -
阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD & COPY6 ENV7 上下文路徑VOLUME & EXPOSECMD & ENTRYPOINT實戰 - 如何調試Dockerfile?
- 比如執行到如下步驟時報錯
-
阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD & COPY6 ENV7 上下文路徑VOLUME & EXPOSECMD & ENTRYPOINT實戰 - 那就進入該臨時中轉鏡像即可
docker run -it 4320f8b526bc /bin/bash
進入後,直接檢視 app,原來是個檔案,并非路徑!檢查下 Dockerfile
注意那行意思是将 app.py 放到根目錄下并命名為 app,是以它不是個目錄。
之後再 build,run 即可。
參考
- 更多最佳實踐,盡在官方 Dockerfile 檔案 https://github.com/docker-library https://docs.docker.com/engine/reference/builder/