SCRATCH 中的 docker 容器如何执行二进制文件?

she*_*rz1 3 shell docker

docker 文档说你可以构建这个最小的镜像:

FROM scratch
ADD hello /
CMD ["/hello"]
Run Code Online (Sandbox Code Playgroud)

据推测,其工作方式是该CMD步骤使用默认 shell(即,bin/sh根据/sf/answers/1509549331/)来运行hello可执行文件。

但如果 SCRATCH 真的完全是空的,那么它从哪里来呢bin/sh?为什么我的图像包含外壳?

iBu*_*Bug 9

构建的容器一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亲自观察。