Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours786

répondre à tous(2)je répondrai

  • ringa_lee

    ringa_lee2017-04-21 10:57:46

    Le timing de course est différent.

    RUN est exécuté pendant la construction, avant CMD et ENTRYPOINT. Une fois la construction terminée et RUN terminé, exécutez à nouveau CMD ou ENTRYPOINT.

    La différence entre ENTRYPOINT et CMD réside dans la façon dont les paramètres sont transmis lors de l'exécution de Docker Run. La commande spécifiée par CMD peut être remplacée par la commande passée par Docker Run. Par exemple, si elle est spécifiée avec CMD :

    .
    ...
    CMD ["echo"]
    

    Puis exécutez

    docker run CONTAINER_NAME echo foo
    

    Ensuite, l'écho spécifié dans CMD sera écrasé par l'écho nouvellement spécifié, donc cela équivaut finalement à exécuter echo foo, donc le résultat final imprimé est :

    foo
    

    Et ENTRYPOINT transmettra tout ce qui suit le nom du conteneur en tant que paramètres à la commande spécifiée (la commande ne sera pas écrasée), comme :

    ...
    ENTRYPOINT ["echo"]
    

    Puis exécutez

    docker run CONTAINER_NAME echo foo
    

    Ensuite, les echo foo après CONTAINER_NAME sont passés en paramètres à la commande echo spécifiée dans ENTRYPOING, cela équivaut donc à exécuter

    echo "echo foo"
    

    Le résultat final imprimé est :

    echo foo
    

    De plus, dans le Dockerfile, les paramètres spécifiés par ENTRYPOINT sont antérieurs aux paramètres spécifiés lors de l'exécution de docker run, tels que :

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

    Exécuter

    docker run CONTAINER_NAME bar
    

    Équivalent à l'exécution :

    echo foo bar
    

    Le résultat imprimé est :

    foo bar
    

    Un seul ENTRYPOINT peut être spécifié dans le Dockerfile. Si plusieurs sont spécifiés, seul le dernier sera valide.

    Lors de l'exécution de la commande docker run, vous pouvez également ajouter le paramètre -entrypoint, qui continuera à transmettre les paramètres spécifiés à ENTRYPOINT, par exemple :

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

    Puis exécutez :

    docker run CONTAINER_NAME bar #注意没有echo
    

    Ensuite, cela équivaut à exécuter echo foo bar, et le résultat final est

    foo bar
    

    J'ai traduit un article "15 Docker Tips in 15 Minutes" sur dockboard.org, qui parle des différences entre RUN, CMD et ENTRYPOINT. Vous pouvez vous y référer.

    Il existe également une série Docker Quicktips, et il y a un article qui parle également d'ENTRYPIONT. Vous pouvez y jeter un œil, le lien est ici :
    http://www.tech-d.net/. 2014/01/27/docker-quicktip-1-entrypoint/

    Nous ajouterons bientôt les traductions de cette série d'articles sur dockboard.org, alors restez à l'écoute.

    De plus, voici la description du point d'entrée dans la documentation officielle : http://docs.docker.io/en/latest/reference/builder/#entrypoint

    répondre
    0
  • PHPz

    PHPz2017-04-21 10:57:46

    Dans le Dockerfile, si ENTRYPOINT et CMD existent, alors CMD est le paramètre de ENTRYPOINT. S'il n'y a pas d'ENTRYPOINT, alors CMD est l'instruction d'exécution par défaut

    .

    répondre
    0
  • Annulerrépondre