web-dev-qa-db-ja.com

DockerイメージのOSディストリビューションを決定する

DockerイメージのOSディストリビューション名を確認する必要があります。 buntu:latestimage1:latestとしてタグ付けできますが、起動時にimage1:latestの配布情報を取得できるはずです。

これを実現するために、以下のコマンドを使用して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またはpythonが含まれているかどうかに依存します。 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でエントリーポイントを指定できますが、コンテナー内でスクリプトにアクセスできる必要があります。 cmdlineを使用するときに共有ストレージが必要になる可能性があると思いますが、これを実現するためのより良い方法はありますか?どんなポインタでも本当に役に立ちます。

ありがとう。

16
Rahul

ファイルシステム階層標準には /etc/os-releaseの標準定義 があり、ほとんどのディストリビューションで使用できます。

/ etc/os-releaseおよび/ usr/lib/os-releaseファイルには、オペレーティングシステムの識別データが含まれています。

Os-releaseの基本的なファイル形式は、環境に似たシェル互換の変数割り当ての改行区切りリストです。シェルスクリプトから設定を取得することが可能です。

つまり、/etc/os-releaseをソースとして使用し、$NAMEまたは$IDを使用して分布を特定できます。例として、Fedoraでは次のようになります。

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

Debianの場合:

% source /etc/os-release
% echo $NAME
Debian GNU/Linux
% echo $ID
debian
26
morxa

Debian/Ubuntuには/ etc/issueファイルを使用できます。

root@ubuntu_container:/# cat /etc/issue
Ubuntu 14.04.3 LTS \n \l

または/ etc/redhat-release for CentOS/Red Hat/Fedora:

[root@Fedora_container /]# cat /etc/redhat-release 
Fedora release 23 (Twenty Three)

[root@centos_container /]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)
3
pie

Ubuntuリリース名を検出するには、次のコマンドを使用する必要があります。

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

Ubuntu Dockerイメージの場合、apt.source.listsにマルチバースを追加する必要があり、重複する行がない場合は、次のコマンドを使用しています。

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

次のコマンドを使用して、Debianリリース名を検出する必要があります( 私は使用しています 私のDockerイメージの場合):

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