原文: http://www.itmuch.com/docker/07-docker-docker-file/ Dockerfile有十多個指令。本節我們來系統講解這些指令,指令的一般格式為 指令名稱 參數
。
ADD 複制檔案
ADD指令用于複制檔案,格式為:
-
ADD <src>... <dest>
-
ADD ["<src>",... "<dest>"]
從src目錄複制檔案到容器的dest。其中src可以是Dockerfile所在目錄的相對路徑,也可以是一個URL,還可以是一個壓縮包
注意:
① src必須在建構的上下文内,不能使用例如:
ADD ../somethine /something
這樣的指令,因為
docker build
指令首先會将上下文路徑和其子目錄發送到docker daemon。
② 如果src是一個URL,同時dest不以斜杠結尾,dest将會被視為檔案,src對應内容檔案将會被下載下傳到dest。
③ 如果src是一個URL,同時dest以斜杠結尾,dest将被視為目錄,src對應内容将會被下載下傳到dest目錄。
④ 如果src是一個目錄,那麼整個目錄下的内容将會被拷貝,包括檔案系統中繼資料。
⑤ 如果檔案是可識别的壓縮包格式,則docker會自動解壓。
示例:
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
ARG 設定建構參數
ARG指令用于設定建構參數,類似于ENV。和ARG不同的是,ARG設定的是建構時的環境變量,在容器運作時是不會存在這些變量的。
格式為:
-
ARG <name>[=<default value>]
ARG user1=someuser
詳細介紹文檔:
https://www.centos.bz/2016/12/dockerfile-arg-instruction/CMD 容器啟動指令
CMD指令用于為執行容器提供預設值。每個Dockerfile隻有一個CMD指令,如果指定了多個CMD指令,那麼隻有最後一條會被執行,如果啟動容器的時候指定了運作的指令,則會覆寫掉CMD指定的指令。
支援三種格式:
CMD ["executable","param1","param2"]
(推薦使用)
CMD ["param1","param2"]
(為ENTRYPOINT指令提供預設參數)
CMD command param1 param2
(在shell中執行)
CMD echo "This is a test." | wc -
COPY 複制檔案
複制檔案,格式為:
-
COPY <src>... <dest>
-
COPY ["<src>",... "<dest>"]
複制本地端的src到容器的dest。COPY指令和ADD指令類似,COPY不支援URL和壓縮包。
ENTRYPOINT 入口點
-
ENTRYPOINT ["executable", "param1", "param2"]
-
ENTRYPOINT command param1 param2
ENTRYPOINT和CMD指令的目的一樣,都是指定Docker容器啟動時執行的指令,可多次設定,但隻有最後一個有效。ENTRYPOINT不可被重寫覆寫。
ENTRYPOINT、CMD差別:
http://blog.csdn.net/newjueqi/article/details/51355510ENV 設定環境變量
ENV指令用于設定環境變量,格式為:
-
ENV <key> <value>
-
ENV <key>=<value> ...
ENV JAVA_HOME /path/to/java
EXPOSE 聲明暴露的端口
EXPOSE指令用于聲明在運作時容器提供服務的端口,格式為:
-
EXPOSE <port> [<port>...]
需要注意的是,這隻是一個聲明,運作時并不會因為該聲明就打開相應端口。該指令的作用主要是幫助鏡像使用者了解該鏡像服務的守護端口;其次是當運作時使用随機映射時,會自動映射EXPOSE的端口。示例:
# 聲明暴露一個端口示例
EXPOSE port1
# 相應的運作容器使用的指令
docker run -p port1 image
# 也可使用-P選項啟動
docker run -P image
# 聲明暴露多個端口示例
EXPOSE port1 port2 port3
# 相應的運作容器使用的指令
docker run -p port1 -p port2 -p port3 image
# 也可指定需要映射到主控端器上的端口号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
FROM 指定基礎鏡像
使用FROM指令指定基礎鏡像,FROM指令有點像Java裡面的“extends”關鍵字。需要注意的是,FROM指令必須指定且需要寫在其他指令之前。FROM指令後的所有指令都依賴于該指令所指定的鏡像。
-
FROM <image>
-
FROM <image>:<tag>
-
FROM <image>@<digest>
LABEL 為鏡像添加中繼資料
LABEL指令用于為鏡像添加中繼資料。
-
LABEL <key>=<value> <key>=<value> <key>=<value> ...
使用 ”"“和”\“轉換指令行,示例:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
MAINTAINER 指定維護者的資訊(已過時)
MAINTAINER指令用于指定維護者的資訊,用于為Dockerfile署名。
-
MAINTAINER <name>
MAINTAINER 周立<[email protected]>
注:該指令已過時,建議使用如下形式:
LABEL maintainer="[email protected]"
RUN 執行指令
該指令支援兩種格式:
-
RUN <command>
-
RUN ["executable", "param1", "param2"]
RUN <command>
在shell終端中運作,在Linux中預設是
/bin/sh -c
,在Windows中是
cmd /s /c
,使用這種格式,就像直接在指令行中輸入指令一樣。
RUN ["executable", "param1", "param2"]
使用exec執行,這種方式類似于函數調用。指定其他終端可以通過該方式操作,例如:
RUN ["/bin/bash", "-c", "echo hello"]
,該方式必須使用雙引号["]而不能使用單引号['],因為該方式會被轉換成一個JSON 數組。
USER 設定使用者
該指令用于設定啟動鏡像時的使用者或者UID,寫在該指令後的RUN、CMD以及ENTRYPOINT指令都将使用該使用者執行指令。
-
USER 使用者名
USER daemon
VOLUME 指定挂載點
該指令使容器中的一個目錄具有持久化存儲的功能,該目錄可被容器本身使用,也可共享給其他容器。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令。格式為:
-
VOLUME ["/data"]
VOLUME /data
使用示例:
FROM nginx
VOLUME /tmp
當該Dockerfile被建構成鏡像後,/tmp目錄中的資料即使容器關閉也依然存在。如果另一個容器也有持久化的需求,并且想使用以上容器/tmp目錄中的内容,則可使用如下指令啟動容器:
docker run -volume-from 容器ID 鏡像名稱 # 容器ID是di一個容器的ID,鏡像是第二個容器所使用的鏡像。
WORKDIR 指定工作目錄
-
WORKDIR /path/to/workdir
切換目錄指令,類似于cd指令,寫在該指令後的
RUN
,
CMD
以及
ENTRYPOINT
指令都将該目錄作為目前目錄,并執行相應的指令。
其他
Dockerfile還有一些其他的指令,例如STOPSINGAL、HEALTHCHECK、SHELL等。由于并不是很常用,本書不作贅述。有興趣的讀者可前往
https://docs.docker.com/engine/reference/builder/擴充閱讀。
CMD/ENTRYPOINT/RUN差別
參考:
https://segmentfault.com/q/1010000000417103拓展閱讀