docker Dockerfile文件

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)容到鏡像

配置指令解析:

  1. 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}
  1. 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ù)等。

  1. 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  的配置

完整的例子:

通過Dockerfile構(gòu)建SpringCloud的 Eureka 服務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徙硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搞疗,更是在濱河造成了極大的恐慌嗓蘑,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿乃,死亡現(xiàn)場離奇詭異桩皿,居然都是意外死亡,警方通過查閱死者的電腦和手機幢炸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門股耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻蹋,“玉大人铐刘,你說我怎么就攤上這事÷甙模” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵暖呕,是天一觀的道長斜做。 經(jīng)常有香客問我,道長湾揽,這世上最難降的妖魔是什么瓤逼? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮库物,結(jié)果婚禮上抛姑,老公的妹妹穿的比我還像新娘。我一直安慰自己艳狐,他們只是感情好定硝,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著毫目,像睡著了一般蔬啡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镀虐,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天箱蟆,我揣著相機與錄音,去河邊找鬼刮便。 笑死空猜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的恨旱。 我是一名探鬼主播辈毯,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搜贤!你這毒婦竟也來了谆沃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仪芒,失蹤者是張志新(化名)和其女友劉穎唁影,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂名,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡据沈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了饺蔑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌介。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖膀钠,靈堂內(nèi)的尸體忽然破棺而出掏湾,到底是詐尸還是另有隱情,我是刑警寧澤肿嘲,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布融击,位于F島的核電站,受9級特大地震影響雳窟,放射性物質(zhì)發(fā)生泄漏尊浪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一封救、第九天 我趴在偏房一處隱蔽的房頂上張望拇涤。 院中可真熱鬧,春花似錦誉结、人聲如沸鹅士。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掉盅。三九已至,卻和暖如春以舒,著一層夾襖步出監(jiān)牢的瞬間趾痘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工蔓钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留永票,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓滥沫,卻偏偏與公主長得像侣集,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兰绣,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355