它会在Docker软件中执行,不会在主机操作系统(我的操作系统是Mac)中执行,也不会内部创建任何操作系统。
如果它在主机操作系统中执行,那么我将编写Mac命令(我的主机操作系统是Mac),现在如果我将该映像文件交给某人,他的操作系统是Windows,它能运行吗?
“操作系统”一词有点过载。
Docker容器始终运行在Linux内核上(除了本机Windows容器的情况)。在非Linux系统(例如Mac)上,存在一个Linux虚拟机,所有容器始终在该VM上运行。所有容器共享该“主机”或VM内核(默认情况下被禁止进行会影响整个系统的更改)。
“操作系统”还可以暗示在内核之上运行的库、实用程序和程序堆栈。Docker让您运行Ubuntu用户空间、Alpine用户空间或其他用户空间...或不运行任何用户空间。这些之间可能存在轻微的不兼容性(如果您在GNU libc中使用了一些特定的东西;如果您认为/bin/sh总是GNU bash;...)。
通常情况下,您不希望使用FROM scratch
。除了Docker为您提供的/proc
和/dev
等几个位,您将会得到nothing。例如,您将不会获得shell。只有当您具有静态链接的Linux二进制文件并且出于某种原因想将其包装在容器中时,它才是最有用的(您的应用程序通常必须使用C、C++或Go编写,并且需要采取特殊步骤进行静态链接)。
Docker永远不会在主机上运行命令(特别是如果涉及VM层),如果您的程序的主要目标是与主机程序交互或读写主机文件,则您 actively 不想要Docker提供的隔离。一个不同的打包系统可能对您更有效。
FROM scratch
,但仍然有一个输出“hello world”的容器?这是可能的吗? - flow2kscratch
镜像被用作二进制可执行文件的“容器”。在 hello-world 示例中,FROM scratch
COPY hello /
CMD ["/hello"]
你好,hello
是一个使用 gcc 编译的可执行文件。
如果你想要使用 scratch
,你需要编译你的代码,架构取决于你想在哪里运行它。例如,在现代个人电脑上,它将是 amd64,在树莓派上,它将是 arm*。
注意:因为 Docker for Mac 和 Docker for Windows 使用 Linux VM, 所以你需要一个 Linux 二进制文件,而不是 Mac 或 Windows 二进制文件。
回到你的问题,对于 Mac、Windows 和 Linux,Docker 将像在 Linux 中一样执行二进制文件。你不能使用任何 Mac 命令与 scratch
,因为它应该是一个内部可执行文件。