天天看點

阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD & COPY6 ENV7 上下文路徑VOLUME & EXPOSECMD & ENTRYPOINT實戰

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 &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰
  • python app.py
  • 阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰
  • 阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰
  • 如何調試Dockerfile?
  • 比如執行到如下步驟時報錯
  • 阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰
  • 那就進入該臨時中轉鏡像即可
docker run -it 4320f8b526bc /bin/bash      

進入後,直接檢視 app,原來是個檔案,并非路徑!檢查下 Dockerfile

阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰

注意那行意思是将 app.py 放到根目錄下并命名為 app,是以它不是個目錄。

阿裡華為Dockerfile指令規範及最佳實踐(下)4 WORKDIR5 ADD &amp; COPY6 ENV7 上下文路徑VOLUME &amp; EXPOSECMD &amp; ENTRYPOINT實戰

之後再 build,run 即可。

參考