Dockerfile文件常用指令詳解

鏡像的定製實際上就是定製每一層所添加的配置、文件。我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,這個腳本就是Dockerfile。Dockerfile是一個文本文件,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

FROM指令

該指令指定基礎鏡像,然後對鏡像進行定製。

FROM ubuntu:16.04

Docker還存在一個特殊的鏡像,名爲scratch,它表示一個空白鏡像,如果你一scratch爲基礎鏡像的話,意味着你不以任何鏡像爲基礎,接下來所寫的指令將作爲鏡像的第一層。對於Linux下靜態編譯的程序來說,並不需要有操作系統提供運行時支持,所需的一切庫都已經在可執行文件裏了,因此直接FROM scratch會讓鏡像體積更加小巧。

示例:

FROM scratch

RUN指令

RUN指令是用來執行命令行命令的。其格式有兩種:

shell格式:RUN <命令>

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exec格式: RUN [“可執行文件”, “參數1”, “參數2”]

RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install

COPY指令

複製文件指令,格式如下:

COPY <源路徑> <容器內目標路徑>

## 示例
COPY a.txt /usr/text/

## 多個源文件
COPY a.txt b.txt /usr/text/

## 通配符形式
COPY hom* /mydir/
COPY hom?.txt /mydir/

ADD指令

ADD和COPY的格式和性質基本一致。但是在COPY基礎上增加了一些功能。比如<源路徑>可以是一個URL,這種情況下,Docker引擎會試圖去下載這個鏈接的文件放到<目標路徑>去。

ADD適合需要自動解壓縮的場合,因此可以遵循這樣的原則,所有的文件複製均使用COPY指令,僅在需要自動解壓縮的場合使用ADD。

CMD指令

就是用於指定容器主進程默認啓動命令的。格式如下:

shell格式:CMD <命令>

exec格式: CMD [“參數1”,“參數2”, …]

參數列表格式:CMD [“參數1”,“參數2”, …]。在指定了ENTRYPOINT指定後,用CMD指定具體的參數。

ENTRYPOINT指令

ENTRYPOINT的目的和CMD一樣,都是在指定容器啓動程序及參數。ENTRYPOINT在運行時也可以替代,不過比CMD要略顯繁瑣,需要通過docker run 的參數 --entrypoint來指定。當指定了ENTRYPOINT後,CMD的含義就發生了改變,不再是直接的運行其命令,而是將CMD的內容作爲參數傳給ENTRYPOINT指令。

ENV指令

該指令用於設置環境變量,格式有兩種:

ENV

ENV = =

這個指令很簡單,就是設置環境變量而已,無論是後面的其他指令,如RUN,還是運行時的應用,都可以直接使用這裏定義的環境變量。

ENV VERSION=1.0 DEBUG=on NAME="Leisure"
$VERSION # 使用環境變量

下列指令可以支持環境變量:ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD

ARG指令

ARG指令用於構建參數,和ENV的效果一樣,都是設置環境變量。格式如下:

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

和ENV不同的是,ARG所設置的構建環境的環境變量,在將來容器運行時是不會存在這些環境變量的。但是不要因此就使用ARG保存密碼之類的信息,因爲docker history還是可以看到所有值的。

Dockerfile中的ARG指令是定義參數名稱,以及定義其默認值。該默認值可以在構建命令docker build中用–build-arg <參數名>=<值>來覆蓋

VOLUME指令

該指令用於定義匿名卷,格式爲:

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

VOLUME <路徑>

VOLUME /data

運行時可以覆蓋這個掛載設置:

docker run -d -v mydata:/data mysql:5.7

在這行命令中,就使用了mydata這個命名卷掛載到了/data這個位置,替代了Dockerfile中定義的匿名卷的掛載配置。

EXPOSE指令

該指令用於聲明端口,格式爲:

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

EXPOSE指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會因爲這個聲明應用就會開啓這個端口的服務。

聲明端口的好處:

1)幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;

2)在運行時使用隨機端口映射時,也就是docker run -P時,會自動隨機映射EXPOSE的端口。

WORKDIR指令

該指令用於指定工作目錄,格式爲:

WORKDIR <工作目錄路徑>

使用WORKDIR指令可以來指定工作目錄(或稱爲當前目錄),以後各層的當前目錄就被改爲指定的目錄,如該目錄不存在,WORKDIR會幫你建立目錄。

初學者可能把Dockerfile等同於Shell腳本來書寫,這種錯誤理解還可能會導致初心下面這樣的錯誤:

RUN cd /app
RUN echo "hello" > world.txt

如果將這個Dockerfile進行構建鏡像運行後,會發現找不到/app/world.txt文件。

USER指令

該指令用於指定當前用戶,格式爲

USER <用戶名>

USER指令和WORKDIR相似,都是改變環境狀態並影響以後的層。USER只是幫你切換到指定用戶,這個用戶必須是事先建立好的,否則無法切換。

ONBUILD指令

ONBUILD是一個特殊的指令,它後面跟的是其他指令,比如RUN,COPY等,而這些指令,在當前鏡像構件時並不會被執行。只有當以當前鏡像爲基礎鏡像,去構建下一級鏡像的時候纔會被執行。Dockerfile中的其他指令都是爲了定製當前鏡像而準備的,唯有ONBUILD是爲了幫助別人定製自己而準備的。

MAINTAINER指令

用於指定作者,格式爲:

MAINTAINER

MAINTAINER leisure <leisure.wang>

end
學而時習之

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章