1. 程式人生 > >Dockerfile書寫規則

Dockerfile書寫規則

所有 令行 註釋 文件 以及 tor rst 數據 大小

簡介

Dockerfile類似於Makefile,包含有多條構建指令,Docker可以通過Dockerfile自動生成自定義鏡像。

用法

docker build命令根據Dockerfile上下文構建鏡像。構建的上下文是指定位置PATH或URL的文件集合。PATH是本地文件系統的一個文件夾。URL是一個Git倉庫地址。

構建由Docker守護進程運行,而不是由CLI運行。構建過程所做的第一件事是將整個上下文遞歸地發送到守護進程。在大多數情況下,最好以空目錄作為上下文,並將Dockerfile保存在該目錄中,僅添加構建鏡像所需的文件。

不要使用根目錄,/作為構建的上下文PATH,這樣會導致將磁盤上所有的內容發送到守護進程。

在Dockerfile中通過指令指定上下文中的文件。如果要提高構建性能,可以通過.dockerignore排除上下文中的某些文件或目錄。

格式

# Comment
INSTRUCTION arguments

指令不區分大小寫,但是慣例使用大寫,以便將它們和參數區分開來。

Docker按順序執行Dockerfile中的指令。一個Dockerfile必須用FROM指令啟動。

Docker使用#作為註釋的開頭。

Dockerfile指令

FROM

指定基礎鏡像,通常我們會基於某個基礎鏡像定制自己的鏡像,在DockerStore上有很多的官方鏡像,我們可以基於這些鏡像來定制自己的鏡像。如果沒有找到對應的鏡像,官方鏡像中還提供了一些更為基礎的操作系統鏡像;除此之外,還存在一個名為scratch的特殊鏡像,這個鏡像並不實際存在,是一個空白的鏡像。

FROM <image> [AS <name>]

or

FROM <image>[:<tag>] [AS <name>]

or

FROM <image>[@<digest>] [AS <name>]

RUN

執行命令行命令。

RUN有兩種形式:

  • RUN <command> (shell格式,該命令在shell中運行,默認情況下/bin/sh -c在Linux或cmd /S /C Windows上運行)
  • RUN ["executable", "param1", "param2"](exec格式)

CMD

指定容器主進程的啟動命令。在運行時可以指定新的命令來代替這個默認命令。

CMD指令有三種格式:

  • CMD ["executable","param1","param2"] (exec格式,一般推薦使用的格式)
  • CMD ["param1","param2"] (參數列表格式)
  • CMD command param1 param2 (shell格式)

LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL指令添加元數據到鏡像中。如果要使用包含有空格的元數據,可以給key-value加上引號。

MAINTAINER

MAINTAINER <name>

這個指令設置鏡像的維護者。而LABEL更加靈活,可以設置任何需要的元數據,並且可以輕松查看。要設置MAINTAINER信息可以使用LABEL進行設置:

LABEL maintainer="[email protected]"

EXPOSE

EXPOSE <port> [<port>/<protocol>...]

EXPOSE指令告訴Docker容器在運行時監聽指定的網絡端口。如果未指定協議,則默認為TCP。

EXPOSE指令僅僅是聲明運行時容器打算使用什麽端口,並不會自動在宿主進行端口映射。

ENV

ENV <key> <value>
ENV <key>=<value> ...

ENV指令將環境變量<key>設置為值<value>。這個值將在構建階段中的所有後續指令環境中。

COPY

復制文件。

COPY有兩種格式:

COPY <src>... <dest>
COPY ["<src>", ... "<dest>"]

ADD

更高級的復制文件

ADD指令和COPY基本一致,但是在COPY的基礎上增強了一些功能。比如源文件可以是一個URL,在這種情況下,Docker會試圖去下載這個鏈接的文件放到目標路徑中,下載後的文件權限自動設置為600,如果這個權限不是想要的權限,那麽還需要增加額外的RUN進行權限調整,況且,如果下載的是壓縮包,還需要解壓縮。所以不如直接調用RUN指令,然後使用wget或者curl工具下載,這個功能並不推薦使用。

如果源文件是一個tar壓縮包的話,壓縮格式為gzip,bzip2以及xz的情況下,ADD指令將會自動解壓縮這個壓縮文件到目標路徑中,在某些情況下這個自動解壓縮的功能非常有用。

ENTRYPOINT

入口點

ENTRYPOINT的格式和RUN指令格式一樣,分為exec格式和shell格式。

ENTRYPOINT的目的和CMD一樣,都是指定了容器啟動的參數。ENTRYPOINT在運行時也可以被替代,需要通過docker run的參數-entrypoint來指定。

如果指定了ENTRYPOINT指令,CMD就不再是直接運行了,而是將CMD的內容作為參數傳遞給ENTRYPOINT指令。

ARG

構建參數

ARG <name>[=<defaul value>]

構建參數和ENV的效果一樣,都是設置環境變量。不同的是,ARG所設置的構建環境的環境變量在將來容器運行時是不會存在的。

VOLUME

定義匿名卷

VOLUME ["/data"]

WORKDIR

指定工作目錄。

使用WORKDIR指令可以指定工作目錄。

USER

指定當前用戶。

Dockerfile書寫規則