在DockerFile中,有两个命令与我类似:CMD
和ENTRYPOINT
。但我猜它们之间有(微妙的?)区别——否则,为同一件事使用两个命令是没有任何意义的
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><;cmd>将是入口点的参数
如果您改为键入此命令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