ホームページ  >  に質問  >  本文

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_lee2761日前788

全員に返信(2)返信します

  • ringa_lee

    ringa_lee2017-04-21 10:57:46

    走行タイミングが異なります。

    RUN はビルド中、CMD および ENTRYPOINT の前に実行されます。 Build が完了し、RUN が完了したら、CMD または ENTRYPOINT を再度実行します。

    ENTRYPOINT と CMD の違いは、docker run の実行時にパラメーターが渡される方法にあります。たとえば、CMD で指定した場合、CMD で指定されたコマンドは、

    で渡されるコマンドによってオーバーライドされます。 リーリー

    それでは走ります

    リーリー

    その後、CMD で指定されたエコーは新しく指定されたエコーによって上書きされるため、最終的には echo foo を実行するのと同じになり、最終的に出力される結果は次のようになります: echo foo,所以最终打印出的结果就是:

    ...
    CMD ["echo"]
    

    而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖),比如:

    docker run CONTAINER_NAME echo foo
    

    然后运行

    foo
    

    则CONTAINER_NAME后面的echo foo都作为参数传递给ENTRYPOING里指定的echo命令了,所以相当于执行了

    ...
    ENTRYPOINT ["echo"]
    

    最终打印出的结果就是:

    docker run CONTAINER_NAME echo foo
    

    另外,在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前,比如:

    echo "echo foo"
    

    执行

    echo foo
    

    相当于执行了:

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

    打印出的结果就是:

    docker run CONTAINER_NAME bar
    

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

    执行docker run命令时,也可以添加-entrypoint参数,会把指定的参数继续传递给ENTRYPOINT,例如:

    echo foo bar
    

    然后执行:

    foo bar
    

    那么,就相当于执行了echo foo bar リーリー

    そして、ENTRYPOINT は、コンテナー名の後のすべてをパラメーターとして指定されたコマンドに渡します (コマンドは上書きされません)。次に例を示します。

    リーリー

    それでは走ります

    リーリー
    その後、CONTAINER_NAME以降のecho fooがENTRYPOINGで指定したechoコマンドにパラメータとして渡されるので実行と同等になります

    リーリー

    最終的な印刷結果は次のとおりです:

    リーリー

    さらに、Dockerfile では、ENTRYPOINT で指定されたパラメーターは、次のような docker run の実行時に指定されたパラメーターよりも前になります。 リーリー

    実行🎜 リーリー 🎜実行と同等: 🎜 リーリー 🎜印刷結果は次のとおりです: 🎜 リーリー 🎜Dockerfile で指定できる ENTRYPOINT は 1 つだけです。複数指定した場合は、最後の 1 つだけが有効になります。 🎜 🎜 docker run コマンドを実行するときに、-entrypoint パラメーターを追加することもできます。これにより、指定されたパラメーターが引き続き ENTRYPOINT に渡されます。例: 🎜 リーリー 🎜次に実行します: 🎜 リーリー 🎜その後、これは echo foo bar を実行するのと同じになり、最終結果は 🎜 となります。 リーリー 🎜RUN、CMD、ENTRYPOINTの違いについて語ったdockboard.orgの記事「15 Docker Tips in 15 Minutes」を翻訳しましたので参考にしてください。 🎜 🎜Docker Quicktips シリーズもあり、その中に ENTRYPIONT について説明した記事もあります。リンクはこちらからご覧いただけます: 🎜http://www.tech-d.net/2014/01/ 27/docker-quicktip-1-entrypoint/🎜 🎜この一連の記事の翻訳はすぐに dockboard.org に追加される予定ですので、しばらくお待ちください。 🎜 🎜さらに、公式ドキュメントのエントリポイントの説明は次のとおりです: 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
  • キャンセル返事