云計(jì)算-8-Dockerfile深度解析全

云計(jì)算-8-Dockerfile深度解析

  • ARG和ENV

    • ARG

    • ENV

  • **RUN 和 ENTRYPOINT**區(qū)別

    • **使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像**

    • **ENTRYPOINT配置容器啟動(dòng)時(shí)的執(zhí)行命令(不會(huì)被忽略,一定會(huì)被執(zhí)行,即使運(yùn)行 `docker run`時(shí)指定了其他命令)**

  • **ADD和COPY**

    • COPY

    • ADD

  • **EXPOSE**

ARG和ENV

ARG

ARG用于設(shè)置環(huán)境變量,只在build期間生效,run期無(wú)效

  • 例子:構(gòu)建arg_1的Dockerfile,我們還是以nginx為例,
FROM?nginx
ARG?arg1=22222
RUN???echo?'echo?"<h1>$1,?Docker!</h1>"?>?/usr/share/nginx/html/index.html'??>?./entrypoint.sh??\
????????&&?chmod?+rwx?./entrypoint.sh??\
????????&&?./entrypoint.sh?$arg1
  • 以上例子,我們構(gòu)建鏡像
docker?build?-t?mynginx:v1??-f?/root/arg_1?.
  • 運(yùn)行鏡像
docker?run?-it?--name?mynginx_arg1?-p?8881:80?-d?mynginx:v1
  • 看出運(yùn)行結(jié)果:

ARG指定的變量,在構(gòu)建鏡像的時(shí)候使用--build-arg <參數(shù)名> =值進(jìn)行傳遞,會(huì)覆蓋Dockerfile 中指定的同名參數(shù)

Dockerfile腳本還是上面的腳本,不過(guò)就是我們?cè)跇?gòu)建的時(shí)候進(jìn)行傳遞參數(shù)

  • 使用--build-arg傳遞ARG設(shè)置的參數(shù)
docker?build?-t?mynginx:v2?--build-arg?arg1=hahahah?-f?/root/arg_1?.
  • 運(yùn)行 mynginx:v2鏡像
docker?run?-it?--name?mynginx_arg2?-p?8882:80?-d?mynginx:v2

靈活使用ARG指令,可以在不修改Dockerfile的情況下,構(gòu)建不同鏡像

就像上面展示的,我們可以在構(gòu)建鏡像的時(shí)候,給參數(shù)傳遞不同的值,構(gòu)建出不同的鏡像

ENV

存在兩種格式

  • ENV
  • ENV==...

ENV指令和ARG指令特別相似,ARG在build的時(shí)候生效,ENV在 run的時(shí)候生效,都可以直接使用這里定義的環(huán)境變量。

docker run --env 可以修改這些值

  • 構(gòu)建env_1的Dockerfile,我們還是以nginx為例
FROM?nginx
ARG?arg1=1111
ENV?arg2=2222
RUN????echo?'echo?"<h1>$1,$2,?Docker!</h1>"?>?/usr/share/nginx/html/index.html'??>?./entrypoint.sh??\
????????&&?chmod?+rwx?./entrypoint.sh??\
????????&&?./entrypoint.sh?$arg1?$arg2??
  • 構(gòu)建鏡像
docker?build?-t?mynginx:v3?--build-arg?arg1=envtest?-f?/root/env_1?.
  • 運(yùn)行mynginx:v3鏡像
docker?run?-it?--name?mynginx_env1?-p?8883:80?--env?arg2=envtest2?-d?mynginx:v3
  • 查看結(jié)果

我們發(fā)現(xiàn)我們?cè)?code>docker run的時(shí)候使用--env的時(shí)候修改了arg2參數(shù),但是沒(méi)有生效

為什么我們?cè)赿ocker run使用--env指令的時(shí)候沒(méi)有生效呢?這是因?yàn)镈ockerfile中RUN 和 ENTRYPOINT存在區(qū)別

RUN 和 ENTRYPOINT區(qū)別

使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像

從上面 的ENV和ARG構(gòu)建鏡像的例子我們可以看出來(lái),RUN是在構(gòu)建鏡像的時(shí)候生效的,生效以后文件已經(jīng)生效,在docker run的時(shí)候,指令就不能再修改參數(shù)了

ENTRYPOINT配置容器啟動(dòng)時(shí)的執(zhí)行命令(不會(huì)被忽略,一定會(huì)被執(zhí)行,即使運(yùn)行 docker run時(shí)指定了其他命令)

  • 修改Dockerfile文件env_1為env_2腳本如下
FROM?nginx
ENV?arg2=2222
ENTRYPOINT??echo?'echo?"<h1>$1,?Docker!</h1>"?>?/usr/share/nginx/html/index.html'??>?./entrypoint.sh??\
????????&&?chmod?+rwx?./entrypoint.sh??\
????????&&?./entrypoint.sh?$arg2??\?
????????&&?exec?nginx?-g?'daemon?off;'
  • 構(gòu)建鏡像
docker?build?-t?mynginx:v4?--build-arg??-f?/root/env_2?.
  • 運(yùn)行mynginx:v4
docker?run?-it?--name?mynginx_env4?-p?8884:80?--env?arg2=envtest2?-d?mynginx:v4

ADD和COPY

COPY

格式:

  • COPY [--chown=:] <源路徑>... <目標(biāo)路徑>

  • COPY [--chown=:] ["<源路徑1>",... "<目標(biāo)路徑>"]

它和RUN一樣,有兩種格式,一種類(lèi)似命令,一種類(lèi)似函數(shù)調(diào)用,COPY指令將從構(gòu)建上下文目錄源路徑的文件、目錄復(fù)制到新的一層

鏡像內(nèi)的 <目標(biāo)路徑> 位置。

  • 構(gòu)建鏡像文件copy_1
FROM?nginx
COPY?index.html?/usr/share/nginx/html/index.html
  • 創(chuàng)建index.html
vi?index.html

index.html內(nèi)容

<h1>copy?test,?Docker!</h1>
  • 構(gòu)建鏡像
docker?build?-t?mynginx:v5??-f?/root/add/copy_1?.
  • 運(yùn)行鏡像
?docker?run?-it?--name?mynginx_copy?-p?8885:80?-d?mynginx:v5

查看運(yùn)行結(jié)果

ADD

同COPY用法,不過(guò) ADD擁有自動(dòng)下載遠(yuǎn)程文件和解壓的功能。

  • src 路徑必須在構(gòu)建的上下文中;不能使用 ../something /something 這種方式,因?yàn)閐ocker

  • 構(gòu)建的第一步是將上下文目錄(和子目錄)發(fā)送到docker守護(hù)程序。

  • 如果 src 是URL,并且 dest 不以斜杠結(jié)尾,則從URL下載文件并將其復(fù)制到 dest 。

  • 如果 dest 以斜杠結(jié)尾,將自動(dòng)推斷出url的名字(保留最后一部分),保存到 dest

  • 如果 src 是目錄,則將復(fù)制目錄的整個(gè)內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)。

EXPOSE

格式為 EXPOSE <端口1> [<端口2>...]。

  • EXPOSE指令通知Docker容器在運(yùn)行時(shí)在指定的網(wǎng)絡(luò)端口上進(jìn)行偵聽(tīng)??梢灾付ǘ丝谑莻陕?tīng)TCP還

是UDP,如果未指定協(xié)議,則默認(rèn)值為T(mén)CP。

  • EXPOSE指令實(shí)際上不會(huì)發(fā)布端口。它充當(dāng)構(gòu)建映像的人員和運(yùn)行容器的人員之間的一種文檔,即

有關(guān)打算發(fā)布哪些端口的信息。要在運(yùn)行容器時(shí)實(shí)際發(fā)布端口,請(qǐng)?jiān)赿ocker run上使用-p標(biāo)志發(fā)布

并映射一個(gè)或多個(gè)端口,或使用-P標(biāo)志發(fā)布所有公開(kāi)的端口并將其映射到高階端口

如果您覺(jué)得本文不錯(cuò),歡迎關(guān)注,點(diǎn)贊,收藏支持,您的關(guān)注是我堅(jiān)持的動(dòng)力!

公眾號(hào) springboot葵花寶典
主要分享JAVA技術(shù),主要包含SpringBoot、SpingCloud、Docker、中間件等技術(shù),以及Github開(kāi)源項(xiàng)目

原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處,感謝支持!如果本文對(duì)您有用,歡迎轉(zhuǎn)發(fā)分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容