Dockerfile中CMD和ENTRYPOINT有什么区别?

在Dockerfiles中有两个看起来与我类似的命令:CMD和ENTRYPOINT.但是我猜它们之间有一个(微妙的?)区别 – 否则对于同样的事情有两个命令没有任何意义.

CMD的文档说明

The main purpose of a CMD is to provide defaults for an executing container.

对于ENTRYPOINT:

An ENTRYPOINT helps you to configure a container that you can run as an executable.

那么,这两个命令之间的区别是什么?

最佳答案
Docker有一个默认入口点,即/ bin / sh -c,但没有默认命令.

当您像这样运行docker时:
docker run -i -t ubuntu bash
入口点是默认的/ bin / sh -c,图像是ubuntu,命令是bash.

该命令通过入口点运行.即,执行的实际内容是/ bin / sh -c bash.这允许Docker依靠shell的解析器快速实现RUN.

后来,人们要求能够自定义它,因此引入了ENTRYPOINT和–entrypoint.

在上面的示例中,ubuntu之后的所有内容都是命令并传递给入口点.当使用CMD指令时,就好像你正在使用docker run -i -t ubuntu< cmd>. < CMD>将是入口点的参数.

如果您改为输入此命令docker run -i -t ubuntu,您也会得到相同的结果.您仍将在容器中启动bash shell,因为ubuntu Dockerfile指定了默认CMD:CMD [“bash”]

当所有内容都传递到入口点时,您可以从图像中获得非常好的行为. @Jiri示例很好,它显示了如何将图像用作“二进制”.当使用[“/ bin / cat”]作为入口点,然后使用docker运行img / etc / passwd时,你得到它,/ etc / passwd是命令并传递给入口点,所以最终结果执行就是/ bin / cat / etc / passwd.

另一个例子是将任何cli作为入口点.例如,如果你有一个redis图像,而不是运行docker run redisimg redis -H something -u toto get key,你可以简单地使用ENTRYPOINT [“redis”,“ – H”,“something”,“ – u”, “toto”]然后像这样运行得到相同的结果:docker run redisimg get key.

转载注明原文:Dockerfile中CMD和ENTRYPOINT有什么区别? - 代码日志