2016-02-28 3 views
10

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

Однако, это имеет зависимость от того, имеет ли изображение 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 при создании контейнера, но мне нужен сценарий для доступа в контейнер. Я предполагаю, что мне может понадобиться совместное хранилище при использовании cmdline, есть ли лучший способ достичь этого? Любые указатели были бы действительно полезны.

Спасибо.

+0

«uname -a» дает мне это : Linux 95e5ae04dbbc 4.2.0-27-generiC# 32-Ubuntu SMP Пт Янв 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux. Я не могу сказать, есть ли его ubuntu14.04 или fedora или ubuntu15.10. – Rahul

+0

Даже для использования sys мне нужно знать, какую версию python использовать. Сам вопрос заключается в том, как я могу определить, какую версию использовать. :) – Rahul

+0

Я все время читал ваш вопрос. Вот почему я удалил свои комментарии. Извиняюсь. :) – idjaw

ответ

14

Файловая система Hierarchy Standard имеет standard definition for /etc/os-release, который должен быть доступен в большинстве дистрибутивов:

/и т.д./ОС-релиз и/USR/Lib/ОС-релиз файлов совместно иметь идентификационные данные операционной системы.

Основной формат файла 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 
+0

Это выглядит хорошо. Он работает с последними дистрибутивами. Однако, когда я попытался увидеть изображение centos: 6, в нем нет этого файла. centos: последний имеет его. – Rahul

+0

RHEL6 (и, следовательно, CentOS 6) настолько старый, что '/ etc/os-release' еще не существовал. Вместо этого вам может понадобиться glob для '/ etc/* - release'. Я думаю, что у RHEL6 был '/ etc/redhat-release', я думаю, у CentOS есть что-то подобное. – morxa

+0

Спасибо @morxa. Я использовал комбинацию как python, так и os-release для получения информации о версии. До сих пор он охватывает почти все случаи (redhat, ubuntu, debian, centos, opensuse, cirros ...) https://github.com/BU-NU-CLOUD-SP16/Container-Code-Classification/blob/ master/scripts/platform.sh – Rahul

1

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

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

или/и т.д./RedHat-релиз для 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) 
+0

Не работает для centos. 'sh-4.2 # cat/etc/issue -----> дает ----> Kernel \ r на \ m' – Rahul

+0

@Rahul Я обновил свой ответ. – pie

+0

для каждого распространения команда изменится. Например, он изменился с Ubuntu на Redhat. Точно так же это может измениться для opensuse. Это решение, похоже, не масштабируется. – Rahul

1

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

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

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

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 имени деблокировки (I am using это для моих докеров изображений):

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

Согласен, но это работает только для ubuntu. Вопрос заключается в том, как определить большинство операционных систем. Выбранный ответ и комментарии к нему имеют хорошие возможности для покрытия большинства важных дистрибутивов. И это еще проще. – Rahul

+0

Python не является частью распределения некоторых базовых изображений Docker. Поэтому я предлагаю встраивать специальные обнаружения на основе вашего типа дистрибутива. PS: Я добавил Debian, и я обновлю следующие дистрибутивы –

+0

Yup, вот почему я сначала использовал/etc/os-release, а если его нет, то полагайтесь на python. Вы можете проверить комментарий в ответе, который указывает на то, что ссылка github делает то же самое. Да, это не удается для изображений, которые не имеют как/etc/os-release, так и python, но в остальном он работает для многих известных дистрибутивов. – Rahul

Смежные вопросы