webentwicklung-frage-antwort-db.com.de

bestimmen der Betriebssystemverteilung eines Docker-Images

Ich muss den Betriebssystemverteilungsnamen für jedes Docker-Image ermitteln. Ich kann ubuntu: latest as image1: latest markieren, aber ich sollte in der Lage sein, die Verteilungsinformationen von image1: spätestens beim Start zu erhalten.

Um dies zu erreichen, habe ich den folgenden Befehl verwendet, um die Betriebssystemversion zu ermitteln:

$ 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 hängt jedoch davon ab, ob das Bild python2 oder python3 enthält. Es fällt für Ubuntu: 12.04 aus und ich muss dort Python2 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 einen Weg, wie ich dasselbe erreichen kann, ohne zu wissen, welche Python-Version in einem bestimmten Bild enthalten ist?

HINWEIS: Das Ziel besteht darin, zu ermitteln, welches Basisabbild zum Erstellen dieses Abbilds verwendet wurde. Ich habe keinen Zugriff auf die Dockerfile, mit der dieses Image erstellt wurde.

Q2. Es gibt einen anderen Ansatz zur Verwendung von Eingangspunkt. Ich kann mit Dockerfile ein separates Image vom aktuellen Image erstellen. Oder ich kann in cmdline beim Erstellen des Containers entrypoint angeben, aber das Skript muss innerhalb des Containers verfügbar sein. Ich vermute, dass ich bei der Verwendung von cmdline möglicherweise gemeinsamen Speicherplatz benötige. Gibt es einen besseren Weg, um dies zu erreichen? Alle Hinweise wären sehr hilfreich.

Vielen Dank.

13
Rahul

Der Filesystem Hierarchy Standard hat eine Standarddefinition für /etc/os-release , die auf den meisten Distributionen verfügbar sein sollte:

Die Dateien/etc/os-release und/usr/lib/os-release enthalten Identifizierungsdaten des Betriebssystems.

Das grundlegende Dateiformat von os-release ist eine durch Zeilenumbrüche getrennte Liste von Umgebungs-ähnlichen Shell-kompatiblen Variablenzuweisungen. Es ist möglich, die Konfiguration von Shell-Skripts zu beziehen.

Dies bedeutet, dass Sie einfach /etc/os-release verwenden und $NAME oder $ID verwenden können, um die Verteilung zu identifizieren. Auf Fedora sieht das beispielsweise so 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
22
morxa

Sie könnten die Datei/etc/issue für Debian/Ubuntu verwenden:

[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)
2
pie

Verwenden Sie folgendes Cmd, um den Ubuntu Veröffentlichungsnamen zu ermitteln:

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

Für Ubuntu-Docker-Images verwende ich folgende cmds, wenn ich apt.source.lists mit Multiversum versehen muss und keine doppelten Zeilen habe:

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

Verwenden Sie folgendes Cmd, um Debian Freigabename zu ermitteln ( ich verwende für meine Docker-Images):

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