十分鐘熟練Dockerfile指令

  • LABLE 給鏡像添加元數據信息
  • COPY 用戶從宿主機的當前目錄複製文件至建立的新映像文件
COPY <src> <dest>
COPY ["<src>",..."<dest>"]
<src>爲要複製的源文件或目錄,支持使用通配符
<dest>爲目標路徑,建議使用絕對路徑 
複製代碼
  1. 必須是build上下文中的路徑,不能是其父目錄中的文件
  2. 若是是目錄,則其內部文件或子目錄會被遞歸複製, 可是目錄自己不會被複制

  • ADD 相似於COPY指令,ADD支持使用tar文件和URL路徑
操做如COPY
複製代碼

若是是一個本地系統上壓縮格式的tar文件,它降被展開爲一個目錄,其行爲相似 "tar -x"命令,經過url獲取到的tar文件將不會自動展開;html


  • WORKDIR 用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指定工做目錄
WORKDIR /usr/local/
ADD nginx-1.15.2.tar.gz ./src/

複製代碼

  • VOLUME

定義存儲卷,只能制定容器內部的目錄nginx


  • EXPOSE 用戶爲容器打開制定要監聽的端口以實現與外部通訊
EXPOSE <port>
EXPOSE 11211/udp 11211/tcp
複製代碼

只有docker run 加 -P選項時纔會將端口暴漏出來,若是不加,將不暴漏端口web

[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. 第二種格式能夠設置多個變量,若中包含空格,可使用反斜線轉義,也可經過對加引號來標識,反斜線也能夠用於續行
  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有多個的話,但只有最後一個生效docker

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

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

  • 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命令最後做爲其參數使用json

注意:Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個會生效數組


  • USER
    用於指定運行的image時的或運行Dockerfile中的任何RUN、CMD、或ENTRYPOINT指令指定的程序時的用戶名或UID,默認爲root用戶
USER <UID>|<username>
複製代碼

注意:能夠爲任意數字,可是事件中必須爲/etc/passwd中某用戶的有效UID,不然docker run命令將運行失敗bash


  • 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後的指令纔會執行。tcp

注意:在ONBUILD指令中使用ADD或COPY指令應該格外當心,由於新構建過程的上下文有可能會缺乏源文件ui


喜歡我寫的東西的朋友能夠關注一下個人公衆號:Devops部落

相關文章
相關標籤/搜索