在 Docker 'From Scratch' 中,操作系统将运行

tri*_*ath 6 docker

在 docker hello-world 示例中,基础镜像是 Scratch,所以如果我没有提到基础镜像中的任何操作系统,那么命令将在哪里执行。它会在主机操作系统中执行(我的操作系统是 mac)还是会在 docker 软件中执行或将在内部创建任何操作系统

If its executes in host os, then i will write mac commands (my host os is mac), now if i give that image to some one his os is windows, is it run ?

Dav*_*aze 8

“操作系统”这个词已经有点过载了。

Docker 容器始终在 Linux 内核上运行(本机 Windows 容器除外)。在非 Linux 系统(例如Mac)上有一个 Linux 虚拟机,容器始终在该 VM 上运行。所有容器共享该“主机”或 VM 内核(默认情况下禁止进行会影响整个系统的更改)。

“操作系统”也可以指运行在内核之上的一系列库、实用程序和程序。Docker 允许您运行 Ubuntu 用户空间、Alpine 用户空间或其他一些用户空间……或者根本没有用户空间。它们之间可能存在轻微的不兼容性(如果您在 GNU libc 中使用一些特定的东西;如果您认为/bin/sh始终是 GNU bash;...)。

你通常不想要FROM scratch. 你得到什么,除了一对夫妇像位/proc/dev该泊坞用品给你。例如,您没有获得外壳。如果您有一个静态链接的 Linux 二进制文件并且无论出于何种原因想要将其包装在容器中(您的应用程序通常必须用 C、C++ 或 Go 编写,并且您需要采取特殊步骤来静态链接它),这将是最有用的.

Docker 永远不会导致命令在主机上运行(特别是如果涉及到 VM 层),并且如果您的程序的主要目标是与主机程序交互或读取和写入主机文件,那么您主动不想要 Docker 提供的隔离. 不同的包装系统可能更适合您。


Siy*_*iyu 1

scratch映像用作二进制可执行文件的“容器”。在你好世界的例子中,

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

hello 是一个可执行文件,用 gcc 构建。

因此,如果您打算使用scratch,则必须编译代码,该架构取决于您想要启动它的位置。例如,在现代 PC 上,它将是 amd64,在树莓派上,它将是 arm*。

引用: https: //docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch

注意:由于 Docker for Mac 和 Docker for Windows 使用 Linux VM,因此您需要 Linux 二进制文件,而不是 Mac 或 Windows 二进制文件。

回到你的问题,对于 mac window 和 linux Docker 将像在 linux 中一样执行二进制文件。您不能使用任何 mac 命令,scratch因为它应该是内部的可执行文件。