天天看點

dockerfile常用指令詳解

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>&lt;源路徑&gt;</code> 的檔案/目錄複制到新的一層的鏡像内的 <code>&lt;目标路徑&gt;</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 &lt;參數名&gt;=&lt;值&gt; 來覆寫 

 在容器中建立一個可以從本地主機或其他容器挂載的挂載點,一般用來存放資料庫和需要保持的資料等,一般會将主控端上的目錄挂載至VOLUME 指令指定的容器目錄。即使容器後期被删除,此主控端的目錄仍會保留,進而實作容器資料的持久儲存。 

 指定服務端的容器需要對外暴露(監聽)的端口号,以實作容器與外部通信。

 EXPOSE 僅僅是聲明容器打算使用什麼端口而已,并不會真正暴露端口,即不會自動在宿主進行端口映射是以,在啟動容器時需要通過 -P 或-p ,Docker 主機才會真正配置設定一個端口轉發到指定暴露的端口才可使用

 即使 Dockerfile沒有EXPOSE 端口指令,也可以通過docker run -p 臨時暴露容器内程式真正監聽的端口,是以EXPOSE 相當于指定預設的暴露端口,可以通過docker run -P 進行真正暴露 

 為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄,當容器運作後,進入容器内WORKDIR指定的預設目錄。

 WORKDIR 指定工作目錄(或稱目前目錄),以後各層的目前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會自行建立。

 可以用來配置當建構目前鏡像的子鏡像時,會自動觸發執行的指令,但在目前鏡像建構時,并不會執行,即延遲到子鏡像建構時才執行 

 指定運作容器時的使用者名或 UID,後續的 RUN 也會使用指定使用者當服務不需要管理者權限時,可以通過該指令指定運作使用者這個使用者必須是事先建立好的,否則無法切換,如果沒有指定 USER,預設是 root 身份執行 

 檢查容器的健康性