首頁  >  文章  >  運維  >  docker下entrypoint和cmd的差別是什麼?

docker下entrypoint和cmd的差別是什麼?

coldplay.xixi
coldplay.xixi原創
2020-07-27 11:20:4010475瀏覽

docker下entrypoint和cmd的差異是:1、CMD指令執行一個可執行的檔案並提供參數,可以為ENTRYPOINT指定參數;2、ENTRYPOINT指令本身也可以包含參數,變動的參數不會被覆蓋。

docker下entrypoint和cmd的差別是什麼?

docker下entrypoint和cmd的差異是:

1、CMD指令:

CMD在容器執行的時候提供一些指令及參數,用法如下:

  • #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)

第一種用法:執行一個可執行的檔案並提供參數。

第二種用法:為ENTRYPOINT指定參數。

第三種用法(shell form):是以”/bin/sh -c”的方法執行的命令。

如你指定:

CMD [“/bin/echo”, “this is a echo test ”]

build後運行(假設鏡像名為ec):

docker run ec

就會輸出:

this is a echo test

是不是感覺很像開機啟動項,你可以暫時這樣理解。

 

注意點:

#docker run指令如果指定了參數會把CMD裡的參數覆寫: (這裡說明一下,如:docker run -it ubuntu /bin/bash 指令的參數是指/bin/bash 而非-it ,-it只是docker 的參數,而不是容器的參數,以下所說參數皆如此。)

同樣是上面的ec鏡像啟動:

docker run ec /bin/bash

就不會輸出:

this is a echo test

因為CMD指令被」/bin/bash」覆寫了。

 

2、ENTRYPOINT指令 

#字面上就是進入點,而它的功能也恰如其意。它可以讓你的容器功能表現得像一個可執行程式。

容器功能表現得像一個可執行程式一樣,這是什麼意思呢?

直接給個例子好說話:

範例一:

使用下面的ENTRYPOINT建構映像:

ENTRYPOINT ["/bin/echo"]

那麼docker build出來的映像以後的容器功能就像一個/bin/echo程式:

例如我build出來的鏡像名稱叫imageecho,那麼我可以這樣用它:

docker  run  -it  imageecho  “this is a test”

這裡就會輸出”this is a test”這串字符,而這個imageecho鏡像對應的容器表現出來的功能就像一個echo程式一樣。你加的參數「this is a test」會加到ENTRYPOINT後面,就成了這樣 /bin/echo “this is a test” 。現在你應該明白進入點的意思了吧。

範例二:

ENTRYPOINT ["/bin/cat"]

建構出來的鏡像你可以這樣運行(假設名為st):

docker run -it st /etc/fstab

這樣相當: /bin/cat  /etc /fstab 這個指令的作用。運行之後就輸出/etc/fstab裡的內容。

ENTRYPOINT有兩種寫法:    

寫法一:

ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)

寫法二:

ENTRYPOINT command param1 param2 (shell form)

你也可以在docker run指令時使用–entrypoint指定(但是只能用寫法一)。

下面是我把ENTRYPOINT設為[“/bin/sh -c”]時候運行的情況:

  • linux-oj9e:/home/lfly/project /docker # docker run -it  t2  /bin/bash

  • root@4c8549e7ce3e:/# ps

  • PID TTY  

  • 1 ?        00:00:00  sh

  • 9 ?        00:00:00  bash

  • 19 ?        00:00:00  ps

可以看到PID為1的進程運作的是sh,而bash只是sh的一個子進程,

/bin/bash只是作為 /bin/sh -c後面的參數。

CMD可以為ENTRYPOINT提供參數,ENTRYPOINT本身也可以包含參數,但是你可以把那些可能需要變動的參數寫到CMD里而把那些不需要變動的參數寫到ENTRYPOINT裡面例如:

FROM  ubuntu:14.10
ENTRYPOINT  ["top", "-b"]
CMD  ["-c"]

把可能需要變動的參數寫到CMD裡面。然後你可以在docker run裡指定參數,這樣CMD裡的參數(這裡是-c)就會被覆掉而ENTRYPOINT裡的不會被覆寫。

相關教學推薦:

docker教學

以上是docker下entrypoint和cmd的差別是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn