2016-02-28 4 views
10

ドッカー画像のOS配布名を決定する必要があります。 ubuntu:image1:latestとタグ付けできますが、起動時にimage1:latestの配信情報を取得できるはずです。これを達成するためのドッカー画像のOS配布を決定する

は、私は以下のOSのバージョンを確認するためのコマンドを挙げ使用:

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

をしかし、これは、画像がそれにpython2又はのpython3を持っているかどうかに依存しています。 ubuntu:12.04で失敗し、そこにpython2を使用する必要があります。

$ 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。特定のイメージにあるPythonのバージョンを知ることなく、同じことを達成できる方法はありますか?

注:目的は、この画像を作成するために使用されたベース画像がどれかを判断することです。この画像を作成するために使用されたDockerfileにアクセスすることはできません。

Q2。エントリポイントを使用する別の方法があります。 Dockerfileを使用して現在の画像とは別の画像を作成できます。または、コンテナを作成するときにcmdlineにentrypointを指定できますが、コンテナ内でスクリプトにアクセスできるようにする必要があります。私はcmdlineを使うときに共有ストレージが必要かもしれないと推測していますが、これを実現する良い方法はありますか?どんなポインタであれ、本当に役に立ちます。

ありがとうございました。

+0

"は、una​​me -aは、" 私にこれを提供します:Linux 95e5ae04dbbc 4.2.0-27-generic#32-Ubuntu SMP Fri Jan 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux。私はそのubuntu14.04かfedoraかubuntu15.10かどうかは言えません。 – Rahul

+0

sysを使ったとしても、使用するPythonのバージョンを知る必要があります。質問自体は、どのバージョンを使用するかを決定する方法です。 :) – Rahul

+0

私は間違った方法であなたの質問を読んで続けた。それが私のコメントを削除した理由です。謝罪。 :) – idjaw

答えて

14

はFilesystem Hierarchy Standardをほとんどのディストリビューションで利用可能であるべき、standard definition for /etc/os-releaseがあります

の/ etc/OSリリースと/ usr/libに/ OS-リリースファイルをコオペレーティングシステムの識別データが必要です。

os-releaseの基本ファイル形式は、環境に似たシェル互換の変数割り当ての改行で区切られたリストです。シェルスクリプトから構成を入手することは可能です。

これはあなただけで/etc/os-releaseを調達し、配布を識別するために$NAMEまたは$IDを使用できることを意味します。 Ubuntuのため

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

Ubuntuのリリース名を検出するためにcmdを以下

あなたが使用する必要があります
% source /etc/os-release 
% echo $NAME 
Debian GNU/Linux 
% echo $ID 
debian 
+0

これは良く見えます。最新のディストリビューションで動作します。しかし、私はcentos:6イメージを見ようとしたとき、このファイルがありませんでした。 centos:最新のものがあります。 – Rahul

+0

RHEL6(したがってCentOS 6)は古く、 '/ etc/os-release'はまだ存在しませんでした。代わりに、 '/ etc/* - release'のためにglobすることができます。私はRHEL6に '/ etc/redhat-release'があったと思いますが、CentOSには似たようなものがあります。 – morxa

+0

ありがとう@morxa。バージョン情報を取得するために、Pythonとos-releaseの両方の組み合わせを使用しました。これまでは、ほぼすべてのケース(redhat、ubuntu、debian、centos、opensuse、cirros ...)をカバーしています。https://github.com/BU-NU-CLOUD-SP16/Container-Code-Classification/blob/ master/scripts/platform.sh – Rahul

1

は、Debian/Ubuntuのための/ etc/issueファイル使用することができますCentOSの/レッドハット/ Fedoraのための

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

または/ etc/redhatのリリース:

[[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

は100セントで失敗します。 'sh-4.2#cat/etc/issue -----> \ - カーネル\ rを\ m'に与える – Rahul

+0

@Rahul私は自分の答えを更新しました。配布ごとに – pie

+0

を入力すると、コマンドが変更されます。以前は、UbuntuからRedhatに変更されていました。同様に、opensuseのために変更される可能性があります。この解決法は一定の縮尺ではないようです。 – Rahul

1

:Debianでは

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

:例として、Fedoraの上では、このようになりますドッカーの画像私はapt.sourceにmultiverseを追加する必要があるとき、次のcmdsを使用しています。リストやライン重複していない。(それは私のドッキングウィンドウのイメージのためI am usingのDebianリリース名を検出するCMD以下のあなたが使用する必要があります

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

を:

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

同意しましたが、これはubuntuでのみ有効です。問題は、ほとんどのオペレーティングシステムを決定する方法です。選択された答えとそのコメントは、重要なディストリビューションのほとんどをカバーする良い点があります。そしてそれはより簡単です。 – Rahul

+0

Pythonは一部のDockerベースイメージの配布の一部ではありません。だからあなたのディストリビューションタイプに基づいて特定の検出を埋め込むことをお勧めします。 PS:Debianを追加しました。次のディストリビューションで更新します –

+0

Yup、なぜ私は/ etc/os-releaseを最初に使ったのですか?存在しなければ、Pythonに依存しています。あなたは同じことをしてgithubリンクを指している答えのコメントを確認することができます。ええ、/ etc/os-releaseとpythonの両方を持たない画像では失敗しますが、それ以外の場合は多くの既知のディストリビューションで動作します。 – Rahul

関連する問題