2016-02-28 17 views
10

Herhangi bir docker görüntüsü için OS dağıtım adını belirlemem gerekiyor. ubuntu etiketleyebilirim: en sonimage1: en son, ancak image1'in dağıtım bilgilerini edinebilmem gerekir: en son başlatıldığında., bir docker görüntüsünün OS dağılımını belirler

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

Ancak bu görüntü içinde python2 veya python3 olup olmadığını bir bağımlılığı vardır: Bunu başarmak için

, aşağıda OS sürümü belirlemek için komut söz kullandı. Ubuntu için başarısız: 12.04 ve orada python2 kullanmam gerekiyor.

$ 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. Belirli bir görüntüde hangi python versiyonunun olduğunu bilmeden aynı şeyi elde edebilmemin bir yolu var mı?

NOT: Amaç, bu görüntüyü oluşturmak için kullanılan temel resmin hangisi olduğunu belirlemektir. Bu resmi oluşturmak için kullanılan Dockerfile erişimim yok.

Q2. Giriş noktasını kullanmanın başka bir yaklaşımı var. Dockerfile'ı kullanarak mevcut görüntüden ayrı bir görüntü oluşturabilirim. Ya da, kapsayıcıyı oluştururken cmdline olarak giriş noktasını belirtebilirim ancak kapsayıcıda erişilebilir olması için komut dosyasına ihtiyacım var. Cmdline kullanırken paylaşılan depolamaya ihtiyacım olabileceğini tahmin ediyorum, bunu başarmanın daha iyi bir yolu var mı? Herhangi bir işaretçi gerçekten yardımcı olacaktır.

Teşekkürler.

Sen Debian/Ubuntu için/etc/issue dosyasını kullanabilirsiniz
+0

"uname -a" Bana bu veriyor : Linux 95e5ae04dbbc 4.2.0-27-jenerik # 32-Ubuntu SMP Cum Jan 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux. Ubuntu14.04 veya fedora veya ubuntu15.10 olup olmadığını söyleyemem. – Rahul

+0

Sys kullanmak için bile, hangi python sürümünü kullanacağımı bilmem gerekir. Sorunun kendisi, hangi sürümü kullanacağımı belirleyebileceğim. :) – Rahul

+0

Sorunuzu yanlış bir şekilde okudum. Bu yüzden yorumlarımı sildim. Özür. :) – idjaw

cevap

14

Dosya Sistemi Hiyerarşisi Standart

/etc/os-salım ve/usr/lib/os salınımlı dosyaları ko: çoğu dağıtımlarında mevcut olmalıdır bir standard definition for /etc/os-release sahiptir ntain işletim sistemi tanımlama verileri.

Os-release'in temel dosya formatı, çevreye benzeyen kabuk uyumlu değişken atamaları için yeni satırlarla ayrılmış bir listedir. Yapılandırmayı kabuk betiklerinden kaynaklamak mümkündür.

Bu sadece kaynak /etc/os-release can ve dağılımını tespit etmek $NAME veya $ID kullanmak anlamına gelir. Bir örnek olarak, Fedora üzerinde şöyle görünür: Debian

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

:

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

Bu iyi görünüyor. En son dağıtımlarda çalışır. Ancak, centos'u görmeye çalıştığımda: 6 resim, içinde bu dosya yok. centos: sonuncusu var. – Rahul

+0

RHEL6 (ve dolayısıyla CentOS 6) çok eski, daha sonra ''/etc/os-release'' henüz mevcut değildi. Bunun yerine/etc/* - release' için glob yapmak isteyebilirsiniz. RHEL6'nın bir/etc/redhat-release olduğunu düşünüyorum, sanırım CentOS'ta da benzer bir şey var. – morxa

+0

Teşekkürler @morxa. Sürüm bilgisi almak için hem python hem de os-release'in bir kombinasyonunu kullandım. Şimdiye kadar, neredeyse tüm vakaları kaplıyor (redhat, ubuntu, debian, centos, opensuse, cirros ...) https://github.com/BU-NU-CLOUD-SP16/Container-Code-Classification/blob/ master/scripts/platform.sh – Rahul

1

:

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

veya CentOS için/etc/redhat-release/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 için başarısız. 'sh-4.2 # cat/etc/issue -----> verir ----> Kernel \ r \ an \ m' – Rahul

+0

@Rahul Cevabımı güncelledim. Her dağıtım için – pie

+0

, komut değişecektir. Eskiden Ubuntu'dan Redhat'a değişti. Benzer şekilde, opensuse için değişebilir. Bu çözüm ölçekli görünmüyor. – Rahul

1

Sen Ubuntu bırakma adını tespit etmek için komut Aşağıdaki kullanmalıdır: Ubuntu için

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

aptsource için multiverse eklemek gerektiğinde docker görüntüleri Aşağıdaki cmds kullanıyorum.listeleri ve yinelenen değil hatları:

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 && \ 
Sen (bu benim liman işçisi görüntüler için I am using) Debian bırakma adını tespit etmek için komut Aşağıdaki kullanmalıdır

:

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

Kabul edildi, ancak bu sadece ubuntu için çalışıyor. Soru, işletim sistemlerinin çoğunun nasıl belirleneceğidir. Seçilen cevap ve yorumlar, önemli dağıtımların çoğunu kapsayan iyi noktalara sahiptir. Ve daha da kolay. – Rahul

+0

Python, bazı Docker Temel Görüntülerinin dağıtımının bir parçası değildir. Bu yüzden dağıtım türüne göre belirli tespitler eklemenizi öneriyorum. Not: Debian'ı ekledim ve bir sonraki –

+0

Yup dağıtımında güncelleme yapacağım, bu yüzden önce/etc/os-release kullanıyorum ve eğer mevcut değilse python'a güveniyorum. Yorumu, github bağlantısının aynısını yaptığına işaret eden cevabı kontrol edebilirsiniz. Evet, hem/etc/os-release ve python'a sahip olmayan görüntüler için başarısız olur, ancak aksi halde birçok bilinen dağıtım için çalışır. – Rahul

İlgili konular