搜尋

首頁  >  問答  >  主體

Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?

如题,我一般是用CMD来指定的,比如:

FROM thelanddownunder
MAINTAINER ProgrammingLife

CMD ["apt-get install htop"]

但是看一些Dockerfile里也有用ENTRYPOINT来指定的,就是把上面的CMD换成ENTRYPOINT,后面好像也是指定一些命令的:

FROM thelanddownunder
MAINTAINER ProgrammingLife

ENTRYPOINT ["apt-get install htop"]

请问这两种方法有什么不一样的吗?另外,还有用RUN来指定命令的,语法和上面两种又不太一样,比如这样:

FROM thelanddownunder
MAINTAINER ProgrammingLife

RUN apt-get install htop
ENTRYPOINT ["apt-get install vim"]
ringa_leeringa_lee2777 天前811

全部回覆(2)我來回復

  • ringa_lee

    ringa_lee2017-04-21 10:57:46

    運行時機不太一樣。

    RUN是在Build時運行的,先於CMD和ENTRYPOINT。 Build完成了,RUN也運行完成後,再運行CMD或ENTRYPOINT。

    ENTRYPOINT和CMD的不同點在於執行docker run時參數傳遞方式,CMD指定的指令可以被docker run傳遞的指令覆寫,例如,如果用CMD指定:

    ...
    CMD ["echo"]
    

    然後運行

    docker run CONTAINER_NAME echo foo
    

    那麼CMD裡指定的echo會被新指定的echo覆蓋,所以最終相當於運行echo foo,所以最終打印出的結果就是:

    foo
    

    而ENTRYPOINT會把容器名稱後面的所有內容都當成參數傳遞給其指定的命令(不會對指令覆蓋),例如:

    ...
    ENTRYPOINT ["echo"]
    

    然後運行

    docker run CONTAINER_NAME echo foo
    

    則CONTAINER_NAME後面的echo foo都作為參數傳遞給ENTRYPOING裡指定的echo指令了,所以相當於執行了

    echo "echo foo"
    

    最終印出來的結果是:

    echo foo
    

    另外,在Dockerfile中,ENTRYPOINT指定的參數比執行docker run時指定的參數更靠前,例如:

    ...
    ENTRYPOINT ["echo", "foo"]
    

    執行

    docker run CONTAINER_NAME bar
    

    相當於執行了:

    echo foo bar
    

    印出來的結果是:

    foo bar
    

    Dockerfile中只能指定一個ENTRYPOINT,如果指定了很多,只有最後一個有效。

    執行docker run指令時,也可以加入-entrypoint參數,會把指定的參數繼續傳遞給ENTRYPOINT,例如:

    ...
    ENTRYPOINT ["echo","foo"]
    

    然後執行:

    docker run CONTAINER_NAME bar #注意没有echo
    

    那麼,就等於執行了echo foo bar,最終結果就是

    foo bar
    

    我在dockboard.org上翻譯了一篇《15 Docker Tips in 15 Minutes》,其中有講到RUN、CMD和ENTRYPOINT的不同,你可以參考一下。

    另外有一個Docker Quicktips系列,裡面有一篇也是講ENTRYPIONT的,你可以看一下,連接在這裡:
    http://www.tech-d.net/2014/01/27/docker-quicktip-1- entrypoint/

    這個系列的文章翻譯我們馬上也會添加到dockboard.org的,請關註一下哈。

    另外這裡有官方文件中對entrypoint的說明:http://docs.docker.io/en/latest/reference/builder/#entrypoint

    回覆
    0
  • PHPz

    PHPz2017-04-21 10:57:46

    在Dockerfile檔案中,如果有ENTRYPOINT和CMD,那麼CMD就是ENTRYPOINT的參數,如果沒有ENTRYPOINT,CMD就是預設執行指令

    回覆
    0
  • 取消回覆