我cat /etc/os-release
在容器中执行。
我有一台 Ubuntu 22.04 docker 主机。当我运行一个容器并查看容器内的 linux os-release 文件时,无论我在哪个容器中执行它,我都会看到我的 Ubuntu 名称...
但是我在 Ubuntu 22.04 上还有另一个 Kubernetes 集群(没有 docker,集群配置为直接使用 containerd)。如果我基于任何镜像创建部署,当我看到 os-release 文件时,我会看到一个特定于镜像的 Linux 名称,它显然来自镜像本身,有时是 alpine,有时是 bookworm 等。
为什么会有这种不同的行为?
答案1
该/etc/os-release
文件基于容器基础镜像,如果你获得与主机相同的版本,则仅意味着你运行基于 Ubuntu 22.04 的镜像。你可以使用基于不同系统的容器对其进行测试
示例来自我在 Ubuntu 上运行的机器,第一个命令来自主机,第二个命令来自容器
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
...
$ docker run --rm -ti node:16 bash
root@3d48cdfe1d97:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
..
答案2
细节 :
Docker 容器具有分层的文件系统。
容器根/
文件系统与主机根文件系统不同/
。
容器/etc/
与主机不同/etc/
!
在这种情况下,容器/etc/os-release
可能是也可能不是主机/etc/os-release
!
[[取决于安装在哪里]]
通过分层,如果容器仍在使用主机/etc/os-release
文件[[由于挂载点和映射]],那么我们将看到主机操作系统详细信息,而如果容器正在使用自己的或修改过的/etc/os-release
文件,那么我们将看到该文件的内容,它们可能是相同或不同的。
运行 Ubuntu Docker 容器的 Debian Docker 主机(无自带)/etc/os-release
:/etc/os-release
将包含 Debian。
Debian Docker 主机运行 Debian Docker 容器,其自身/etc/os-release
:/etc/os-release
将包含 Debian。
Debian Docker Host 运行 Ubuntu Docker 容器,其自身/etc/os-release
:/etc/os-release
将包含 Ubuntu。
概括 :
当/etc/os-release
容器中的 更新 [[ 它有自己的/etc
]] 时,它将提供容器的详细信息。当容器中的 未更新 [[ 原始内容可通过安装到同一安装点获得]]
时,它将提供主机的详细信息。/etc/os-release
/etc/
/etc/