工業(yè)皮帶怎么做免費(fèi)的網(wǎng)站企業(yè)官網(wǎng)怎么做
RUN
在構(gòu)建過程中在鏡像中執(zhí)行命令。CMD
容器創(chuàng)建時(shí)的默認(rèn)命令。(可以被覆蓋)ENTRYPOINT
容器創(chuàng)建時(shí)的主要命令。(不可被覆蓋)
指令介紹
1.RUN
在構(gòu)建過程中在鏡像中執(zhí)行命令,是在 docker build中執(zhí)行
2.CMD
作用:為啟動(dòng)的容器指定默認(rèn)要運(yùn)行的程序,程序運(yùn)行結(jié)束,容器也就結(jié)束。CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運(yùn)行的程序所覆蓋。 在docker run 時(shí)運(yùn)行。
注意:如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。
CMD <shell 命令>
CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認(rèn)參數(shù)
3.ENTRYPOINT
類似于 CMD 指令,但其不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。
但是, 如果運(yùn)行 docker run 時(shí)使用了 --entrypoint 選項(xiàng),將覆蓋 ENTRYPOINT 指令指定的程序。
優(yōu)點(diǎn):在執(zhí)行 docker run 的時(shí)候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。
注意:如果 Dockerfile 中如果存在多個(gè) ENTRYPOINT 指令,僅最后一個(gè)生效。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
CMD和ENTRYPOINT區(qū)別以及搭配使用
ENTRYPOINT
指令和 CMD
指令的工作方式類似,但它們之間有一個(gè)關(guān)鍵區(qū)別:ENTRYPOINT
指定的程序不會(huì)被 docker run
命令行參數(shù)覆蓋,而命令行參數(shù)會(huì)被當(dāng)作參數(shù)傳遞給 ENTRYPOINT
指定的程序。
理解示例
1. Dockerfile 示例
假設(shè)我們?cè)?Dockerfile
中使用 ENTRYPOINT
指令:
FROM ubuntu
ENTRYPOINT ["echo", "Hello"]
在這個(gè) Dockerfile
中,echo
是 ENTRYPOINT
指定的程序,而 "Hello"
是它的默認(rèn)參數(shù)。
2. 運(yùn)行容器時(shí)傳遞參數(shù)
當(dāng)你使用 docker run
運(yùn)行鏡像時(shí),如果你在命令行中傳遞了額外的參數(shù),這些參數(shù)會(huì)被附加到 ENTRYPOINT
指定的程序之后,作為它的參數(shù)。
例如:
docker run my-ubuntu World
這個(gè)命令不會(huì)覆蓋 ENTRYPOINT
,而是將 World
作為參數(shù)傳遞給 echo
,最終執(zhí)行的命令是:
echo Hello World
輸出結(jié)果:
Hello World
在這個(gè)例子中,docker run my-ubuntu World
將命令行參數(shù) World
傳遞給了 echo
命令,使得最終的執(zhí)行效果是輸出 Hello World
。
3. 與 CMD 的區(qū)別
如果你在 Dockerfile
中使用的是 CMD
而不是 ENTRYPOINT
,那么 docker run
中的參數(shù)會(huì)完全覆蓋 CMD
指定的默認(rèn)命令。
例如:
FROM ubuntu
CMD ["echo", "Hello"]
運(yùn)行 docker run my-ubuntu World
時(shí),World
會(huì)覆蓋 CMD
中的 echo Hello
,最終執(zhí)行的命令是:
World
這會(huì)導(dǎo)致 docker: Error response from daemon: OCI runtime create failed
的錯(cuò)誤,因?yàn)?World
不是有效的命令。
4. 結(jié)合 CMD
和 ENTRYPOINT
你還可以結(jié)合 ENTRYPOINT
和 CMD
來提供更靈活的默認(rèn)行為。例如:
FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello"]
在這種情況下,ENTRYPOINT
始終會(huì)執(zhí)行 echo
,而 CMD
中的 "Hello"
是默認(rèn)參數(shù)。如果你運(yùn)行:
docker run my-ubuntu
輸出結(jié)果是:
Hello
但是,如果你運(yùn)行:
docker run my-ubuntu World
這時(shí),World
會(huì)覆蓋 CMD
的 "Hello"
,并作為參數(shù)傳遞給 echo
,輸出:
World
總結(jié)
ENTRYPOINT
不會(huì)被docker run
命令行參數(shù)覆蓋,命令行參數(shù)會(huì)傳遞給ENTRYPOINT
指定的程序。CMD
可以被docker run
覆蓋,且默認(rèn)參數(shù)會(huì)在沒有額外命令行參數(shù)時(shí)生效。