确定泊坞窗图像的OS分布

Rah*_*hul 15 python docker dockerfile

我需要确定任何docker镜像的OS分配名称.我可以将ubuntu:latest标记为image1:latest,但是我应该能够在启动时获取image1:latest的发布信息.

为实现此目的,我使用下面提到的命令来确定操作系统版本:

$ docker tag ubuntu image1
$
$ docker run -it image1 /bin/sh -c "echo import platform > test.py; echo print\(platform.dist\(\)\) >> test.py; python3 test.py"
('Ubuntu', '14.04', 'trusty')
$
Run Code Online (Sandbox Code Playgroud)

但是,这依赖于图像中是否包含python2python3.ubuntu:12.04失败了,我需要在那里使用python2.

$ docker run -it ubuntu /bin/sh -c "echo import platform > test.py; echo print\(platform.dist\(\)\) >> test.py; python3 test.py"
('Ubuntu', '14.04', 'trusty')
$
$ docker run -it ubuntu:12.04 /bin/sh -c "echo import platform > test.py; echo print\(platform.dist\(\)\) >> test.py; python3 test.py"
/bin/sh: 1: python3: not found
$
$ docker run -it ubuntu:12.04 /bin/sh -c "echo import platform > test.py; echo print\(platform.dist\(\)\) >> test.py; python2 test.py"
('Ubuntu', '12.04', 'precise')
$ 
Run Code Online (Sandbox Code Playgroud)

Q1.有没有办法在不知道特定图像中哪个版本的python存在的情况下我可以实现相同的目标?

注意:目标是确定哪个是用于构建此图像的基本图像.我无权访问用于构建此映像的Dockerfile.

Q2.还有另一种使用入口点的方法.我可以使用Dockerfile从当前图像构建单独的图像.或者,我可以在创建容器时在cmdline中指定入口点,但我需要在容器中访问该脚本.我猜我在使用cmdline时可能需要共享存储,有没有更好的方法来实现这一点?任何指针都会非常有用.

谢谢.

mor*_*rxa 25

Filesystem Hierarchy Standard有一个标准定义/etc/os-release,应该可以在大多数发行版上使用:

/ etc/os-release和/ usr/lib/os-release文件包含操作系统标识数据.

os-release的基本文件格式是一个换行分隔的类似环境的shell兼容变量赋值列表.可以从shell脚本中获取配置.

这意味着您可以直接/etc/os-release使用$NAME$ID识别分发.举个例子,在Fedora上它看起来像这样:

% source /etc/os-release
% echo $NAME
Fedora
% echo $ID
fedora
Run Code Online (Sandbox Code Playgroud)

关于Debian:

% source /etc/os-release
% echo $NAME
Debian GNU/Linux
% echo $ID
debian
Run Code Online (Sandbox Code Playgroud)


pie*_*pie 7

您可以为 Debian/Ubuntu 使用 /etc/issue 文件:

root@ubuntu_container:/# cat /etc/issue
Ubuntu 14.04.3 LTS \n \l
Run Code Online (Sandbox Code Playgroud)

或 /etc/redhat-release 用于 CentOS/Red Hat/Fedora:

[root@fedora_container /]# cat /etc/redhat-release 
Fedora release 23 (Twenty Three)

[root@centos_container /]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)
Run Code Online (Sandbox Code Playgroud)


Qin*_*nsi 6

大多数答案都给出了操作系统版本,但问题也与 docker 有关。

我很懒,尤其是当我有超过 20 张图像时,所以:

docker image ls | perl -lane 'print "docker run --rm $F[0]:$F[1] cat /etc/os-release" unless /REPOSITORY/' | sh | grep PRETTY

大多数图像都有结果:

> PRETTY_NAME="Ubuntu 16.04.1 LTS"
> PRETTY_NAME="Ubuntu 14.04.3 LTS"
> PRETTY_NAME="Ubuntu 18.04.1 LTS"
> PRETTY_NAME="Debian GNU/Linux 9 (stretch)" 
> PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
> PRETTY_NAME="Debian GNU/Linux bullseye/sid"
> PRETTY_NAME="Ubuntu 18.04.3 LTS"
> PRETTY_NAME="Ubuntu 16.04.1 LTS"
> ...
Run Code Online (Sandbox Code Playgroud)