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

Dockerfile 指令詳解

art 直接 上下 復制 並不會 文件的 pan 環境變量 inter

使用Dockerfile

docker build [選項] <上下文路徑/URL/->

其他構建方法

直接用Git repo 進行構建

用給定的tar壓縮包構建

從標準輸入中讀取Dockerfile進行構建

從標準輸入中讀取上下文壓縮包進行構建


FROM指定基礎鏡像

是必備指令,必須是第一條指令

FROM就是指定基礎鏡像


LABEL

鏡像添加標簽來幫助組織鏡像、記錄許可信息、輔助自動化構建等

一個鏡像可以包含多個標簽,但建議將多個標簽放入到一個 LABEL 指令中


RUN 執行指令

  • shell 格式 RUN 命令

  • exec格式 RUN ["可執行文件","參數1","參數2"]

支持Shell類的行尾添加 \ 的命令換行 首位#進行註釋

最後添加清理工具的命令,刪除為了編譯所構建所需的軟件


COPY復制文件

  • COPY <源路徑>...<目標路徑>

  • COPY ["<源路徑1>",..."<目標路徑>"]


ADD更加高級的復制文件

<源路徑> 可以是一個URL,這種情況下會去下載這個鏈接文件放到<目標路徑>去,並設置文件權限為600

如果<源路徑> 為一個tar 壓縮文件的話,壓縮格式為gzip,bzip2以及xz


CMD容器啟動命令 (只可出現一次)

  • shell 格式 CMD <命令>

  • exec 格式 CMD ["可執行文件","參數1","參數2"....]

  • 參數列表格式 CMD ["參數1","參數2"... ]. 在指定了ENTRYPOINT指令後,用CMD指定具體的參數

CMD指令就是用於指定默認的容器主進程的啟動命令

在運行時可以指定新的命令來替代鏡像設置中的這個默認名利

shell格式 相當於 exec格式 CMD ["sh","-c","shell 命令"]


ENTRYPOINT 入口點(只可出現一次)

是將CMD的內容作為參數傳給ENTRYPOINT

<ENTRYPOINT> "<CMD>"

  • 使用CMD時加個參數可能會遇到報錯 希望在容器運行,就必須重新輸入完整命令

使用ENTRYPOINT 就可以避免

  • 啟動容器就是啟動主進程,有些時候,啟動主進程前,需要一寫準備工作

可以將這些預處理的工作寫成一個腳本,放在ENTRYPOINT中執行


ENV 設置環境變量

  • ENV <key><value>

  • ENV <key1>=<value1><key2>=<value2>

定義了環境變量,那麽在後續的指令中,就可以使用這個環境變量。


ARG 構建參數

ARG <參數名> [=< 默認值>]

構建參數和ENV 的效果一樣,都是設置環境變量

ARG所設置的構建環境的環境變量,在將來容器運行時是不會存在這些環境變量的


VOLUME 定義匿名卷

VOLUME ["<路徑1>","<路徑2>"...]

VOLUME <路徑>

事先制定某些目錄掛載為匿名卷


EXPOSE 聲明端口

EXPOSE <端口1>[<端口2>...]

聲明運行容器提供服務端口。

-p 是映射宿主機端口和容器端口,就是將容器對應端口服務公開給外界訪問

EXPOSE僅僅是聲明容器打算使用什麽端口


WORKDIR 指定工作目錄

WORKDIR <工作目錄路徑>

WORKDIR 指令可以來指定工作目錄(當前目錄)目錄不存在,會自動建立


USER 指定當前用戶

USER <用戶名>

切換到指定用戶,這個用戶必須是事先建立好的,否則無法切換


HEALTHCHECK 健康檢查 (只可出現一次)

HEALTHCHECK [選項] CMD <命令> 設置檢查容器健康狀態的命令

HEALTHCHECK NONE 屏蔽掉基礎鏡像健康檢查指令

設置好後 啟動容器,初始狀態為starting 在指令檢查成功後 變為 healthy 有一定次數失敗變為unhealthy

--interval=<間隔> 兩次健康檢查的間隔,默認30S

--timeout=<時長> 健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認30秒

--retries=<次數> 當連續失敗指定次數後,則將容器是為unhealthy,默認3次

分為 shell 格式 和 exec 格式

命令的返回值決定健康檢查的成功與否 0:成功 1:失敗 2:保留


ONBUILD 為他人做嫁衣

ONBUILD <其它指令> 比如 RUN COPY 等

在當前鏡像構建時並不會被執行,只有被當成基礎鏡像去構建下一級鏡像的時候才會被執行


Dockerfile 指令詳解