Dockerfile介紹
Dockerfile 是一個文本檔案,其内包含了一條條的 指令(Instruction),每一條指令建構一層,是以每一條指令的内容,就是描述該層應當如何建構。
Docker通過docker build從上到下的順序運作Dockerfile中的一系列指令自動建構image。
建構新鏡像需要指定是基于哪個鏡像,即指定基礎鏡像。 此指令通常必需放在Dockerfile檔案第一個非注釋行,後續的指令都是運作
于此基準鏡像所提供的運作環境 。
基礎鏡像可以是任何可用鏡像檔案,預設情況下,docker build會在docker主機本地查找指定的鏡像檔案,在其不存在時,則會從Docker Hub Registry上拉取所需的鏡像檔案.如果找不到指定的鏡像檔案,docker build會傳回一個錯誤資訊。
使用示例:
可以指定鏡像中繼資料,如: 鏡像作者等
RUN 指令用來在建構鏡像階段需要執行 FROM 指定鏡像所支援的Shell指令。
通常各種基礎鏡像一般都支援豐富的shell指令。
注意: RUN 可以寫多個,每一個RUN指令都會建立一個鏡像層,是以盡可能合并成一條指令,比如将多個shell指令通過 && 連接配接一起成為在一條指令
每個RUN都是獨立運作的,和前一個RUN無關
ENV 可以定義環境變量和值,會被後續指令(如:ENV,ADD,COPY,RUN等)通過$KEY或${KEY}進行引用,并在容器運作時保持
<code>COPY</code> 指令将從建構上下文目錄中 <code><源路徑></code> 的檔案/目錄複制到新的一層的鏡像内的 <code><目标路徑></code> 位置。
該指令可認為是增強版的COPY,不僅支援COPY,還支援自動解壓縮。
可以将本地檔案複制到容器中,tar類型檔案會自動解壓。也可以通路網絡資源,類似wget,但來自遠端URL 的資源不會被解壓縮。
一個容器中需要持續運作的程序一般隻有一個,CMD 用來指定啟動容器時預設執行的一個指令,且其運作結束後,容器也會停止,是以一般CMD 指定的指令為持續運作且為前台指令.
注意:
CMD不同于RUN,CMD用于指定在容器啟動時所要執行的指令,而RUN用于指定鏡像建構時所要執行的指令。
如果docker run沒有指定任何的執行指令或者dockerfile裡面也沒有ENTRYPOINT,那麼開啟容器時就會使用執行CMD指定的預設的指令
每個 Dockerfile 隻能有一條 CMD 指令。如指定了多條,隻有最後一條被執行
如果使用者啟動容器時用 docker run xxx 指定運作的指令,則會覆寫 CMD 指定的指令
功能類似于CMD,配置容器啟動後執行的指令及參數
ENTRYPOINT 不能被 docker run 提供的參數覆寫,而是追加,即如果docker run 指令有參數,那麼參數全部都會作為ENTRYPOINT的參數
如果docker run 後面沒有額外參數,但是dockerfile中的CMD裡有(即上面CMD的第三種用法),即Dockerfile中即有CMD也有ENTRYPOINT,那麼CMD的全部内容會作為ENTRYPOINT的參數
如果docker run 後面有額外參數,同時Dockerfile中即有CMD也有ENTRYPOINT,那麼docker run後面的參數覆寫掉CMD參數内容,最終作為ENTRYPOINT的參數
可以通過docker run --entrypoint string 參數在運作時替換,注意string不要加空格
使用CMD要在運作時重新寫指令本身,然後在後面才能追加運作參數,ENTRYPOINT則可以運作時無需重寫指令就可以直接接受新參數
每個 Dockerfile 中隻能有一個 ENTRYPOINT,當指定多個時,隻有最後一個生效
ARG指令在build 階段指定變量,和ENV不同的是,容器運作時不會存在這些環境變量
如果和ENV同名,ENV覆寫ARG變量
可以用 docker build --build-arg <參數名>=<值> 來覆寫
在容器中建立一個可以從本地主機或其他容器挂載的挂載點,一般用來存放資料庫和需要保持的資料等,一般會将主控端上的目錄挂載至VOLUME 指令指定的容器目錄。即使容器後期被删除,此主控端的目錄仍會保留,進而實作容器資料的持久儲存。
指定服務端的容器需要對外暴露(監聽)的端口号,以實作容器與外部通信。
EXPOSE 僅僅是聲明容器打算使用什麼端口而已,并不會真正暴露端口,即不會自動在宿主進行端口映射是以,在啟動容器時需要通過 -P 或-p ,Docker 主機才會真正配置設定一個端口轉發到指定暴露的端口才可使用
即使 Dockerfile沒有EXPOSE 端口指令,也可以通過docker run -p 臨時暴露容器内程式真正監聽的端口,是以EXPOSE 相當于指定預設的暴露端口,可以通過docker run -P 進行真正暴露
為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄,當容器運作後,進入容器内WORKDIR指定的預設目錄。
WORKDIR 指定工作目錄(或稱目前目錄),以後各層的目前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會自行建立。
可以用來配置當建構目前鏡像的子鏡像時,會自動觸發執行的指令,但在目前鏡像建構時,并不會執行,即延遲到子鏡像建構時才執行
指定運作容器時的使用者名或 UID,後續的 RUN 也會使用指定使用者當服務不需要管理者權限時,可以通過該指令指定運作使用者這個使用者必須是事先建立好的,否則無法切換,如果沒有指定 USER,預設是 root 身份執行
檢查容器的健康性