2016-02-28 11 views
10

Ich muss den OS-Verteilungsnamen für jedes Docker-Image ermitteln. Ich kann ubuntu benennen: späteste als image1: späteste, aber ich sollte in der Lage sein, die Verteilungsinformation von image1 zu erhalten: spätestes, wenn es gestartet wird.bestimmen Betriebssystemverteilung eines Docker-Abbilds

Um dies zu erreichen, habe ich den folgenden Befehl erwähnte die OS-Version zu bestimmen:

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

Dies ist jedoch auf eine Abhängigkeit hat, ob das Bild python2 oder python3 in ihm hat. Es schlägt für ubuntu: 12.04 und ich muss python2 dort verwenden.

$ 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. Gibt es eine Möglichkeit, dasselbe zu erreichen, ohne zu wissen, welche Version von Python in einem bestimmten Bild vorhanden ist?

HINWEIS: Das Ziel besteht darin, zu bestimmen, welches Basisbild für dieses Bild verwendet wurde. Ich habe keinen Zugriff auf die Docker-Datei, mit der dieses Image erstellt wurde.

Q2. Es gibt einen anderen Ansatz, den Einstiegspunkt zu verwenden. Ich kann ein separates Bild aus dem aktuellen Bild mit Dockerfile erstellen. Oder ich kann beim Erstellen eines Containers den Eingabepunkt in cmdline angeben, aber das Skript muss im Container verfügbar sein. Ich nehme an, dass ich bei der Verwendung von cmdline einen gemeinsamen Speicher benötigen könnte, gibt es einen besseren Weg, dies zu erreichen? Alle Hinweise wären sehr hilfreich.

Danke.

+0

"uname -a" gibt mir diese : Linux 95e5ae04dbbc 4.2.0-27-generische # 32-Ubuntu SMP Fr Jan 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux. Ich kann nicht sagen, ob es ubuntu14.04 oder fedora oder ubuntu15.10 ist. – Rahul

+0

Auch für die Verwendung von sys muss ich wissen, welche Version von Python verwendet werden soll. Die Frage selbst ist, wie ich bestimmen kann, welche Version verwendet werden soll. :) – Rahul

+0

Ich habe deine Frage falsch gelesen. Deshalb habe ich meine Kommentare gelöscht. Entschuldigung. :) – idjaw

Antwort

14

Der Filesystem Hierarchy Standard hat eine standard definition for /etc/os-release, die auf den meisten Distributionen zur Verfügung stehen sollten:

Die Datei/etc/os-Freisetzung und/usr/lib/os-Release-Dateien co Identifizieren von Betriebssystem-Identifikationsdaten.

Das grundlegende Dateiformat von os-release ist eine durch Zeilenumbruch getrennte Liste von Umgebungs-Shell-kompatiblen Variablenzuweisungen. Es ist möglich, die Konfiguration von Shell-Skripten zu beziehen. Diese

heißt, Sie können nur Quelle /etc/os-release und verwenden $NAME oder $ID die Verteilung zu identifizieren. Als Beispiel auf Fedora sieht es wie folgt aus:

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

auf Debian:

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

Das sieht gut aus. Es funktioniert auf den neuesten Distributionen. Wenn ich jedoch ein Bild von centos: 6 sehen wollte, ist diese Datei nicht darin enthalten. Centos: Das Neueste hat es. – Rahul

+0

RHEL6 (und damit CentOS 6) ist so alt, damals war '/ etc/os-release' noch nicht vorhanden. Vielleicht möchten Sie stattdessen glob für '/ etc/* - release'. Ich denke, RHEL6 hatte ein '/ etc/redhat-release', ich denke CentOS hat etwas ähnliches. – morxa

+0

Danke @morxa. Ich habe eine Kombination aus Python und OS-Release verwendet, um Versionsinformationen zu erhalten. Bis jetzt deckt es fast alle Fälle ab (redhat, ubuntu, debian, centos, opensuse, cirros ...) https://github.com/BU-NU-CLOUD-SP16/Container-Code-Classification/blob/ master/scripts/platform.sh – Rahul

1

Sie können/etc/issue Datei für Debian/Ubuntu:

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

oder/etc/redhat-release für 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

Fails für Centos. 'sh-4.2 # cat/etc/issue -----> gibt ----> Kernel \ r auf einem \ m' – Rahul

+0

@Rahul Ich habe meine Antwort aktualisiert. – pie

+0

für jede Verteilung ändert sich der Befehl. Zum Beispiel wechselte es von Ubuntu zu Redhat. In ähnlicher Weise könnte es sich bei opensuse ändern. Diese Lösung scheint nicht skalierbar zu sein. – Rahul

1

Sie sollten folgende cmd verwenden Ubuntu Release-Namen zu erkennen:

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

Für Ubuntu docker images Ich verwende folgende cmds, wenn ich multiverse zu apt.source hinzufügen muss.Listen und haben nicht zu einer doppelten Linien:

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

Sie cmd folgende verwenden sollten Debian Release-Namen (I am using es für meine Docker Bilder) zu erkennen:

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

Einverstanden, aber das funktioniert nur für ubuntu. Die Frage ist, wie man für die meisten Betriebssysteme ermittelt. Die ausgewählte Antwort und die Kommentare dazu haben gute Punkte, um die meisten wichtigen Distributionen abzudecken. Und es ist auch einfacher. – Rahul

+0

Der Python ist nicht Teil einer Distribution einiger Docker Base Images. Daher empfehle ich, spezifische Erkennungen basierend auf Ihrem Distro-Typ einzubetten. PS: Ich habe Debian hinzugefügt und werde es auf den nächsten Distributionen aktualisieren. –

+0

Yup, deshalb habe ich zuerst/etc/os-release benutzt, und wenn es nicht vorhanden ist, dann verlasse dich auf python. Sie können den Kommentar in der Antwort überprüfen, der darauf hinweist, dass der GitHub-Link dasselbe tut. Ja, es schlägt für Bilder fehl, die nicht sowohl/etc/os-release als auch python haben, aber ansonsten funktioniert es für viele bekannte Distributionen. – Rahul

Verwandte Themen