首页 > 解决方案 > 获取 debian-slim 的次要版本

问题描述

我正在设置我的容器创建管道,我需要能够获得我的容器所基于的 debian-slim 构建的主要和次要版本。

我尝试了以下命令:

docker run -it --rm -a stdout --entrypoint lsb_release MyContainer:1.0.0 -a

但这只是返回:

分销商 ID:Debian  
描述:Debian GNU/Linux 10(破坏者)   
发布:10  
代号:克星  

未列出次要版本。

我也试过:

docker run -it --rm -a stdout --entrypoint cat MyContainer:1.0.0 "/etc/os-release"

但这仅输出:

PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (破坏者)"
VERSION_CODENAME=破坏者
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

再次,没有次要版本。

有没有办法获得次要版本?容器操作系统甚至知道它的完整版本号吗?

标签: linuxdockerdebiancontainers

解决方案


事实上,在过去的 Debian9 上,您可以使用lsb_release -a以下方式获取次要版本:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:        9.5
Codename:       stretch

你可能知道,/usr/bin/lsb_release最终会调用/usr/lib/python3/dist-packages/lsb_release.py,这个脚本在 debian9 和 debian10 之间的实现差异造成了差异。

  • 在 debian9 中,它是下一个:

    def get_distro_information():
        lsbinfo = get_lsb_information()
        # OS is only used inside guess_debian_release anyway
        for key in ('ID', 'RELEASE', 'CODENAME', 'DESCRIPTION',):
            if key not in lsbinfo:
                distinfo = guess_debian_release()
                distinfo.update(lsbinfo)
                return distinfo
        else:
            return lsbinfo
    

    get_lsb_release将获取 的内容/etc/lsb-release,但在 debian 版本中没有文件,因此它返回 none。然后程序必须回退到guess_debian_release将从中获取内容的程序/etc/debian_version,因此您将获得次要版本。

  • 在 debian10 中,它是下一个:

    def get_distro_information():
        lsbinfo = get_os_release()
        # OS is only used inside guess_debian_release anyway
        for key in ('ID', 'RELEASE', 'CODENAME', 'DESCRIPTION',):
            if key not in lsbinfo:
                distinfo = guess_debian_release()
                distinfo.update(lsbinfo)
                return distinfo
            else:
                return lsbinfo
    

    get_os_release将获取 的内容/usr/lib/os-release,接下来是内容:

    PRETTY_NAME="Debian GNU/Linux 10 (buster)"
    NAME="Debian GNU/Linux"
    VERSION_ID="10"
    VERSION="10 (buster)"
    VERSION_CODENAME=buster
    ID=debian
    HOME_URL="https://www.debian.org/"
    SUPPORT_URL="https://www.debian.org/support"
    BUG_REPORT_URL="https://bugs.debian.org/"
    

    由于它已经得到了版本,所以不再回退到guess_debian_release,所以你没有得到次要版本。我猜的好处是如果不使用guess_debian_release,它会使用更少的IO操作,但在我看来,真的无数(也可能是一些硬编码猜测)。

最后,作为一种解决方法,在 debian10 上,您可以使用 next 来获得与 debian 9 相同的行为:

$ LSB_OS_RELEASE="" lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10.4 (buster)
Release:        10.4
Codename:       buster

推荐阅读