2016-02-28 4 views
10

Devo determinare il nome di distribuzione del sistema operativo per qualsiasi immagine di finestra mobile. Posso taggare ubuntu: latest come image1: latest, ma dovrei essere in grado di ottenere le informazioni di distribuzione di image1: latest quando viene lanciato.determina la distribuzione del sistema operativo di un'immagine mobile Immagine

Per il raggiungimento di questo, ho usato il comando di seguito menzionato per determinare la versione del sistema operativo:

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

Tuttavia, questo ha una dipendenza se l'immagine ha python2 o python3 in esso. Fallisce per ubuntu: 12.04 e ho bisogno di usare python2 lì.

$ 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. C'è un modo per ottenere lo stesso risultato senza sapere quale versione di Python è presente in una particolare immagine?

NOTA: l'obiettivo è determinare quale era l'immagine di base utilizzata per costruire questa immagine. Non ho accesso al Dockerfile usato per costruire questa immagine.

Q2. C'è un altro approccio dell'uso di un punto di accesso. Posso creare un'immagine separata dall'immagine corrente usando Dockerfile. Oppure, posso specificare il punto di accesso in cmdline durante la creazione del contenitore, ma ho bisogno che lo script sia accessibile all'interno del contenitore. Immagino che potrei aver bisogno di storage condiviso quando uso cmdline, c'è un modo migliore per raggiungere questo obiettivo? Qualsiasi suggerimento sarebbe davvero utile.

Grazie.

+0

"uname -a" mi dà questo : Linux 95e5ae04dbbc 4.2.0-27-generiC# 32-Ubuntu SMP ven 22 gennaio 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux. Non posso dire se la sua ubuntu14.04 o fedora o ubuntu 15.10. – Rahul

+0

Anche per usare sys, ho bisogno di sapere quale versione di python usare. La domanda in sé è come posso determinare quale versione utilizzare. :) – Rahul

+0

Continuavo a leggere la tua domanda nel modo sbagliato. Questo è il motivo per cui ho cancellato i miei commenti. Scuse. :) – idjaw

risposta

14

Il Filesystem Hierarchy Standard ha un standard definition for /etc/os-release, che dovrebbe essere disponibile sulla maggior parte delle distribuzioni:

file e/usr/lib/os a rilascio

La etc/os-release/co ottenere i dati di identificazione del sistema operativo.

Il formato di file di base di os-release è un elenco separato da una nuova riga di assegnazioni di variabili compatibili con l'ambiente. È possibile generare la configurazione dagli script della shell.

Questo significa che può solo fonte /etc/os-release e utilizzare $NAME o $ID per identificare la distribuzione. A titolo di esempio, su Fedora sembra che questo:

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

Su Debian:

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

Questo sembra buono. Funziona sulle ultime distribuzioni. Tuttavia, quando ho provato a vedere l'immagine di centos: 6, non contiene questo file. centos: l'ultimo ce l'ha. – Rahul

+0

RHEL6 (e quindi CentOS 6) è così vecchio, allora "/ etc/os-release' non esisteva ancora. Si potrebbe voler glob per '/ etc/* - release' invece. Penso che RHEL6 abbia un '/ etc/redhat-release', immagino che CentOS abbia qualcosa di simile. – morxa

+0

Grazie a @morxa. Ho usato una combinazione di python e os-release per ottenere informazioni sulla versione. Fino ad ora, copre quasi tutti i casi (redhat, ubuntu, debian, centos, opensuse, cirros ...) https://github.com/BU-NU-CLOUD-SP16/Container-Code-Classification/blob/ master/scripts/platform.sh – Rahul

1

Si potrebbe utilizzare file/etc/problema per Debian/Ubuntu:

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

o/etc/redhat-release per 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

Fallisce per centos. 'sh-4.2 # cat/etc/issue -----> fornisce ----> Kernel \ r su un \ m' – Rahul

+0

@Rahul Ho aggiornato la mia risposta. – pie

+0

per ogni distribuzione, il comando cambierà. Ad esempio, è cambiato da Ubuntu a Redhat. Allo stesso modo, potrebbe cambiare per opensuse. Questa soluzione non sembra in scala. – Rahul

1

Si dovrebbe usare seguente cmd per rilevare Ubuntu nome rilascio:

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

Per Ubuntu immagini docker Sto usando i seguenti cmds quando ho bisogno di aggiungere il multiverso a apt.source.liste e non hanno duplicato le linee:

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

Si dovrebbe usare seguente cmd per rilevare Debian nome rilascio (I am using per le mie immagini docker):

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

D'accordo, ma questo funziona solo per Ubuntu. La domanda è come determinare per la maggior parte dei sistemi operativi. La risposta e i commenti selezionati su questo hanno buoni punti per coprire la maggior parte delle distro importanti. Ed è anche più facile. – Rahul

+0

Python non fa parte di una distribuzione di alcune immagini Docker Base. Quindi suggerisco di incorporare rilevazioni specifiche in base al tipo di distro. PS: Ho aggiunto Debian e aggiornerò sulle prossime distribuzioni –

+0

Yup, ecco perché ho usato/etc/os-release prima, e se non è presente, allora si basano su python. Puoi controllare il commento nella risposta che punta al collegamento github facendo lo stesso. Sì, fallisce per le immagini che non hanno sia/etc/os-release che python, ma per il resto, funziona per molte distro conosciute. – Rahul