天天看點

cmd編譯可以通過執行沒有結果_Dockerfile中CMD和ENTRYPOINT的差別

Dockerfile中CMD和ENTRYPOINT的差別

在Dockerfile CMD是容器啟動時運作的指令,ENTERPOINT作用和CMD是類似的,那麼兩者有何差別呢?先上結論:

CMD在運作docker run指令時容易被覆寫,而ENTERPOINT不容易被覆寫
           

下面通過示例示範下來看兩者的差別?

Dockerfile

FROM alpine
CMD [ "/bin/echo","hello,world" ]
           

編譯之後運作,結果如下:

# docker build -t test-cmd .
# docker run test-cmd
hello,world
           

換下運作指令再來看:

# docker run test-cmd /bin/echo hello,code
hello,code
           

可以看到後面的

/bin/echo hello,code

替換掉了 CMD 中指定的指令。

再來看ENTRYPOINT

Dockerfile

FROM alpine
ENTRYPOINT [ "/bin/echo","hello,world"]
           

編譯之後運作,結果如下:

# docker build -t test-cmd .
# docker run test-cmd
hello,world
           

這裡可以看到 CMD 和 ENTRYPOINT作用其實是一緻的。

再将 CMD 和 ENTERYPOINT 組合在一起來看

Dockerfile

FROM alpine
ENTRYPOINT [ "/bin/echo"]
CMD [ "hello,world" ]
           

編譯之後運作:

# docker build -t test-cmd .
# docker run test-cmd
hello,world
           

這裡相當于運作了

/bin/echo hello,world

這個指令。

再次替換docker run的參數來看兩者的差別:

# docker run test-cmd hello,code
hello,code
           

我們在

docker run

後面添加了參數

hello,code

,相當于運作了

/bin/echo hello,code

,也就是用

hello,code

覆寫了CMD中的

hello,world

參數。

其實ENTRYPOINT也可以在docker run中添加參數來指定,隻不過麻煩點 要加 --entrypoint

還是上面的

Dockerfile

編譯運作。在

docker run

指令中用

/bin/ls

替換掉了

ENTRYPOINT

中的

/bin/echo

,用/bin/替換掉了

CMD

中的

hello,world

# docker build -t test-cmd .
# docker run --entrypoint="/bin/ls" test-cmd /bin/
arch
ash
base64
bbconfig
busybox
cat
chgrp
chmod
chown
conspy
cp
date
dd
df
...
           

總結

ENTRYPOINT

的目的和

CMD

一樣,都是在指定容器啟動程式及參數。

ENTRYPOINT

在運作時也可以替代,不過比

CMD

要略顯繁瑣,需要通過

docker run

的參數

--entrypoint

來指定。

當指定了

ENTRYPOINT

後,

CMD

的含義就發生了改變,不再是直接的運作其指令,而是将

CMD

的内容作為參數傳給

ENTRYPOINT

指令,換句話說實際執行時,将變為:

<ENTRYPOINT> "<CMD>"

這樣做有什麼好處呢?

  1. 通過将 ENTRYPOINT 和 CMD 組合起來就可以靈活地在docker run的時候指定需要的參數。
  2. 容器啟動時可能需要做一些初始化的工作,那麼可以在 ENTRYPOINT 來做這些事情(比如運作一個腳本來做初始化),用CMD來啟動容器
  • [1] <<第一本Docker書>>
  • [2] <<Docker從入門到實踐>>

繼續閱讀