Подтвердить что ты не робот

Определить распределение ОС изображения докеров

Мне нужно определить имя дистрибутива ОС для любого изображения докеров. Я могу пометить ubuntu: last как image1: latest, но я должен получить информацию о распространении 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')
$

Однако это зависит от того, имеет ли изображение python2 или python3. Это не удается для 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 существует в определенном изображении?

ПРИМЕЧАНИЕ. Цель состоит в том, чтобы определить, какое из базовых изображений используется для создания этого изображения. У меня нет доступа к файлу Docker, который использовался для создания этого изображения.

Q2. Существует другой подход использования точки входа. Я могу создать отдельное изображение из текущего изображения с помощью Dockerfile. Или я могу указать точку входа в cmdline при создании контейнера, но мне нужно, чтобы script был доступен в контейнере. Я предполагаю, что мне может понадобиться совместное хранилище при использовании cmdline, есть ли лучший способ достичь этого? Любые указатели будут действительно полезны.

Спасибо.

4b9b3361

Ответ 1

Стандарт иерархии файловой системы имеет стандартное определение для /etc/os-release, которое должно быть доступно для большинства дистрибутивов:

Файлы/etc/os-release и /usr/lib/os -release содержат данные идентификации операционной системы.

Основной формат файла os-release - это список, сопоставляемый с оболочкой, совместимый с оболочкой. Возможно настроить конфигурацию из сценариев оболочки.

Это означает, что вы можете просто указать /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

Ответ 2

Вы можете использовать файл /etc/issue для Debian/Ubuntu:

[email protected]_container:/# cat /etc/issue
Ubuntu 14.04.3 LTS \n \l

или/etc/redhat-release для CentOS/Red Hat/Fedora:

[[email protected]_container /]# cat /etc/redhat-release 
Fedora release 23 (Twenty Three)

[[email protected]_container /]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

Ответ 3

Вы должны использовать следующий cmd для обнаружения Ubuntu:

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

Для изображений docker Ubuntu я использую следующие cmds, когда мне нужно добавить multiverse в apt.source.lists и не иметь повторяющихся строк:

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 имени выпуска (Я использую его для моих изображений докеров):

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