在Dockerfiles中,有两个与我相似的命令:CMD和ENTRYPOINT。但是我想它们之间有一个(细微的?)差异- 否则对于同一件事有两个命令是没有任何意义的。
CMD
ENTRYPOINT
文档说明 CMD
CMD的主要目的是为执行中的容器提供默认值。
和为ENTRYPOINT:
ENTRYPOINT帮助您配置可以作为可执行文件运行的容器。
那么,这两个命令有什么区别?
Docker有一个默认入口点,/bin/sh -c但没有默认命令。
/bin/sh -c
当您像这样运行docker时: docker run -i -t ubuntu bash 入口点是默认值/bin/sh -c,映像是ubuntu,命令是bash。
docker run -i -t ubuntu bash
ubuntu
bash
该命令通过入口点运行。即,实际执行的是/bin/sh -c bash。这使Docker可以RUN依靠Shell的解析器快速实现。
/bin/sh -c bash
RUN
后来,人们要求能够对此进行自定义,因此ENTRYPOINT并--entrypoint进行了介绍。
--entrypoint
ubuntu上面示例中的所有内容均为命令,并传递给入口点。使用CMD说明时,就好像您在做一样docker run -i -t ubuntu <cmd>。<cmd>将是入口点的参数。
docker run -i -t ubuntu <cmd>
<cmd>
如果您改为输入此命令,您还将得到相同的结果docker run -i -t ubuntu。由于ubuntu Dockerfile指定了默认CMD ,因此您仍将在容器中启动bash shell :CMD ["bash"]
docker run -i -t ubuntu
CMD ["bash"]
当所有内容都传递到入口点时,您的图像会表现出很好的行为。@Jiri示例很好,它显示了如何将图像用作“二进制”。当["/bin/cat"]用作入口点然后执行操作时docker run img /etc/passwd,您会得到它,它/etc/passwd是命令并传递给入口点,因此最终结果的执行很简单/bin/cat /etc/passwd。
["/bin/cat"]
docker run 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。
docker run redisimg redis -H something -u toto get key
ENTRYPOINT ["redis", "-H", "something", "-u", "toto"]
docker run redisimg get key