天天看點

Docker系列教程07-Dockerfile指令詳解

原文: 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/51355510

ENV 設定環境變量

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

拓展閱讀