Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13個指令。下面一一講解。python
1.FROM
格式爲FROM image或FROM image:tag,而且Dockerfile中第一條指令必須是FROM指令,且在同一個Dockerfile中建立多個鏡像時,可使用多個FROM指令。docker
2.MAINTAINER
格式爲MAINTAINER user_name user_email,指定維護者信息shell
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"]
bash
每條RUN指令將當前的鏡像基礎上執行指令,並提交爲新的鏡像,命令較長的時候可使用\來換行。服務器
4.CMD
支持三種格式:
CMD ["executable","param1","param2"],使用exec執行,這是推薦的方式。
CMD command param1 param2 在/bin/sh中執行。
CMD ["param1","param2"] 提供給ENTERYPOINT的默認參數。
CMD用於指定容器啓動時執行的命令,每一個Dockerfile只能有一個CMD命令,多個CMD命令只執行最後一個。若容器啓動時指定了運行的命令,則會覆蓋掉CMD中指定的命令。app
5.EXPOSE
格式爲 EXPOSE port [port2,port3,...],例如EXPOSE 80這條指令告訴Docker服務器暴露80端口,供容器外部鏈接使用。
在啓動容器的使用使用-P,Docker會自動分配一個端口和轉發指定的端口,使用-p能夠具體指定使用哪一個本地的端口來映射對外開放的端口。ui
6.ENV
格式爲:EVN key value 。用於指定環境變量,這些環境變量,後續能夠被RUN指令使用,容器運行起來以後,也能夠在容器中獲取這些環境變量。
例如
ENV word hello
RUN echo $wordspa
7.ADD
格式:ADD src dest
該命令將複製指定本地目錄中的文件到容器中的dest中,src能夠是是一個絕對路徑,也能夠是一個URL或一個tar文件,tar文件會自動解壓爲目錄。3d
8.COPY
格式爲:COPY src desc
複製本地主機src目錄或文件到容器的desc目錄,desc不存在時會自動建立。blog
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
14.docker build
建立好Dockerfile以後,經過docker build命令來建立鏡像,該命令首先會上傳Dockerfile文件給Docker服務器端,服務器端將逐行執行Dockerfile中定義的指令。
一般建議放置Dockerfile的目錄爲空目錄。另外能夠在目錄下建立.dockerignore文件,讓Docker忽略路徑下的文件和目錄,這一點與Git中的配置很類似。
經過 -t 指定鏡像的標籤信息,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路徑