确定泊坞窗镜像的OS分布

我需要确定任何泊坞窗图像的操作系统分布名称。 我可以标记Ubuntu的最新作为image1:最新的 ,但我应该能够得到它的发布信息image1:最新的时候。

为了达到这个目的,我使用下面提到的命令来确定操作系统版本:

$ 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') $ 

但是,这依赖于图像是否具有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') $ 

Q1。 有没有一种方法,我可以实现相同,而不知道哪个版本的Python是在那里在一个特定的图像?

注意:目标是确定哪个是用于构build这个图像的基本图像。 我无法访问用于构build此映像的Dockerfile。

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

谢谢。

文件系统层次结构标准有一个/etc/os-release的标准定义,在大多数发行/etc/os-release中应该可用:

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

os-release的基本文件格式是一个换行符分隔的类似环境的shell兼容variables赋值列表。 可以从shell脚本获取configuration。

这意味着你可以只发送/etc/os-release并使用$NAME$ID来标识分配。 作为一个例子,在Fedora上看起来像这样:

 % source /etc/os-release % echo $NAME Fedora % echo $ID fedora 

在Debian上:

 % source /etc/os-release % echo $NAME Debian GNU/Linux % echo $ID debian 

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

 root@ubuntu_container:/# cat /etc/issue Ubuntu 14.04.3 LTS \n \l 

或CentOS / Red Hat / Fedora的/ etc / redhat-release:

 [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) 

您应该使用以下cmd来检测Ubuntu发行版名称:

 export UBUNTU_RELEASE=$(lsb_release -sc || cat /etc/*-release|grep -oP 'CODENAME=\K\w+$'|head -1) 

对于Ubuntu Docker镜像,当我需要将multiverse添加到apt.source.lists并且没有重复行时,我使用下面的cmds:

 RUN export UBUNTU_RELEASE=$(lsb_release -sc || cat /etc/*-release|grep -oP 'CODENAME=\K\w+$'|head -1) &&\ echo "deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_RELEASE}-security multiverse" >> /etc/apt/sources.list && \ echo "deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_RELEASE}-security multiverse" >> /etc/apt/sources.list && \ echo "deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_RELEASE} multiverse" >> /etc/apt/sources.list && \ echo "deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_RELEASE} multiverse" >> /etc/apt/sources.list && \ echo "removing duplicated strings from /etc/apt/sources.list" && \ awk '!x[$0]++' /etc/apt/sources.list > /tmp/sources.list && \ cat /tmp/sources.list > /etc/apt/sources.list && \ 

您应该使用下面的cmd来检测Debian发行版名称( 我正在使用它来pipe理我的Docker镜像):

 export DEBIAN_RELEASE=$(awk -F'[" ]' '/VERSION=/{print $3}' /etc/os-release | tr -cd '[[:alnum:]]._-' ) && \ [[ "x${DEBIAN_RELEASE}" = "x" ]] && export DEBIAN_RELEASE="unstable"