web-dev-qa-db-fra.com

déterminer la distribution du système d'exploitation d'une image de menu fixe

Je dois déterminer le nom de distribution du système d'exploitation pour toute image de menu fixe. Je peux baliser ubuntu: latest as image1: latest , mais je devrais pouvoir obtenir les informations de distribution de image1: last au moment de son lancement.

Pour ce faire, j'ai utilisé la commande mentionnée ci-dessous pour déterminer la version du système d'exploitation:

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

Cependant, cela dépend du fait que l'image contient python2 ou python3 . Il échoue pour Ubuntu: 12.04 et je dois utiliser python2 là-bas.

$ 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. Existe-t-il un moyen de réaliser la même chose sans savoir quelle version de python se trouve dans une image particulière?

REMARQUE: Le but est de déterminer quelle était l'image de base utilisée pour construire cette image. Je n'ai pas accès au fichier Docker utilisé pour construire cette image.

Q2. Il existe une autre approche consistant à utiliser entrypoint. Je peux construire une image distincte de l'image actuelle à l'aide de Dockerfile. Ou bien, je peux spécifier un point d’entrée dans cmdline lors de la création d’un conteneur, mais j’ai besoin que le script soit accessible dans le conteneur. Je suppose que je pourrais avoir besoin d'un stockage partagé lors de l'utilisation de cmdline. Existe-t-il un meilleur moyen d'y parvenir? Tous les indicateurs seraient vraiment utiles.

Merci.

13
Rahul

La norme de hiérarchie des systèmes de fichiers a une définition standard pour /etc/os-release , qui devrait être disponible sur la plupart des distributions:

Les fichiers/etc/os-release et/usr/lib/os-release contiennent des données d'identification du système d'exploitation.

Le format de fichier de base de os-release est une liste d’affectations de variables compatibles avec l’environnement, similaires à celle de l’environnement. Il est possible de générer la configuration à partir de scripts Shell.

Cela signifie que vous pouvez simplement source /etc/os-release et utiliser $NAME ou $ID pour identifier la distribution. Par exemple, sur Fedora, cela ressemble à ceci:

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

Sur Debian:

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

Vous pouvez utiliser le fichier/etc/issue pour Debian/Ubuntu:

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

ou/etc/redhat-release pour 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)
2
pie

Vous devriez utiliser la commande suivante pour détecter Ubuntu nom de la version:

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

Pour les images du menu fixe Ubuntu, j'utilise les cmds suivants lorsque je dois ajouter un multivers à apt.source.lists et que je n'ai pas de lignes dupliquées:

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 && \

Vous devriez utiliser la commande suivante pour détecter Debian nom de la version ( J'utilise it pour mes images de menu fixe):

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