Docker文档中提到你可以构建这个最小化的镜像:
FROM scratch
ADD hello /
CMD ["/hello"]
假设这个过程是这样的:CMD
步骤使用默认 shell (即 bin/sh
,参见 https://dev59.com/mmEi5IYBdhLWcg3wK5rd#21564990) 运行 hello
可执行文件。
但如果 SCRATCH 真的完全为空,那么 bin/sh
来自哪里呢?为什么我的镜像包含一个 shell?
Docker文档中提到你可以构建这个最小化的镜像:
FROM scratch
ADD hello /
CMD ["/hello"]
假设这个过程是这样的:CMD
步骤使用默认 shell (即 bin/sh
,参见 https://dev59.com/mmEi5IYBdhLWcg3wK5rd#21564990) 运行 hello
可执行文件。
但如果 SCRATCH 真的完全为空,那么 bin/sh
来自哪里呢?为什么我的镜像包含一个 shell?
scratch
构建的容器一开始是空的,因此您的镜像中不包含 /bin/sh
。
然而,在这里有两种格式的 CMD
比较重要:
CMD ["/hello"]
CMD /hello
第一种格式指定了一个完整的命令,并直接通过execve(2)
调用。实际执行的进程就像是["/hello"]
一样(即 argc == 1
)。
第二种格式指定了一个 "入口点参数",作为单个参数传递给入口点,因此Docker将尝试使用["/bin/sh", "-c", "/hello"]
运行,并且argc == 3
会失败。
您可以使用 CMD /hello
替换CMD行并自行观察其效果。