使用Dockerfile建立鏡像

Dockerfile是一個文本格式的配置文件python

1  基本結構

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

主體內容分四部分:docker

  •   基礎鏡像信息
  •   維護者信息
  •   鏡像操做指令
  •   容器啓動時執行指令

2  指令說明

Dockerfile中指令的通常格式爲INSTRUCTION argumentsshell

Dockerfile中的指令及說明數據庫

分類ubuntu

指令數組

說明緩存

配置指令安全

ARGruby

定義建立鏡像過程當中使用的變量

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"]

相關文章
相關標籤/搜索