1. 程式人生 > >Docker入門與實踐之 Dockerfile 語法詳解

Docker入門與實踐之 Dockerfile 語法詳解

二、指令詳解

2.1 From 指令

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
  • FROM指定構建映象的基礎源映象,如果本地沒有指定的映象,則會自動從 Docker 的公共庫 pull 映象下來。
  • FROM必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從FROM語句開始。
  • FROM可以在一個 Dockerfile 中出現多次,如果有需求在一個 Dockerfile 中建立多個映象。
  • 如果FROM語句沒有指定映象標籤,則預設使用latest標籤。

2.2  MAINTAINER 指令

MAINTAINER <name>

指定建立映象的使用者

2.3 Run 指令

    在建立映象的時候需要執行的命令。

# 由shell啟動,Linux預設為`/bin/sh -c`,Windows預設為`cmd /S /C`
RUN <command>
# 執行可執行檔案
RUN ["executable", "param1", "param2"]

       每條RUN指令將在當前映象基礎上執行指定命令,並提交為新的映象,後續的RUN都在之前RUN提交後的映象為基礎,映象是分層的,可以通過一個映象的任何一個歷史提交點來建立,類似原始碼的 

版本控制 。

exec 方式會被解析為一個 JSON 陣列,所以必須使用雙引號而不是單引號。exec 方式不會呼叫一個命令 shell,所以也就不會繼承相應的變數。

2.4 CMD 指令

     映象建立後,執行容器需要執行的命令。

CMD ["executable","param1","param2"] (執行可執行檔案,優先)
CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增引數)
CMD command param1 param2 (執行shell內部命令)

    CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最後一個會生效。

    CMD的目的是為了在啟動容器時提供一個預設的命令執行選項。如果使用者啟動容器時指定了執行的命令,則會覆蓋掉CMD指定的命令。

2.5 LABEL指令

    給映象新增資訊。使用docker inspect可檢視映象的相關資訊。

LABEL "com.example.vendor"="ACME Incorporated"

2.6 EXPOSE

指定於外界互動的埠,在容器啟動時用-p傳遞引數,例如-p 3307:3306將容器內的3306繫結到本機的3307

EXPOSE <port> [<port>...]

告訴 Docker 服務端容器對外對映的本地埠,需要在 docker run 的時候使用-p或者-P選項生效。

2.7 ENV

設定環境變數

ENV <key> <value>       # 只能設定一個變數
ENV <key>=<value> ...   # 允許一次設定多個變數

指定一個環節變數,會被後續RUN指令使用,並在容器執行時保留。

2.8 ADD

將本地檔案新增到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等型別的檔案將被新增tar -x命令,進行解壓

ADD <src>... <dest>

ADD複製本地主機檔案、目錄或者遠端檔案 URLS 從 並且新增到容器指定路徑中 。

ADD hom* /mydir/        # 新增所有以"hom"開頭的檔案
ADD hom?.txt /mydir/    # ? 替代一個單字元,例如:"home.txt"

ADD test relativeDir/          # 新增 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # 新增 "test" 到 /absoluteDir/
  • 路徑必須是絕對路徑,如果 不存在,會自動建立對應目錄
  • 路徑必須是 Dockerfile 所在路徑的相對路徑
  • 如果是一個目錄,只會複製目錄下的內容,而目錄本身則不會被複制

2.9 COPY

COPY <src>... <dest>

 COPY複製新檔案或者目錄從 並且新增到容器指定路徑中 。用法同ADD,唯一的不同是不能指定遠端檔案 URLS。

2.10 ENTRYPOINT

ENTRYPOINT  "executable", "param1", "param2"
ENTRYPOINT command param1 param2 (shell form)

配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run --entrypoint選項。

每個 Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最後一個生效。

2.11 VOLUME

VOLUME ["/data"]
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

用於指定持久化目錄,在容器啟動時用-v傳遞引數,例如-v ~/opt/data/mysql:/var/lib/mysql將本機的~/opt/data/mysql和容器內的/var/lib/mysql做持久化關聯 容器啟動時會載入,容器關閉後會回寫。

2.12 USER

USER daemon

指定執行容器時的使用者名稱或 UID,後續的RUN、CMD、ENTRYPOINT也會使用指定使用者。

2.13 WORKDIR

WORKDIR /path/to/workdir

為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。

WORKDIR /a  (這時工作目錄為/a)
WORKDIR b  (這時工作目錄為/a/b)
WORKDIR c  (這時工作目錄為/a/b/c)

2.14 ARG

ARG <name>[=<default value>]

由外部啟動時必須傳入的引數,在容器啟動時用--build-arg傳遞引數 指定於外界互動的埠,在容器啟動時用-p傳遞引數,例如--build-arg CONT_IMG_VER=v2.0.1

2.15 ONBUILD

ONBUILD [INSTRUCTION]

配置當所建立的映象作為其它新建立映象的基礎映象時,所執行的操作指令。

如果基於 image-A 建立新的映象時,新的 Dockerfile 中使用 FROM image-A 指定基礎映象時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。

2.16 HEALTHCHECK

容器健康狀況檢查命令。

HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE

第一個的功能是在容器內部執行一個命令來檢查容器的健康狀況

第二個的功能是在基礎映象中取消健康檢查命令

[OPTIONS]的選項支援以下三中選項:

    --interval=DURATION 兩次檢查預設的時間間隔為30秒

    --timeout=DURATION 健康檢查命令執行超時時長,預設30秒

    --retries=N 當連續失敗指定次數後,則容器被認為是不健康的,狀態為unhealthy,預設次數是3

注意:

HEALTHCHECK命令只能出現一次,如果出現了多次,只有最後一個生效。