一、cmd:
cmd給出的是一個容器的默認(rèn)的可執(zhí)行體。也就是容器啟動以后,默認(rèn)的執(zhí)行的命令。重點就是這個“默認(rèn)”。意味著,如果docker run沒有指定任何的執(zhí)行命令或者dockerfile里面也沒有entrypoint,那么,就會使用cmd指定的默認(rèn)的執(zhí)行命令執(zhí)行。同時也從側(cè)面說明了entrypoint的含義,它才是真正的容器啟動以后要執(zhí)行命令。
The CMD instruction has three forms:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
用法1:帶有中括號的形式
帶有中括號的形式。這時,命令沒有再任何shell終端環(huán)境下,如果我們要執(zhí)行shell,必須把shell加入到中括號的參數(shù)中。這種用法就像一個c語言的exec函數(shù),意思是我們要執(zhí)行一個進(jìn)程。如果采用非shell的方法,那么上面的例子要修改為:
FROM centos
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
注意:采用中括號形式,那么第一個參數(shù)必須是命令的全路徑才行。而且,一個dockerfile至多只能有一個cmd,如果有多個,只有最后一個生效。官網(wǎng)推薦采用這種方法。
當(dāng)然,以上都是體現(xiàn)了cmd的“默認(rèn)”行為。如果我們在run時指定了命令或者有entrypoint,那么cmd就會被覆蓋。仍然是上面的image。run命令變了:
可以看到,最終容器里面執(zhí)行的是run命令后面的命令,而不是cmd里面定義的。
用法2:shell form,即沒有中括號的形式
那么命令command默認(rèn)是在“/bin/sh -c”下執(zhí)行的。比如下面的dockerfile:
FROM centos
CMD echo "hello cmd!"
運行:
注意:采用中括號形式,那么第一個參數(shù)必須是命令的全路徑才行。而且,一個dockerfile至多只能有一個cmd,如果有多個,只有最后一個生效。
二、entrypoint:
entrypoint才是正統(tǒng)地用于定義容器啟動以后的執(zhí)行體的,其實我們從名字也可以理解,這個是容器的“入口”。
有兩種用法:命令行和shell。
ENTRYPOINT has two forms:
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
第一種:命令行模式,也就是帶中括號
和cmd的中括號形式是一致的,但是這里貌似是在shell的環(huán)境下執(zhí)行的,與cmd有區(qū)別。如果run命令后面有東西,那么后面的全部都會作為entrypoint的參數(shù)。如果run后面沒有額外的東西,但是cmd有,那么cmd的全部內(nèi)容會作為entrypoint的參數(shù),這同時是cmd的第二種用法。這也是網(wǎng)上說的entrypoint不會被覆蓋。當(dāng)然如果要在run里面覆蓋,也是有辦法的,使用–entrypoint即可。
例如:
dockerfile為:
FROM centos
CMD ["p in cmd"]
ENTRYPOINT ["echo"]
如果run不帶參數(shù):
如果run帶參數(shù):
而且,確實entrypoint的中括號形式下,command是在shell環(huán)境下運行的,否則這里的echo是無法被執(zhí)行的。
第二種:shell模式
在這種模式下,任何run和cmd的參數(shù)都無法被傳入到entrypoint里。官網(wǎng)推薦第一種用法。
例如:
FROM centos
CMD ["p in cmd"]
ENTRYPOINT echo
文章來源:http://www.zghlxwxcb.cn/news/detail-744186.html
三、總結(jié):
一般還是會用entrypoint的中括號形式作為docker 容器啟動以后的默認(rèn)執(zhí)行命令,里面放的是不變的部分,可變部分比如命令參數(shù)可以使用cmd的形式提供默認(rèn)版本,也就是run里面沒有任何參數(shù)時使用的默認(rèn)參數(shù)。如果我們想用默認(rèn)參數(shù),就直接run,否則想用其他參數(shù),就run 里面加參數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-744186.html
到了這里,關(guān)于docker 系列之 Dockerfile 文件里 cmd命令與entrypoint命令區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!