云計算-8-Dockerfile深度解析
ARG和ENV
ARG
ENV
**RUN 和 ENTRYPOINT**區(qū)別
**使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像**
**ENTRYPOINT配置容器啟動時的執(zhí)行命令(不會被忽略舞吭,一定會被執(zhí)行揣非,即使運行 `docker run`時指定了其他命令)**
**ADD和COPY**
COPY
ADD
**EXPOSE**
ARG和ENV
ARG
ARG用于設(shè)置環(huán)境變量倚评,只在build期間生效彻桃,run期無效
- 例子:構(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?.
- 運行鏡像
docker?run?-it?--name?mynginx_arg1?-p?8881:80?-d?mynginx:v1
- 看出運行結(jié)果:
ARG指定的變量季惯,在構(gòu)建鏡像的時候使用--build-arg <參數(shù)名> =值
進(jìn)行傳遞,會覆蓋Dockerfile 中指定的同名參數(shù)
Dockerfile腳本還是上面的腳本吠各,不過就是我們在構(gòu)建的時候進(jìn)行傳遞參數(shù)
- 使用--build-arg傳遞ARG設(shè)置的參數(shù)
docker?build?-t?mynginx:v2?--build-arg?arg1=hahahah?-f?/root/arg_1?.
- 運行 mynginx:v2鏡像
docker?run?-it?--name?mynginx_arg2?-p?8882:80?-d?mynginx:v2
靈活使用ARG
指令,可以在不修改Dockerfile的情況下勉抓,構(gòu)建不同鏡像
就像上面展示的贾漏,我們可以在構(gòu)建鏡像的時候,給參數(shù)傳遞不同的值藕筋,構(gòu)建出不同的鏡像
ENV
存在兩種格式
- ENV
- ENV==...
ENV指令和ARG指令特別相似纵散,ARG在build的時候生效,ENV在 run的時候生效隐圾,都可以直接使用這里定義的環(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?.
- 運行mynginx:v3鏡像
docker?run?-it?--name?mynginx_env1?-p?8883:80?--env?arg2=envtest2?-d?mynginx:v3
- 查看結(jié)果
我們發(fā)現(xiàn)我們在docker run
的時候使用--env
的時候修改了arg2參數(shù)暇藏,但是沒有生效
為什么我們在docker run使用--env指令的時候沒有生效呢蜜笤?這是因為Dockerfile中RUN 和 ENTRYPOINT存在區(qū)別
RUN 和 ENTRYPOINT區(qū)別
使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像
從上面 的ENV和ARG構(gòu)建鏡像的例子我們可以看出來盐碱,RUN是在構(gòu)建鏡像的時候生效的把兔,生效以后文件已經(jīng)生效,在docker run的時候瓮顽,指令就不能再修改參數(shù)了
ENTRYPOINT配置容器啟動時的執(zhí)行命令(不會被忽略县好,一定會被執(zhí)行,即使運行 docker run
時指定了其他命令)
- 修改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?.
- 運行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一樣缕贡,有兩種格式,一種類似命令儒恋,一種類似函數(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?.
- 運行鏡像
?docker?run?-it?--name?mynginx_copy?-p?8885:80?-d?mynginx:v5
查看運行結(jié)果
ADD
同COPY用法,不過 ADD擁有自動下載遠(yuǎn)程文件和解壓的功能炬守。
src 路徑必須在構(gòu)建的上下文中牧嫉;不能使用 ../something /something 這種方式,因為docker
構(gòu)建的第一步是將上下文目錄(和子目錄)發(fā)送到docker守護(hù)程序减途。
如果 src 是URL酣藻,并且 dest 不以斜杠結(jié)尾,則從URL下載文件并將其復(fù)制到 dest 鳍置。
如果 dest 以斜杠結(jié)尾辽剧,將自動推斷出url的名字(保留最后一部分),保存到 dest
如果 src 是目錄税产,則將復(fù)制目錄的整個內(nèi)容怕轿,包括文件系統(tǒng)元數(shù)據(jù)偷崩。
EXPOSE
格式為 EXPOSE <端口1> [<端口2>...]
。
- EXPOSE指令通知Docker容器在運行時在指定的網(wǎng)絡(luò)端口上進(jìn)行偵聽撞羽〔保可以指定端口是偵聽TCP還
是UDP,如果未指定協(xié)議诀紊,則默認(rèn)值為TCP谒出。
- EXPOSE指令實際上不會發(fā)布端口。它充當(dāng)構(gòu)建映像的人員和運行容器的人員之間的一種文檔邻奠,即
有關(guān)打算發(fā)布哪些端口的信息笤喳。要在運行容器時實際發(fā)布端口,請在docker run上使用-p標(biāo)志發(fā)布
并映射一個或多個端口惕澎,或使用-P標(biāo)志發(fā)布所有公開的端口并將其映射到高階端口
如果您覺得本文不錯莉测,歡迎關(guān)注,點贊,收藏支持,您的關(guān)注是我堅持的動力唧喉!
原創(chuàng)不易干跛,轉(zhuǎn)載請注明出處子姜,感謝支持!如果本文對您有用楼入,歡迎轉(zhuǎn)發(fā)分享哥捕!