Dockerfile 可以用來構(gòu)建一個鏡像牢酵!
這個文件的指令分為兩大類:
1.配置指令
2.操作指令
配置指令:配置構(gòu)建鏡像中的基礎(chǔ)鏡像早龟,聲明鏡像的監(jiān)聽端口,指定環(huán)境變量等等!
操作指令:比如在安裝鏡像的時候執(zhí)行一些初始化操作目代,添加內(nèi)容到鏡像等等靴迫!
配置指令清單:
ARG 定義創(chuàng)建鏡像過程中使用的變量
FROM 指定所創(chuàng)建鏡像的基礎(chǔ)鏡像
LABEL 為生成的鏡像添加元數(shù)據(jù)標簽信息
EXPOSE 聲明鏡像內(nèi)服務(wù)監(jiān)聽的端口
ENV 指定環(huán)境變抵
ENTRYPOINT 指定鏡像的默認入口命令
VOLUME 創(chuàng)建一個數(shù)據(jù)卷掛載點
USER 指定運行容器時的用戶名或UID
WORKDIR 配置工作目錄
ONBUILD 創(chuàng)建子鏡像時指定自動執(zhí)行的操作指令
STOPSIGNAL 指定退出的信號值
HEALTH CHECK 配置所啟動容器如何進行健康檢查
SHELL 指定默認shell類型
操作清單
RUN 運行指定命令
CMD 啟動容器時指定默認執(zhí)行的命令
ADD 添加內(nèi)容到鏡像
COPY 復(fù)制內(nèi)容到鏡像
配置指令解析:
- ARG 指令:定義創(chuàng)建鏡像過程中使用的變量
在執(zhí)行 docker build 時, 可以通過-build-arg[=] 來為變量賦值盐碱。 當鏡像編譯成功后把兔, ARG 指定的變量將不再存在 (ENV 指定的變量將在鏡像中保留)。
Docker 內(nèi)置了 一 些鏡像創(chuàng)建變量瓮顽, 用戶可以直接使用而無須聲明县好, 包括(不區(qū)分大小寫) HTTP PROXY 、 HTTPS PROXY 暖混、 FTP PROXY 缕贡、 NO PROXY
2.FROM 指令:指定所創(chuàng)建鏡像的基礎(chǔ)鏡像
格式為 FROM <image> [AS <name>] 或 FROM <image>: <tag> [AS <name>]或FROM<image>@<digest> [AS <name>] 。
任何 Dockerfile 中第 一 條指令必須為 FROM 指令拣播。 并且晾咪, 如果在同 一 個 Dockerfile 中創(chuàng)建多個鏡像時, 可以使用多個 FROM 指令(每個鏡像 一 次)贮配。
可以選用centos作為基礎(chǔ)鏡像谍倦。 例如:
# 定義一個變量
ARG VERSION=7
# 引用變量
FROM centos:${VERSION}
- LABEL 指令:LABEL 指令可以為生成的鏡像添加元數(shù)據(jù)標簽信息。 這些信息可以用來輔助過濾出特定鏡像泪勒。
格式為 LABEL <key>=<value> <key>=<value> <key>=<value> ... 昼蛀。
例如:
LABEL version="0.0.1"
LABEL author="907147608@qq.com" date="2019-7-01"
LABEL description="這是一個指定標簽信息"
4.EXPOSE 指令:聲明鏡像內(nèi)服務(wù)監(jiān)聽的端口
格式為 EXPOSE <par七> [<par巨/<pro七ocol>... ]宴猾。
例如:
EXPOSE 22 80 8443
注意:該指令只是起到聲明作用, 并不會自動完成端口映射曹洽。
如果要映射端口出來鳍置, 在啟動容器時可以使用 -P 參數(shù) (Docker 主機會自動分配 一 個宿主機的臨時端口)或 -p HOST_PORT:CONTAINER_PORT 參數(shù)(具體指定所映射的本地端口)。
5.ENV 指令:指定環(huán)境變量送淆, 在鏡像生成過程中會被后續(xù)RUN指令使用税产, 在鏡像啟動的容器中也會存在。
格式為 ENV <key> <value>或ENV <key>=<value>
例如:
ENV APP_VERSION=l.0.0
ENV JAVA_HOME=/usr/local/jdk8
ENV PATH $PATH:/usr/local/jdk8/bin
指令指定的環(huán)境變量在運行時可以被覆蓋掉偷崩, 如 docker run --env <key>=<value> [build_image]
注意當 一 條 EN V 指令中同時為多個環(huán)境變量賦值并且值也是從環(huán)境變量讀取時辟拷, 會為變量都賦值后再更新。
如下面的指令阐斜, 最終結(jié)果為 keyl=valuel key2=value2
ENV keyl;value2
ENV keyl;valuel key2;${keyl}
6.ENTRYPOINT 指令:指定鏡像的默認入口命令衫冻, 該入口命令會在啟動容器時作為根命令執(zhí)行, 所有傳人值作為該命令的參數(shù)谒出。
支持兩種格式:
ENTRYPOINT ["executable", "paraml ", "param2"] 被 exec 調(diào)用執(zhí)行隅俘;
ENTRYPOINT command param 1 param2 被 shell 中執(zhí)行。
此時笤喳, CMD指令指定值將作為根命令的參數(shù)为居。每個Dockerfile 中只能有一個 ENTRYPOINT, 當指定多個時, 只有最后 一 個起效杀狡。
在運行時蒙畴, 可以被 --entrypoint 參數(shù)覆蓋掉, 如 docker run --entrypoint
7.VOLUME 指令:創(chuàng)建 一 個數(shù)據(jù)卷掛載點
格式為 VOLUME ["/data"]呜象。
運行容器時可以從本地主機或其他容器掛載數(shù)據(jù)卷膳凝, 一般用來存放數(shù)據(jù)庫和需要保持的
數(shù)據(jù)等。
- USER 指令:指定運行容器時的用戶名或urn, 后續(xù)的RUN等指令也會使用指定的用戶身份
格式為 USER daemon
當服務(wù)不需要管理員權(quán)限時恭陡,可以通過改命令指定運行用戶蹬音,并且還可以在Dockerfile中創(chuàng)建所需要的用戶。
例如:
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres
要獲取臨時管理員權(quán)限可以使用gosu命令
9.WORKDIR 指令:為RUN 休玩、CMD著淆、ENTRYPOINT 指定執(zhí)行的工作目錄!也就是在哪個路徑下執(zhí)行 RUN 哥捕、CMD牧抽、ENTRYPOINT 中命令嘉熊!比如在在 /xxx/xxx/java/ 路徑下執(zhí)行 java -version
建議使用絕對路徑遥赚,不要使用相對路徑
10.ONBUILD 指令:指定當基于生成鏡像創(chuàng)建子鏡像時,自動執(zhí)行的操作指令阐肤!
格式為 ONBUILD [INSTRUCTION]
例如:
# Dockerf ile for Parentimage
[....]
ONBUILD ADD ./app/src
ONBUILD RUN /usr/local/bin/python build --dir /app/src
[....]
使用docker build 命令創(chuàng)建子鏡像 ChildImage 時(FROM ParentImage),會首先執(zhí)行ParentImage中配置的ONBUILD 指令:
# Docker file for Chi ldi mage
FROM Parent i m age
等價于在ChildImage的Dockerfile中添加了如下指令:
ADD ./app/src
RUN /usr/local/bin/python build --dir /app/src
由于ONBUILD 指令是隱式的凫佛,推薦在使用它的鏡像標簽中進行標注讲坎,例如:xxx:0.0.1-onbuild
ONBUILD 指令在創(chuàng)建專門用于自動編譯、檢查等操作的基礎(chǔ)鏡像時愧薛,十分有用晨炕!
11.STOPSIGNAL 指令:指定所創(chuàng)建鏡像啟動的容器接受瑞出的信號值
STOPSIGNAL signal
12.HEALTHCHECK 指令:感覺用的不多...
13.SHELL 指令:指定其他命令使用shell時的默認 shell 類型:
默認值:["/bin/sh", "-c"]
SHELL [” executable ”,” parameters ”]
操作指令
1.RUN 指令:運行指定的命令
格式為:RUN <command> 或 RUN ["exectable","param1","param2"]
注意后者指定需要用雙引號,因為會被解析成JSON數(shù)組毫炉。前者默認將shell終端中運行命令瓮栗,即:/bin/sh -c;后者通過 exec 執(zhí)行瞄勾,不啟動 shell 環(huán)境!
// 拉取JDK8壓縮包
RUN wget=http://xxxxx.com/jdk8.tar
2.CMD 指令:CMD指令用來指定啟動容器時默認的命令
格式有三種:
CMD ["executable","param1","param2"] 相當于執(zhí)行 executable param1 param2 這個方式推薦费奸。
CMD command param1 param2 在默認的Shell中執(zhí)行,提供給需要交互的應(yīng)用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數(shù)
注意:每個Dockerfile只能執(zhí)行一胎CMD命令进陡。如果指定了多條愿阐,至于最后一條會被執(zhí)行!
3.ADD 指令:添加內(nèi)容到鏡像
格式為 ADD <src> <dest>
這個命令將復(fù)制指定的<src>路徑下內(nèi)容到容器中的<dest>路徑下趾疚。
其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄)缨历;也可以是一個URL;還可以是一個tar文件(自動解壓為目錄) <dest> 可以是鏡像內(nèi)絕對路徑糙麦,或者相對工作目錄的相對路徑.
路徑支持正則格式辛孵,例如:
ADD *.c /data/code/
4.COPY 指令:復(fù)制內(nèi)容到鏡像
格式為 COPY <src> <dest>
復(fù)制本地主機的<src> (為Dockerfile 所在目錄的相對路徑, 文件或目錄) 下內(nèi)容到鏡像中的<dest>。目標路徑不存在時喳资,會自動創(chuàng)建觉吭。
路徑同樣支持正則格式!
COPY 與 ADD 功能相似仆邓,當使用本地目錄為源目錄時鲜滩,推薦使用COPY
創(chuàng)建鏡像命令:
docker build [OPTIONS] PATH | URL | -
可選參數(shù):
-add-host 參數(shù)類型 list :添加自定義的主機名到IP的映射
-build-arg 參數(shù)類型 list:添加創(chuàng)建時的變量
-cache-from 參數(shù)見類型 strings:使用指定鏡像作為緩存源
-cgroup-parent 參數(shù)類型 string:繼承的上層cgroup
-compress : 使用gzip來壓縮創(chuàng)建上下文數(shù)據(jù)
-cpu-period 參數(shù)類型 int:分配的CFS調(diào)度器長度
-cpu-quota 參數(shù)類型 int:CFS調(diào)度器總份額
-c, -cpu-shares 參數(shù)類型int:CPU權(quán)重
-cpuset-cpus 參數(shù)類型 string:多cpu允許使用的CPU
-cpuset-mems 參數(shù)類型 string:多CPU允許使用的內(nèi)存
-disable-content-trust :不進行鏡像校驗,默認為真
-f, - file 參數(shù)類型 string:Dockerfile名稱
-force-rm : 總是刪除中間過程的容器
-iidfile 參數(shù)類型 string:將鏡像ID寫入到文件
-isolation 參數(shù)類型 string:容器的隔離機制
-label 參數(shù)類型 list:配置鏡像的元數(shù)據(jù)
-m, -memory 參數(shù)類型 bytes:限制使用的內(nèi)存量
-memory-swap 參數(shù)類型 bytes:限制內(nèi)存和緩存的總量
-network 參數(shù)類型 string:指定RUN命令時的網(wǎng)絡(luò)模式
-no-cache :創(chuàng)建鏡像時不適用緩存
-platform 參數(shù)類型 string:指定平臺類型
-pull :總是嘗試獲取鏡像的最新版本
-q, -quiet :不打印創(chuàng)建過程中的日志信息
-rm:創(chuàng)建成功后自動刪除中間過程容器节值,默認為真
-security-opt 參數(shù)類型 strings:指定安全相關(guān)的選項
-shm-size 參數(shù)類型 bytes:/dev/shm 的大小
-squash :將新創(chuàng)建的多層擠壓放入到一層中
-stream:持續(xù)獲取創(chuàng)建的上下文
-t, -tag 參數(shù)類型 list:指定鏡像的標簽列表
-target 參數(shù)類型 string:指定創(chuàng)建的目標階段
-ulimit 參數(shù)類型 ulimit:指定 ulimit 的配置