十分鐘熟練Dockerfile指令
- LABLE 給映象新增元資料資訊
- COPY 使用者從宿主機的當前目錄複製檔案至建立的新映像檔案
COPY <src> <dest> COPY ["<src>",..."<dest>"] <src>為要複製的原始檔或目錄,支援使用萬用字元 <dest>為目標路徑,建議使用絕對路徑
- <src>必須是build上下文中的路徑,不能是其父目錄中的檔案
- 如果<src>是目錄,則其內部檔案或子目錄會被遞迴複製, 但是<src>目錄本身不會被複制
- ADD 類似於COPY指令,ADD支援使用tar檔案和URL路徑
操作如COPY
如果<src>是一個本地系統上壓縮格式的tar檔案,它降被展開為一個目錄,其行為類似 "tar -x"命令,通過url獲取到的tar檔案將不會自動展開;
- WORKDIR 用於為Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定工作目錄
WORKDIR /usr/local/ ADD nginx-1.15.2.tar.gz ./src/
- VOLUME
定義儲存卷,只能制定容器內部的目錄
- EXPOSE 使用者為容器開啟制定要監聽的埠以實現與外部通訊
EXPOSE <port> EXPOSE 11211/udp 11211/tcp
只有docker run 加 -P選項時才會將埠暴漏出來,如果不加,將不暴漏埠
[root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html [root@cv0002 ~]# docker port t1 [root@cv0002 ~]# [root@cv0002 docker]# docker run --name t1 --rm -P tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html [root@cv0002 ~]# docker port t1 80/tcp -> 0.0.0.0:1024
- ENV 用於為映象定義所需的環境變數,並可被Dockerfile檔案中位於其後的其他指令(如ENV,ADD,COPY等)所呼叫,呼叫格式為$variable或${variable}
ENV <key> <value>或 ENV <key>=<value> ...
- 第二種格式可以設定多個變數,若<value>中包含空格,可以使用反斜線轉義,也可通過對<value>加引號來標識,反斜線也可以用於續行
- 定義多個變數時,建議使用第二種方式,以便在同一層中完成所有功能。
- 如果在命令列中定義-e 更改環境變數,也只是更改了環境變數,之前編譯時候做的改變是更改不了的。
[root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.7 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=a2c3f68db164 DOC_ROOT=/data/web/html/ WEB_SERVER_PACKAGE=nginx-1.15.2 HOME=/root [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=27213da32d60 WEB_SERVER_PACKAGE=nginx-1.15.1 DOC_ROOT=/data/web/html/ HOME=/root [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 ls /usr/local/src nginx-1.15.2
RUN和CMD 如圖所示

image
- RUN 在docker build中執行,構建映象時為了使映象完整使用的命令。在初始化容器時候時不可能再執行。
- CMD 定義一個映象檔案啟動為容器時候預設要執行的程式,且其執行結束後,容器也將終止,而docker容器預設只執行一個程式。CMD指令可以被docker run 的命令列所覆蓋
注意:RUN命令在Dockerfile中可以有多個,且可以都生效,但是CMD有多個的話,但只有最後一個生效
- RUN 命令格式
RUN <command> RUN ["<executable>","<param1>","<param2>"]
- 第一種格式,<command>通常是一個shell命令,且以"/bin/sh -c "來執行它,這意味著此程序在容器中的PID不為1,不能接收unix訊號(因為接收訊號的都是程序為1的來接收),因此,當使用docker stop <container>命令停止容器時,此京城接收不到sigterm訊號;
- 第二種語法格式中的引數是一個json格式的陣列,其中<executable>為要執行的命令,後面為引數。然而,此格式的命令不會以"/bin/sh -c" 來發起,因此不支援萬用字元等shell特性
注意:Json陣列中,要使用雙引號
- CMD命令格式
CMD <command> CMD ["<executable>","<param1>","<para
- 前兩種語法格式的意義同RUN
- 第三種則用於為ENTRYPOINT指令提供預設引數
- ENTRYPOINT
- 類似CMD指令的功能,用於為容器指定預設執行程式,從而使得容器像是一個單獨的可執行程式
- 與CMD不同的是,有ENTRYPOINT啟動的程式不會被docker run命令列制定的引數所覆蓋,而且,這些命令列引數會被當做引數傳遞給ENTRYPOINT制定的程式,但會被docker run命令的--entryporint選項的引數可覆蓋ENTRYPOINT指令制定的程式
ENTRYPOINT <command> ENTRYPOINT [<"<executable>","<param1>","<param2>">]
注意:docker run傳入的命令引數會覆蓋CMD指令的內容並且附加到ENTRYPOINT命令最後作為其引數使用
注意:Dockerfile檔案中也可以存在多個ENTRYPOINT指令,但僅有最後一個會生效
- USER 用於指定執行的image時的或執行Dockerfile中的任何RUN、CMD、或ENTRYPOINT指令指定的程式時的使用者名稱或UID,預設為root使用者
USER <UID>|<username>
注意:<UID>可以為任意數字,但是事件中必須為/etc/passwd中某使用者的有效UID,否則docker run命令將執行失敗
- HEALTHCHECK 檢測應用是否正常執行
HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/ #3s後開始檢查,需要等容器裡面的操作全部執行完成再檢查
- SHELL 修改或額外定義執行程式的預設shell
- STOPSIGNAL 更好docker stop 傳過來的訊號指令,預設為15
STOPSIGNAL signal
- ARG 只再build中使用,類似變數,可以再docker run的時候通過--build-tag傳值,而ENV不可在docker run時傳值。
- ONBUILD 用於在Dockerfile中定義一個觸發器(延時執行)
ONBUILD <指令>
當此Dockerfile被build為映像檔案後,此映像檔案亦可作為base image被另一個Dockerfile用作FROM指令的引數,並以之構建新的映像檔案,此時,ONBUILD後的指令才會執行。