Dockerfile中的CMD和ENTRYPOINT之间有什么区别?

在DockerFile中,有两个命令与我类似:CMDENTRYPOINT。但我猜它们之间有(微妙的?)区别——否则,为同一件事使用两个命令是没有任何意义的

CMD

CMD的主要用途是为正在执行的容器提供默认值

对于入口点

入口点帮助您配置可以作为可执行文件运行的容器

那么,这两个命令之间有什么区别

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

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

该命令通过入口点运行。i、 例如,实际执行的是/bin/sh-cbash。这允许Docker通过依赖shell的解析器快速实现运行

后来,人们要求能够定制它,所以引入了ENTRYPOINT--ENTRYPOINT

在上面的例子中,ubuntu之后的所有内容都是命令,并被传递到入口点。当使用CMD指令时,就好像你在做docker run-i-t ubuntu<cmd&gt<cmd&gt将是入口点的参数

如果您改为键入此命令docker run-i-t ubuntu,也会得到相同的结果。由于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

发表评论