Dockerfile是一個文本格式的配置文件python
dockerfile由一行行命令語句組成,以#開頭的是註釋行nginx
主體內容分四部分:docker
Dockerfile中指令的通常格式爲INSTRUCTION argumentsshell
Dockerfile中的指令及說明數據庫 |
||
分類ubuntu |
指令數組 |
說明緩存 |
配置指令安全 |
ARGruby |
定義建立鏡像過程當中使用的變量 |
FROM |
指定所建立鏡像的基礎鏡像 |
|
LABEL |
爲生成的鏡像添加元數據標籤信息 |
|
EXPOSE |
聲明鏡像內服務監聽的端口 |
|
ENV |
指定環境變量 |
|
ENTRYPOINT |
指定鏡像的默認入口命令 |
|
VOLUME |
建立一個數據卷掛載點 |
|
USER |
指定運行容器時的用戶名或UID |
|
WORKDIR |
配置工做目錄 |
|
ONBUILD |
建立子鏡像時指定自動執行的操做指令 |
|
STOPSIGNAL |
指定退出的信號值 |
|
HEALTHCHECK |
配置所啓動容器如何進行健康檢查 |
|
SHELL |
指定默認shell類型 |
|
操做指令 |
RUN |
運行指定命令 |
CMD |
啓動容器時指定默認執行的命令 |
|
ADD |
添加內容到鏡像 |
|
COPY |
複製內容到鏡像 |
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
指定鏡像的默認入口命令,會在啓動容器時做爲根命令執行,全部傳入值做爲該命令的參數
兩種格式:
此時,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) 若是失敗了,重試幾回才最終肯定失敗
13)SHELL
指定其餘命令使用shell時的默認shell類型
SHELL ["executable","parameters"]
默認值爲["/bin/sh","-c"]
1)RUN
運行指定命令
格式:RUN <command>或RUN ["executable","param1","param2"]
前者默認在shell終端中運行命令;後者指令會被解析爲JSON數組,所以必須用雙引號,使用exec執行,不會啓動shell環境
每條RUN指定將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像層
例:
RUN apt-get install -y nginx
RUN ["/bin/bash,"-c","echo hello"]
2)CMD
用來指定啓動容器時默認執行的命令
三種格式:
l CMD ["executable","param1","param2"] 至關於執行executable param1 param2,推薦方式
l CMD command param1 parma2 在默認shell中執行,提供給須要交互的應用
l CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數
每一個Dockerfile只能有一條CMD命令。若是指定了多條命令,只有最後一條會被執行
3)ADD
添加內容到鏡像,該命令複製指定的<src>路徑下內容到容器中的<dest>路徑下
格式:ADD <src> <dest>
其中<src>能夠是Dokcerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄),<dest>能夠是鏡像內絕對路徑,或者相對於工做目錄(WORKDIR)的相對路徑
路徑支持正則格式。例:
ADD *.C /code/
4)COPY
複製內容到鏡像
格式:COPY <src> <dest>
複製本地主機<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)下內容到鏡像中的<dest>。目標路徑不存在,會自動建立,一樣支持正則格式
COPY與ADD指令功能相似,但使用本地目錄爲源目錄時,推薦使用COPY
編寫完成Dockerfile後,能夠經過docker [image] build命令來建立鏡像
格式:docker build [OPTIONS] PATH | URL | -
該命令將讀取指定路徑下(包括子目錄)的Dockerfile,並將該路徑下全部數據做爲上下文發送給Docker服務端。Docker服務端在校驗Dockerfile格式經過後,逐行執行其中定義的指令,碰到ADD、COPY和RUN指令會生成一層新的鏡像。若是建立鏡像成功,會返回最終鏡像的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標籤信息
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 |
老是刪除中間過程的容器 |
將鏡像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的配置 |
父鏡像是生成鏡像的基礎,會直接影響到所生成鏡像的大小和功能
兩種父鏡像:
l 基礎鏡像(baseimage): 其Dockfile中每每不存在FROM指令,或基於scratch鏡像(FROM scratch),意味着其在整個鏡像樹中處於根的位置
例:提早編譯好的二進制可執行文件binary複製到鏡像中,運行容器時執行binary命令
FROM scratch
ADD binary /
CMD ["/binary"]
普通鏡像:由第三方建立,基於基礎鏡像,常見busybox、debian、ubuntu等
經過.dockerignore文件(每一行添加一條匹配模式)來讓Docker忽略匹配路徑或文件,在建立鏡像時候不將無關數據發送到服務端
例:
#.dockerignore #註釋行
*/temp*
tmp?
!README.md
dockerignore文件中支持Golang風格的路徑正則格式
* 表示任意多個字符
? 表明單個字符
! 表示不匹配
多步驟建立能夠精簡最終生成的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) 若是失敗了,重試幾回才最終肯定失敗
13)SHELL
指定其餘命令使用shell時的默認shell類型
SHELL ["executable","parameters"]
默認值爲["/bin/sh","-c"]