Docker有一個(gè)默認(rèn)的入口點(diǎn),即/bin/sh -c
但是沒有默認(rèn)命令。
當(dāng)你像這樣經(jīng)營碼頭時(shí):docker run -i -t ubuntu bash
入口點(diǎn)是默認(rèn)的/bin/sh -c
,圖像是ubuntu
命令是bash
.
該命令通過入口點(diǎn)運(yùn)行。也就是說,實(shí)際執(zhí)行的事情是/bin/sh -c bash
..這允許Docker實(shí)現(xiàn)RUN
依賴于shell的解析器。
后來,人們要求能夠定制這個(gè),所以ENTRYPOINT
和--entrypoint
介紹了。
之后的一切ubuntu
在上面的例子中,是命令并傳遞給入口點(diǎn)。當(dāng)使用CMD
指令,就好像你在做docker run -i -t ubuntu <cmd>
. <cmd>
將是入口點(diǎn)的參數(shù)。
如果您輸入以下命令,也會(huì)得到相同的結(jié)果。docker run -i -t ubuntu
..您仍將在容器中啟動(dòng)bash shell,因?yàn)?/trans>Ubuntu Dockerfile指定默認(rèn)的CMD:CMD ["bash"]
當(dāng)一切都傳遞到入口點(diǎn)時(shí),您可以從圖像中得到非常好的行為。@Jiri示例很好,它展示了如何使用圖像作為“二進(jìn)制”。使用時(shí)["/bin/cat"]
作為切入點(diǎn)然后docker run img /etc/passwd
你明白了,/etc/passwd
是命令,并被傳遞到入口點(diǎn),因此最終結(jié)果的執(zhí)行是簡單的/bin/cat /etc/passwd
.
另一個(gè)例子是有任何cli作為入口點(diǎn)。例如,如果您有一個(gè)redis映像,而不是運(yùn)行docker run redisimg redis -H something -u toto get key
,你可以簡單地ENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
然后像這樣運(yùn)行,得到相同的結(jié)果:docker run redisimg get key
.