1. 程式人生 > >Dockerfile指令詳解

Dockerfile指令詳解

什麼是Dockerfile?

Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立一個新的映象。它們簡化了從頭到尾的流程並極大的簡化了部署工作。Dockerfile從FROM命令開始,緊接著跟隨者各種方法,命令和引數。其產出為一個新的可以用於建立容器的映象。

當你在使用 Docker構建映象的時候,每一個命令都會在前一個命令的基礎上形成一個新層。這些基礎映象可以用於建立新的容器。本篇文章將手把手教您如何從基礎映象,一步一步,一層一層的從Dockerfile構建容器的過程。

Dockerfile編寫示例:

Dockerfile語法由兩部分構成,註釋和命令+引數

1.FROM 格式為FROM image或FROM image:tag,並且Dockerfile中第一條指令必須是FROM指令,且在同一個Dockerfile中建立多個映象時,可以使用多個FROM指令。

2.MAINTAINER 格式為MAINTAINER user_name user_email,指定維護者資訊

3.RUN 格式為RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell終端中執行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";後者使用exec執行,指定其他執行終端使用RUN["/bin/bash","-c","echo hello"]

每條RUN指令將當前的映象基礎上執行指令,並提交為新的映象,命令較長的時候可以使用\來換行。

4.CMD 支援三種格式: CMD ["executable","param1","param2"],使用exec執行,這是推薦的方式。 CMD command param1 param2 在/bin/sh中執行。 CMD ["param1","param2"] 提供給ENTERYPOINT的預設引數。 CMD用於指定容器啟動時執行的命令,每個Dockerfile只能有一個CMD命令,多個CMD命令只執行最後一個。若容器啟動時指定了執行的命令,則會覆蓋掉CMD中指定的命令。

5.EXPOSE 格式為 EXPOSE port [port2,port3,...],例如EXPOSE 80這條指令告訴Docker伺服器暴露80埠,供容器外部連線使用。 在啟動容器的使用使用-P,Docker會自動分配一個埠和轉發指定的埠,使用-p可以具體指定使用哪個本地的埠來對映對外開放的埠。

6.ENV 格式為:EVN key value 。用於指定環境變數,這些環境變數,後續可以被RUN指令使用,容器執行起來之後,也可以在容器中獲取這些環境變數。 例如 ENV word hello RUN echo $word

7.ADD 格式:ADD src dest 該命令將複製指定本地目錄中的檔案到容器中的dest中,src可以是是一個絕對路徑,也可以是一個URL或一個tar檔案,tar檔案會自動解壓為目錄。

8.COPY 格式為:COPY src desc 複製本地主機src目錄或檔案到容器的desc目錄,desc不存在時會自動建立。

9.ENTRYPOINT 格式有兩種: ENTRYPOINT ["executable","param1","param2"] ENTRYPOINT command param1,param2 會在shell中執行。 用於配置容器啟動後執行的命令,這些命令不能被docker run提供的引數覆蓋。和CMD一樣,每個Dockerfile中只能有一個ENTRYPOINT,當有多個時最後一個生效。

10.VOLUME 格式為 VOLUME ["/data"] 作用是建立在本地主機或其他容器可以掛載的資料卷,用來存放資料。

11.USER 格式為:USER username 指定容器執行時的使用者名稱或UID,後續的RUN也會使用指定的使用者。要臨時使用管理員許可權可以使用sudo。在USER命令之前可以使用RUN命令建立需要的使用者。 例如:RUN groupadd -r docker && useradd -r -g docker docker

12.WORKDIR 格式: WORKDIR /path 為後續的RUN CMD ENTRYPOINT指定配置工作目錄,可以使用多個WORKDIR指令,若後續指令用得是相對路徑,則會基於之前的命令指定路徑。

13.ONBUILD 格式ONBUILD [INSTRUCTION] 該配置指定當所建立的映象作為其他新建映象的基礎映象時所執行的指令。 例如下面的Dockerfile建立了映象A:ONBUILD ADD . /app ONBUILD RUN python app.py

則基於映象A建立新的映象時,新的Dockerfile中使用from A 指定基映象時,會自動執行ONBBUILD指令內容,等價於在新的要構建映象的Dockerfile中增加了兩條指令:FROM A ADD ./app RUN python app.py

docker build

建立好Dockerfile之後,通過docker build命令來建立映象,該命令首先會上傳Dockerfile檔案給Docker伺服器端,伺服器端將逐行執行Dockerfile中定義的指令。 通常建議放置Dockerfile的目錄為空目錄。另外可以在目錄下建立.dockerignore檔案,讓Docker忽略路徑下的檔案和目錄,這一點與Git中的配置很相似。

通過 -t 指定映象的標籤資訊,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路徑