十分鐘熟練Dockerfile指令

github地址:https://github.com/opsonly, 上面是一個基於python3.7django2.1的多人博客系統,喜歡的可以給個star~



  • LABLE 給鏡像添加元數據信息

  • COPY 用戶從宿主機的當前目錄複製文件至創建的新映像文件
COPY <src> <dest>
COPY ["<src>",..."<dest>"]
<src>爲要複製的源文件或目錄,支持使用通配符
<dest>爲目標路徑,建議使用絕對路徑 
  1. <src>必須是build上下文中的路徑,不能是其父目錄中的文件
  2. 如果<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> ...
    1. 第二種格式可以設置多個變量,若<value>中包含空格,可以使用反斜線轉義,也可通過對<value>加引號來標識,反斜線也可以用於續行
    2. 定義多個變量時,建議使用第二種方式,以便在同一層中完成所有功能。
    3. 如果在命令行中定義-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

  1. RUN 在docker build中運行,構建鏡像時爲了使鏡像完整使用的命令。在初始化容器時候時不可能再運行。
  2. CMD 定義一個鏡像文件啓動爲容器時候默認要運行的程序,且其運行結束後,容器也將終止,而docker容器默認只運行一個程序。CMD指令可以被docker run 的命令行所覆蓋

注意:RUN命令在Dockerfile中可以有多個,且可以都生效,但是CMD有多個的話,但只有最後一個生效

  • RUN 命令格式
    RUN <command>
    RUN ["<executable>","<param1>","<param2>"]
    1. 第一種格式,<command>通常是一個shell命令,且以"/bin/sh -c "來運行它,這意味着此進程在容器中的PID不爲1,不能接收unix信號(因爲接收信號的都是進程爲1的來接收),因此,當使用docker stop <container>命令停止容器時,此京城接收不到sigterm信號;
    2. 第二種語法格式中的參數是一個json格式的數組,其中<executable>爲要運行的命令,後面爲參數。然而,此格式的命令不會以"/bin/sh -c" 來發起,因此不支持通配符等shell特性

注意:Json數組中,要使用雙引號

  • CMD命令格式
CMD <command>
CMD ["<executable>","<param1>","<para 
  1. 前兩種語法格式的意義同RUN
  2. 第三種則用於爲ENTRYPOINT指令提供默認參數

  • ENTRYPOINT
    1. 類似CMD指令的功能,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
    2. 與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後的指令纔會執行。

注意:在ONBUILD指令中使用ADD或COPY指令應該格外小心,因爲新構建過程的上下文有可能會缺少源文件


喜歡的可以關注一下,歡迎點贊評論,不斷更新哦~
十分鐘熟練Dockerfile指令

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章