docker 文档说你可以构建这个最小的镜像:
FROM scratch
ADD hello /
CMD ["/hello"]
Run Code Online (Sandbox Code Playgroud)
据推测,其工作方式是该CMD步骤使用默认 shell(即,bin/sh根据/sf/answers/1509549331/)来运行hello可执行文件。
但如果 SCRATCH 真的完全是空的,那么它从哪里来呢bin/sh?为什么我的图像包含外壳?
构建的容器一scratch开始里面没有任何东西,所以你的镜像不包含/bin/sh.
然而,有两种格式CMD在这里很重要:
CMD ["/hello"]
CMD /hello
Run Code Online (Sandbox Code Playgroud)
第一种格式指定完整命令并通过 直接调用execve(2)。["/hello"]实际执行的过程与(即argc == 1)一样
第二种格式指定“入口点参数”并作为单个参数传递给入口点,因此 Docker 将尝试运行["/bin/sh", "-c", "/hello"]并argc == 3失败。
您可以更换 CMD 线并CMD /hello亲自观察。