云計(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.htmlindex.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)力!

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