Dockerfile
FROM:
基於哪一個鏡像上層作新的鏡像
第一行要求爲FROM <image>:<tag>
LABEL: 讓用戶爲鏡像指定各類各樣的元數據(docker新版本所支持)
MAINTAINER: 相同功能,1.8版本前都支持
Syntax: LABEL <key>=<value> <key>=<value> <key>=<value>
COPY: 將宿主機中文件打包提供(複製)到目標鏡像中
Syntax: COPY <src>...<dest>或
COPY ["<src>"...."<dest>"]
dest: 生成目標目錄的路徑
src: 要複製的源文件或目錄,支持使用通配符,建議使用絕對路徑,不然,COPY指定則以WORKDIR爲起始路徑
注意:
<src>必須是build上下文中的路徑,不能是其父目錄中的文件
若是<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制
若是指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以"/"結尾
若是<dest>事先不存在,它將會被自動建立,這包括其父目錄路徑
例:
~]# mkdir /app/docker
~]# vim Dockerfile
FROM busybox:latest
MAINTAINER "Fangwenkai"
COPY ["index.html","/data/web/html/"] // 複製單個文件到景象中/data/web/html中保留
COPY ["yum.repos.d","/etc/yum.repos.d/"] // 複製本地yum.repos.d下的全部文件到新鏡像中保留,由於src爲目錄,因此dest要以/結尾
~]# docker build -t httpd:latest ./ // 構建
~]# docker images
httpd latest 502b9f32b549 10 minutes ago 1.21MB
ADD: 相似於COPY命令,ADD支持使用TAR文件和URL路徑
Syntax: ADD <src>..<dest>或
ADD ["<src>"..."<dest>"]
注意:
同COPY指令
若是<src>爲URL且<dest>不以"/"結尾,則<src>指定的文件將被下載並直接建立爲<dest>;若是<dest>以"/"結尾,則文件名URL指定的文件將直接下載並保存爲<dest>/<filename>
若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,其行爲相似與"tar -x"命令;而後,經過URL獲取到的tar文件將不會自動展開
若是<src>有多個,或其間接使用了通配符,則<dest>必須是一個以"/"結尾的目錄路徑;若是<dest>不以"/"結尾,則其被視做一個普通文件,<src>的內容將本直接寫入到<dest>
例:
ADD ["http://nginx.org/download/nginx-1.17.0.tar.gz","/usr/local/src/"] // 即便dest不存在也會自動建立,src爲URL光下載不解壓
ADD ["nginx-1.17.0.tar.gz","/usr/local/src/nginx/"] // 會將壓縮包展開放在指定目錄中
WORKDIR: 用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工做目錄
Syntax: WORKDIR <dirpath>
在Dockerfile文件中,WORKDIR指令可出現屢次,其路徑也能夠爲相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑
另外,WORKDIR也可調用由ENV指定定義的變量
例如:
WORKDIR /var/log
WORKDIR $STATEPATH
例:
WORKDIR /usr/local/src
ADD ["nginx-1.17.0.tar.gz","./"] // 此時的當前目錄變爲/usr/local/src
VOLUME: 用於在image中建立一個掛載點目錄,以掛載Docker host上的卷或其它容器上的卷
Syntax: VOLUME<mountpoint>或
VOLUME["<mountpoint>"]
若是掛載點目錄路徑下此前在文件存在,docker run命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中
例:
VOLUME /data/mysql/ // 在容器中掛載指定目錄/data/mysql,對應本地則隨機位置
EXPOSE: 用於爲容器打開指定要監聽的端口以實現外部通訊
Syntax: EXPOSE <port>[/protocol][<port>[/protocol]...]
protocol用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲tcp協議
EXPOSE指令可一次指定多個多口,例如
EXPOSE 11211/udp 11211/tcp
例:
EXPOSE 80/tcp // 指定容器內打開的端口
~]# docker run --name h4 --rm -P httpd:v0.1-6 /bin/httpd -f -h /data/web/html // 添加"-P"便可在宿主機暴露隨機端口
ENV: 用於爲鏡像定義所須要的環境變量,並可被Dockerfile文件中位於其後的其餘指令(如ENV、ADD、COPY等)所調用
調用格式爲$variable_name或${variable_name}
Syntax:
ENV <key> <value>或
ENV <key>=<value>...
第一種格式中,<key>以後的全部內容均會被視做其<value>的組成部分,所以,一次只能設置一個變量
第二種格式能夠用一次設置多個變量,每一個變量爲一個"<key>=<value>"的鍵值對,若是<value>中包含空格,能夠以反斜線(\)進行轉移,也可經過對<value>加引號進行標識;另外,反斜線也可用於續行
定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能
例:
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE=nginx-1.17.0.tar.gz
COPY ["index.html","$DOC_ROOT:-/data/web/html/"] // $DOC_ROOT:-/data/web/html(當$DOC_ROOT沒有值時則使用-後面的值)
ADD ["$WEB_SERVER_PACKAGE","./"]
~]# docker run --name h5 --rm -P -e WEB_SERVER_PACKAGE=nginx-1.17.1.tar.gz httpd:v0.1-7 printenv
-e: 修改env全局環境變量
RUN: 用於指定docker build過程當中運行的程序,其能夠是任何命令
Syntax:
RUN <command>或
RUN ["<executable>","<paraml>","<param2>"]
第一種格式中,<command>一般是一個shell命令,且以"/bin/sh -c"來運行它,這意味着此進程在容器中的PID不爲1,不能接收Unix信號,所以,當使用docker stop <container>命令中止容器時,此進程接收不到SIGTERM信號;
第二種語法格式中的參數是一個JSON格式的數組,其中<executable>爲要運行的命令,後面的<paramN>爲傳遞給命令的選項或參數;然而,此種格式指定的命令不會以"/bin/sh -c"來發起,所以常見的shell操做如變量替換以及通配符(?,*等)替換將不會進行;不過,若是要運行的命令依賴於此shell特性的話,能夠將其替換爲相似下面的格式
RUN ["/bin/bash","-c","<executable>","<paraml>"]
例:
FROM busybox:latest
MAINTAINER "Fangwenkai"
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE=nginx-1.17.0.tar.gz
COPY ["index.html","$DOC_ROOT:-/data/web/html/"]
COPY ["yum.repos.d","/etc/yum.repos.d/"]
ADD ["http://nginx.org/download/$WEB_SERVER_PACKAGE","/usr/local/src/"]
WORKDIR /usr/local/src
#ADD ["$WEB_SERVER_PACKAGE","./"]
VOLUME /data/mysql/
EXPOSE 80/tcp
RUN cd /usr/local/src && \ // 在build過程當中進入到指定目錄並解壓nginx-1.17.0.tar.gz
tar -xf $WEB_SERVER_PACKAGE
CMD: 相似與RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,兩者的運行時間點不一樣
RUN指令運行於映像文件構建過程當中,而CMD指令雲星宇基於Dockerfile構建出的新映像文件啓動一個容器時
CMD指令的首要目的在於爲啓動的容器指定默認要運行的程序,且其運行結束後,容器將終止;不過,CMD指定的命令其能夠被docker run的命令行選項所覆蓋
在Dockerfile中能夠存在多個CMD指令,但僅最後一個會生效
Syntax:
CMD <command>或
CMD ["<executable>","<param1>","<param2>"]或
CMD ["<param1>","<param2>"]
前兩種語法格式的意義同RUN
第三種則用於爲ENTRYPOINT指令提供默認參數
ENTRYPOINT: 相似CMD指令的功能,用於爲容器指定默認執行程序,從而使得容器像是一個單獨的可執行程序
與CMD不一樣的是,由ENTRYPOINT啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定的程序
不過,docker run命令的--entrypoint選項的參數可覆蓋ENTEYPOINT指令所指定的程序
Syntax:
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run命令傳入的命令參數會覆蓋CMD指令的內容而且附加到ENTRYPOINT命令最後做爲其參數使用
Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個生效
USER: 用於指定運行image時的或運行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序時的用戶名或UID;默認狀況下,container的運行身份爲root用戶
Syntax:
USER <UID>|<USERNAME>
須要注意的是,<UID>能夠爲任意數字,但實踐中其必須爲/etc/passwd中某用戶的有效UID,不然,docker run命令將運行失敗
HEALTHCHECK: 容器健康情況檢查命令
Syntax:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
第一個的功能是在容器內部運行一個命令來檢查容器的健康情況
第二個的功能是在基礎鏡像中取消健康檢查命令
[OPTIONS]:
--interval=DURATION(default:30s) // 兩次檢查默認的時間間隔爲30s
--timeout=DURATION(defaul:30s) // 健康檢查命令運行超時時長,默認爲30s
--start-period=DURATION(default:0s) // 當容器啓動多長時間後運行健康檢查,默認不等待
--retries=N(default:3) // 檢查幾回
注意:
HEALTHCHECK命令只能只能出現一次,若是出現了屢次,只有最後一個生效
CMD後邊的命令的返回值決定了本次健康檢查是否成功,返回值以下
0: success - 表示容器是健康的
1: unhealth - 表示容器已經不能工做了
2: reserved - 保留值
例:
HEALTHCHECK --interval=5s --timeout=3s --start-period=5s \
CMD wget -O - -q $HOSTNAME || exit 1
SHELL: 容許覆蓋用於shell形式的命令的默認shell,Linux上的默認shell是/bin/sh -c,而在windows上爲cmd /s /c
Syntax:
SHELL ["executable","parameters"]
SHELL指令必須以JSON格式寫入Dockerfile
SHELL指令能夠屢次出現,每條SHELL指令都會覆蓋全部先前的SHELL指令,並影響全部後續指令
ARG: 設置變量命令,ARG命令定義了一個變量,在docker build建立鏡像的時候,使用 --build-arg <varname>=<value>來指定參數
若是用戶在build鏡像時指定了一個參數沒有定義在Dockerfile中,那麼將有一個Warning
例:
ARG author="xiaofang" // 定義變量全部者爲"xiaofang"
LABEL maintainer="${author}" // 調用author變量,最後inspect會查看到全部者爲"xiaofang"
ONBUILD:
用於在Dockerfile中定義一個觸發器
Dockerfile用於build映像文件,此映像文件亦可做爲base image被另外一個Dockerfile用做FROM指令的參數,並以之構建新的映像文件
在後面的這個Dockefile中的FROM指令在build過程當中被執行時,將會"觸發"建立其base image的Dockerfile文件中的ONBUILD指令定義的觸發器
Syntax:
ONBUILD <INSTRUCTION>
儘管任何指令均可註冊成爲觸發器指令,但ONBUILD不能自我嵌套,且不會觸發FROM和MAINTAINER指令
使用包含ONBUILD指令的Dockerfile構建的鏡像應該使用特殊的標籤,例如ruby:2.0-onbuil
在ONBUILD指令中使用ADD或COPY指令應該格外當心,由於新構建過程的上下文在缺乏指頂的源文件時會失敗
例:
~]# vim /docker/image3/Dockerfile
....
ONBUILD ADD http://nginx.org/download/nginx-1.16.0.tar.gz /usr/local/src/
....
image3]# docker build ./ -t myweb:v0.3-10
image3]# mkdir ../image4/; cd ../image4
image4]# vim Dockerfile
FROM myweb:v0.3-10 // 引用剛剛帶有ONBUILD構建的鏡像
RUN mkdir /test // 建立/test目錄
image4]# docker build ./ -t test:v0.1-onbuild // 執行後會發現這個鏡像會下載上一個Dockerfile中ONBUILD後的URL