小编典典

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

redis

在 Dockerfiles 中,有两个命令与我相似:CMDENTRYPOINT. 但我想它们之间存在(微妙的?)区别 - 否则对于同一件事有两个命令没有任何意义。

该文件指出 CMD

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

对于ENTRYPOINT

ENTRYPOINT 可帮助您配置可以作为可执行文件运行的容器。

那么,这两个命令有什么区别呢?


阅读 301

收藏
2021-12-29

共1个答案

小编典典

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

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

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

后来,人们要求能够自定义这一点,所以ENTRYPOINT--entrypoint进行了介绍。

ubuntu上面示例中的所有内容都是命令并传递给入口点。使用该CMD指令时,就像您在执行docker run -i -t ubuntu <cmd>. <cmd>将是入口点的参数。

如果您改为键入此命令,您也将获得相同的结果docker run -i -t ubuntu。由于ubuntu Dockerfile指定了默认 CMD,您仍将在容器中启动 bash shell :CMD ["bash"]

当一切都传递到入口点时,您可以从图像中获得非常好的行为。@Jiri 示例很好,它展示了如何将图像用作“二进制”。当["/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

2021-12-29