1. 程式人生 > >使用Dockerfile建立映象

使用Dockerfile建立映象

Dockerfile是一個文字格式的配置檔案

1  基本結構

dockerfile由一行行命令語句組成,以#開頭的是註釋行

主體內容分四部分:

  •   基礎映象資訊
  •   維護者資訊
  •   映象操作指令
  •   容器啟動時執行指令

2  指令說明

Dockerfile中指令的一般格式為INSTRUCTION arguments

Dockerfile中的指令及說明

分類

指令

說明

配置指令

ARG

定義建立映象過程中使用的變數

FROM

指定所建立映象的基礎映象

LABEL

為生成的映象新增元資料標籤資訊

EXPOSE

宣告映象內服務監聽的埠

ENV

指定環境變數

ENTRYPOINT

指定映象的預設入口命令

VOLUME

建立一個數據卷掛載點

USER

指定執行容器時的使用者名稱或UID

WORKDIR

配置工作目錄

ONBUILD

建立子映象時指定自動執行的操作指令

STOPSIGNAL

指定退出的訊號值

HEALTHCHECK

配置所啟動容器如何進行健康檢查

SHELL

指定預設shell型別

操作指令

RUN

執行指定命令

CMD

啟動容器時指定預設執行的命令

ADD

新增內容到映象

COPY

複製內容到映象

 

2.1  配置指令

1)ARG

定義建立映象過程中使用的變數

格式:ARG  <name>[=<default value>]

在執行docker build時,可以通過-build-arg[=]來為變數賦值。當映象編譯成功後,ARG指定的變數將不再存在(ENV指定的變數將在映象中保留)

內建變數(不區分大小寫):HTTP_PROXY、HTTPS_PORXY、FTP_PROXY、NO_PROXY

 

2)FROM

指定所建立映象的基礎映象

格式:FROM  <image>  [AS <name>]或FROM  <image>:<tag>  [AS <name>]或

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

任何Dockerfile中第一條指令必須為FROM指定,如果在同一個Dockerfile中建立多個映象時,可以使用多個FROM指定(每個映象一次)

例:

ARG VERSION=9.3

FROM debian:${VERSION}

 

3)LABEL

可以為生成的映象新增元資料標籤資訊,這些資訊可以用來輔助過濾出特定映象

格式:LABEL  <key>=<value>  <key>=<value>  <key>=<value>...

例:

LABEL version="v1.0"

LABEL author="test" date="2018-12-05"

 

4)EXPOSE

宣告映象內服務監聽的埠

格式:EXPOSE  <port>  [<port>/<protocol>...]

只是起到宣告作用,並不會自動完成埠對映
例:

EXPOSE  22  80

 

5)ENV

指定環境變數,在映象生成過程中會被後續的RUN指定使用,在映象啟動的容器中也會存在

格式:ENV  <key>  <value> 或ENV  <key> =<value>

例:

ENV  VERSION=1.0

指令指定的環境變數在執行時可以被覆蓋掉,docker run --env <key>=<value> image

注:當一條ENV指定中同時為多個環境變數賦值並且值也是從環境變數讀取時,會為變數都賦值後再更新

例:

ENV  key1=value2

ENV  key1=value1  key2=${key1}

結果:key1=value1  key2=value2

 

6)ENTRYPOINT

指定映象的預設入口命令,會在啟動容器時作為根命令執行,所有傳入值作為該命令的引數

兩種格式:

  •   ENTRYPOINT  ["executable","param1","param2"]    exec呼叫指定
  •   ENTRYPOINT  command  param1  param2    shell中執行

  此時,CMD指定指定值將作為根命令的引數

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

  執行時,可以被--entrypoint引數覆蓋

7)VOLUME

建立一個數據卷掛載點

格式:VOLUME  ["/data"]

執行容器時可以從本地主機或其他容器掛載資料卷,一般用來存放資料庫和需要保持的資料等

 

8)USER

指定執行容器時的使用者名稱或UID,後續的RUN等指令也會使用指定的使用者身份

格式:USER  daemon

要臨時使用管理員許可權可以使用gosu命令

 

9)WORKDIR

為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄

格式:WORKDIR  /path/to/workdir

可以使用多個WORKDIR指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑

例:

WORKDIR  /a

WORKDIR  b

RUN  pwd

最終路徑為/a/b

 

10)ONBUILD

指定當基於所生成映象建立子映象時,自動執行的操作指令

格式:ONBUILD  [INSTRUCTION]
例:

建立父映象ParentImage中有:

ONBUILD  ADD  .  /app/sec

ONBUILD  RUN  /usr/local/bin/python-build  --dir  /app/src

使用docker build命令建立子映象ChildImage時(FROM ParentImage),會首先執行ParentImage中配置的ONBUILD指令:

#dockerfile for ChildIMage

FROM ParentImage

由於ONUBILD指令是隱式執行的,推薦在使用它的映象標籤中進行標註,如:ruby:2.1-onbuild;

ONBUILD指令在建立專門用於自動編譯、檢查等操作的基礎映象時,非常有用

 

11)STOPSIGNAL

指定所建立映象啟動的容器接收退出的訊號值

STOPSIGNAL signal

 

12)HEALTHCHECK

配置所啟動容器如何進行健康檢查(如何判斷健康與否)

兩種格式:

l  根據所執行命令返回值是否為0來判斷

HEALTHCHECK  [OPTIONS]  CMD  command

l  禁止基礎映象中的健康檢查

HEALTHCHECK  NONE

 

OPTINOS引數:

l  -interval=DURATION (default:30s)  過多久檢查一次

l  -timeout= DURATION (default:30s)  每次檢查等待結果的超時

l  -retries=N (default:3)  如果失敗了,重試幾次才最終確定失敗

 

13SHELL

指定其他命令使用shell時的預設shell型別

SHELL ["executable","parameters"]

 

預設值為["/bin/sh","-c"]

2.2  操作執行

1RUN

執行指定命令

格式:RUN  <command>RUN  ["executable","param1","param2"]

前者預設在shell終端中執行命令;後者指令會被解析為JSON陣列,因此必須用雙引號,使用exec執行,不會啟動shell環境

每條RUN指定將在當前映象基礎上執行指定命令,並提交為新的映象層

例:

RUN apt-get install -y nginx

RUN ["/bin/bash,"-c","echo hello"]

 

2CMD

用來指定啟動容器時預設執行的命令

三種格式:

l  CMD  ["executable","param1","param2"]  相當於執行executable param1 param2,推薦方式

l  CMD command param1 parma2  在預設shell中執行,提供給需要互動的應用

l  CMD ["param1","param2"]  提供給ENTRYPOINT的預設引數

每個Dockerfile只能有一條CMD命令。如果指定了多條命令,只有最後一條會被執行

 

3ADD

新增內容到映象,該命令複製指定的<src>路徑下內容到容器中的<dest>路徑下

格式:ADD  <src>  <dest>

其中<src>可以是Dokcerfile所在目錄的一個相對路徑(檔案或目錄);也可以是一個URL;還可以是一個tar檔案(自動解壓為目錄),<dest>可以是映象內絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑

路徑支援正則格式。例:

ADD  *.C  /code/

 

4COPY

複製內容到映象

格式:COPY  <src>  <dest>

複製本地主機<src>(為Dockerfile所在目錄的相對路徑,檔案或目錄)下內容到映象中的<dest>。目標路徑不存在,會自動建立,同樣支援正則格式

 

COPYADD指令功能類似,但使用本地目錄為源目錄時,推薦使用COPY

3       建立映象

編寫完成Dockerfile後,可以通過docker [image] build命令來建立映象

格式:docker  build  [OPTIONS]  PATH | URL | -

該命令將讀取指定路徑下(包括子目錄)的Dockerfile,並將該路徑下所有資料作為上下文傳送給Docker服務端。Docker服務端在校驗Dockerfile格式通過後,逐行執行其中定義的指令,碰到ADDCOPYRUN指令會生成一層新的映象。如果建立映象成功,會返回最終映象的ID

如果上下文過大,會導致傳送大量資料給服務端,延緩建立過程。因此除非是生成映象所必須的檔案,不然不要放到上下文路徑。

-f:指定使用非上下文路徑下的Dockerfile路徑

-t:指定生成映象的標籤資訊,可以重複使用多次為映象一次新增多個名稱

例:

docker build -t builder/first_image:1.0.0 /tmp/docker_builder

/tmp/docker_builder上下文路徑,builder/first_image:1.0.0標籤資訊

 

3.1  命令選項

docker [image] build命令選項及說明

選項

說明

--add-host  list

新增自定義的主機名到IP的對映

--build-arg  list

新增建立時的變數

--cache-from  strings

使用指定映象作為快取源

--cgroup-parent  string

繼承的上層cgroup

--compress

使用gzip來壓縮建立上下文資料

--cpu-period  int

分配的CFS排程器時長

--cpu-quota  int

CFS排程器總份額

-c,--cpu-shares  int

CPU權重

--cpuset-cpus  string

CPU允許使用的CPU

--cpuset-mems string

CPU允許使用的記憶體

--disable-content-trust

不進行映象校驗,預設為真

-f,--file  string

Dockerfile名稱

--force-rm

總是刪除中間過程的容器

--iidfile string

將映象ID寫入檔案

--isolation string

容器的隔離機制

--label list

配置映象的元資料

-m,--memory bytes

限制使用記憶體量

--memory-swap bytes

限制記憶體和快取的總量

--network string

指定RUN命令時的網路模式

--no-cache

建立映象時不適用快取

--platform string

指定平臺型別

--pull

總是嘗試獲取映象的最新版本

-q,--quiet

不列印建立過程中的日誌資訊

--rm

建立成功後自動刪除中間過程容器,預設為真

--security-opt strings

指定安全相關的選項

--shm-size bytes

/dev/shm的大小

--squash

將新建立的多層擠壓放入到一層中

--stream

持續獲取建立的上下文

-t,--tag list

指定映象的標籤列表

--target string

指定建立的目標階段

--ulimit ulimit

指定ulimit的配置

3.2  選擇父映象

父映象是生成映象的基礎,會直接影響到所生成映象的大小和功能

兩種父映象:

l  基礎映象(baseimage: Dockfile中往往不存在FROM指令,或基於scratch映象(FROM scratch),意味著其在整個映象樹中處於根的位置

例:提前編譯好的二進位制可執行檔案binary複製到映象中,執行容器時執行binary命令

FROM scratch

ADD binary /

CMD ["/binary"]

普通映象:由第三方建立,基於基礎映象,常見busyboxdebianubuntu

3.3  使用.dockerignore檔案

通過.dockerignore檔案(每一行新增一條匹配模式)來讓Docker忽略匹配路徑或檔案,在建立映象時候不將無關資料傳送到服務端

例:

#.dockerignore  #註釋行

*/temp*

tmp?

!README.md

 

dockerignore檔案中支援Golang風格的路徑正則格式

* 表示任意多個字元

代表單個字元

 

表示不匹配

3.4  多步驟建立

多步驟建立可以精簡最終生成的Docker映象

對於需要編譯的應用通常需要至少兩個環境的Docker映象

l  編譯環境映象:包括完整的編譯引擎、依賴庫等,往往比較龐大。作用是編譯應用為二進位制檔案

 

l  執行環境映象:利用編譯好的二進位制檔案,執行應用,由於不需要編譯環境,體積比較小

兩種格式:

l  根據所執行命令返回值是否為0來判斷

HEALTHCHECK  [OPTIONS]  CMD  command

l  禁止基礎映象中的健康檢查

HEALTHCHECK  NONE

 

OPTINOS引數:

l  -interval=DURATION (default:30s)  過多久檢查一次

l  -timeout= DURATION (default:30s)  每次檢查等待結果的超時

l  -retries=N (default:3)  如果失敗了,重試幾次才最終確定失敗

 

13SHELL

指定其他命令使用shell時的預設shell型別

SHELL ["executable","parameters"]

預設值為["/bin/sh","-c"]