4.7. 実行中の UBI コンテナーにソフトウェアを追加

UBI イメージは、Red Hat のコンテンツだけで構築されます。また、この UBI イメージは、UBI でインストールするのに自由に利用できる Red Hat Enterprise Linux パッケージのサブセットも提供します。ソフトウェアを追加または更新する場合、UBI イメージは、公式の Red Hat の RPM を保持するのに利用できる無料の yum リポジトリーを指定するように事前設定されています。

UBI コンテナーを実行するパッケージを UBI リポジトリーから追加するには、以下を行います。

  • ubi イメージで、yum コマンドをインストールするとパッケージを取り出せます。
  • ubi-minimal イメージには、yum の代わりに、microdnf コマンド (小規模な機能セット) が含まれます。

実行中のコンテナーでソフトウェアパッケージを直接インストールして作業する場合は、パッケージを一時的に追加します。もしくは、リポジトリーについて学ぶことになります。UBI ベースのイメージを構築する詳細な方法は「UBI ベースのイメージの構築」を参照してください。

UBI コンテナーにソフトウェアを追加する場合は、サブスクライブしている RHEL ホスト、またはサブスクライブしていない (または非 RHEL) システムで UBI イメージを更新する手順が異なります。UBI イメージを使用する 2 つの方法を以下に示します。

4.7.1. UBI コンテナーへのソフトウェアの追加 (サブスクライブされたホスト)

登録およびサブスクライブされた RHEL ホストで UBI コンテナーを実行している場合は、主要な RHEL Server リポジトリーが、標準の UBI コンテナーとすべての UBI リポジトリーで有効になります。そのため、Red Hat パッケージの全セットが利用できます。UBI の最小コンテナーでは、すべての UBI リポジトリーがデフォルトで有効になりますが、デフォルトではホストではリポジトリーが有効になっていません。

4.7.2. 標準の UBI コンテナーへのソフトウェアの追加

構築するコンテナーが再配布されるようにするには、ソフトウェアを追加するときに、標準の UBI イメージで非 UBI の yum リポジトリーを無効にします。UBI リポジトリー以外の yum リポジトリーをすべて無効にする場合は、ソフトウェアを追加するときに、自由に利用可能なリポジトリーのパッケージのみが使用されます。

サブスクライブしている RHEL ホストから、標準の UBI ベースイメージコンテナー (ubi8/ubi) でシェルを開いた状態で、次のコマンドを実行して、そのコンテナーにパッケージ (bzip2 パッケージなど) を追加します。

# yum install --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos bzip2

RHEL サーバーのリポジトリーにあり UBI リポジトリーにない標準の UBI コンテナーにソフトウェアを追加するには、リポジトリーを無効にせずに、パッケージをインストールします。

# yum install zsh

標準の UBI コンテナーから、別のホストのリポジトリーにあるパッケージをインストールするには、必要なリポジトリーを明示的に有効にする必要があります。以下に例を示します。

# yum install --enablerepo=rhel-7-server-optional-rpms zsh-html
警告

Red Hat UBI リポジトリーに含まれていない Red Hat パッケージをインストールすると、サブスクライブしたホスト外にコンテナーを配信できる範囲が制限される可能性があります。

4.7.3. 最小 UBI コンテナー内へのソフトウェアの追加

UBI の yum リポジトリーは、デフォルトで UBI 最小イメージで有効になります。

UBI 最小コンテナーでサブスクライブしている RHEL ホストのいずれかの UBI yum リポジトリーから、上記と同じパッケージ (bzip2) をインストールするには、以下を入力します。

# microdnf install bzip2

(UBI yum リポジトリーに含まれない) サブスクライブしたホストで利用可能なリポジトリーの最小 UBI コンテナーにパッケージをインストールするには、このリポジトリーを明示的に有効にする必要があります。以下に例を示します。

# microdnf install --enablerepo=rhel-7-server-rpms zsh
# microdnf install --enablerepo=rhel-7-server-rpms \
        --enablerepo=rhel-7-server-optional-rpms zsh-html
警告

UBI 以外の RHEL リポジトリーを使用して、UBI イメージにパッケージをインストールすると、そのイメージを共有し、サブスクライブしている RHEL システム以外で実行する機能が制限される可能性があります。

4.7.4. UBI コンテナーへのソフトウェアの追加 (サブスクライブしていないホスト)

サブスクライブしていない RHEL ホストまたはその他の Linux システムにある実行中のコンテナーにソフトウェアパッケージを追加するには、yum リポジトリーを無効にする必要がありません。以下に例を示します。

# yum install bzip2

UBI の最小コンテナーから、サブスクライブしていない RHEL ホストにそのパッケージをインストールする場合は、次のコマンドを実行します。

# microdnf install bzip2

前述のように、実行中の UBI コンテナーにソフトウェアを追加するこの両方の手段は、永続的な UBI ベースのコンテナーイメージを作成することを目的としているわけではありません。そのため、次のセクションで説明するように、UBI イメージに新しいレイヤーを構築する必要があります。

4.7.5. UBI ベースのイメージの構築

UBI ベースのコンテナーイメージは、他のイメージを構築するのと同じ方法で構築できますが、例外があります。再配布できる Red Hat ソフトウェアのみがイメージに含まれるようにするには、イメージを実際にビルドするときに非 UBI yum リポジトリーをすべて無効にする必要があります。

これは、buildah ユーティリティーを使用して、Dockerfile から、UBI ベースの Web サーバーコンテナーを作成する例です。

注記

ubi8/ubi-minimal イメージの場合は、以下のように、yum の代わりに microdnf を使用します。

RUN microdnf update -y && rm -rf /var/cache/yum
RUN microdnf install httpd -y && microdnf clean all
  1. Dockerfile の作成 - 以下の内容を含む Dockerfile を、新しいディレクトリーに追加します。

    FROM registry.access.redhat.com/ubi8/ubi
    USER root
    LABEL maintainer="John Doe"
    # Update image
    RUN yum update --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos -y && rm -rf /var/cache/yum
    RUN yum install --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos httpd -y && rm -rf /var/cache/yum
    # Add default Web page and expose port
    RUN echo "The Web Server is Running" > /var/www/html/index.html
    EXPOSE 80
    # Start the service
    CMD ["-D", "FOREGROUND"]
    ENTRYPOINT ["/usr/sbin/httpd"]
  2. 新しいイメージの構築 - そのディレクトリーにいるときに、buildah を使用して、新しい UBI レイヤー構造のイメージを作成します。

    # buildah bud -t johndoe/webserver .
    STEP 1: FROM registry.access.redhat.com/ubi8/ubi:latest
    STEP 2: USER root
    STEP 3: LABEL maintainer="John Doe"
    STEP 4: RUN yum update --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos -y
    . . .
    No packages marked for update
    STEP 5: RUN yum install --disablerepo=* --enablerepo=ubi-8-appstream --enablerepo=ubi-8-baseos httpd -y
    Loaded plugins: ovl, product-id, search-disabled-repos
    Resolving Dependencies
    --> Running transaction check
    =============================================================
     Package                  Arch               Version                        Repository                    Size
    =============================================================
    Installing:
     httpd              x86_64 2.4.37-10
                                                  latest-rhubi-8.0-appstream 1.4 M
    Installing dependencies:
     apr                x86_64 1.6.3-9.el8        latest-rhubi-8.0-appstream 125 k
     apr-util           x86_64 1.6.1-6.el8        latest-rhubi-8.0-appstream 105 k
     httpd-filesystem   noarch 2.4.37-10
                                                  latest-rhubi-8.0-appstream  34 k
     httpd-tools        x86_64 2.4.37-10.
    ...
    
    Transaction Summary
    ...
    Complete!
    STEP 6: RUN echo "The Web Server is Running" > /var/www/html/index.html
    STEP 7: EXPOSE 80
    STEP 8: CMD ["-D", "FOREGROUND"]
    STEP 9: ENTRYPOINT ["/usr/sbin/httpd"]
    STEP 10: COMMIT
    ...
    Writing manifest to image destination
    Storing signatures
    --> 36a604cc0dd3657b46f8762d7ef69873f65e16343b54c63096e636c80f0d68c7
  3. テスト - UBI レイヤー構造の webserver イメージをテストします。

    # podman run -d -p 80:80 johndoe/webserver
    bbe98c71d18720d966e4567949888dc4fb86eec7d304e785d5177168a5965f64
    # curl http://localhost/index.html
    The Web Server is Running

4.7.6. AppStream ランタイムイメージの使用

Red Hat Enterprise Linux 8 AppStream は、コンテナービルドのベースとして使用できる別のコンテナーイメージセットを提供します。このイメージは、RHEL 標準ベースイメージに基づいて構築されており、ほとんどはすでに UBI イメージとして更新されています。このイメージには、特定のランタイム環境で使用する追加ソフトウェアが含まれます。

したがって、PHP ランタイムソフトウェアなどが必要な複数のイメージを構築することが予想される場合は、PHP ソフトウェアコレクションイメージから始めることで、そのイメージに対してより一貫性のあるプラットフォームを提供できます。

以下は、UBI ベースイメージに構築された AppStream コンテナーイメージの例です。これは、Red Hat レジストリー (registry.access.redhat.com または registry.redhat.io) から入手できます。

  • ubi8/php-72 - アプリケーションを構築して実行する PHP 7.2 プラットフォーム
  • ubi8/nodejs-10 - アプリケーションを構築して実行する Node.js 10 プラットフォーム。Node.js 10 Source-To-Image ビルドで使用
  • ubi8/ruby25 - アプリケーションを構築して実行する Ruby 2.5 プラットフォーム
  • ubi8/python-27 - アプリケーションを構築して実行する Python 2.7 プラットフォーム
  • ubi8/python-36 - アプリケーションを構築して実行する Python 3.6 プラットフォーム
  • ubi8/s2i-core - perl、python、ruby などのビルダーイメージのベースとして使用する、基本的なライブラリーおよびツールを含むベースイメージ
  • ubi8/s2i-base - Source-to-Image ビルドのベースイメージ

このような UBI イメージコンテナーには、従来のイメージと同じ基本ソフトウェアが含まれているため、詳細は『Using Red Hat Software Collections Container Images』を参照してください。このようなイメージを取得するには、UBI イメージ名を使用してください。

RHEL 8 AppStream コンテナーイメージは、RHEL 8 ベースイメージが更新されるたびに更新されます。RHEL 7 の場合、このイメージ (Red Hat Software Collections イメージと呼ばれています) は、(Dotnet および DevTools の関連イメージである) RHEL ベースイメージの更新とは別のスケジュールで更新されます。このようなイメージの詳細は「Red Hat Container Catalog」を検索します。更新スケジュールの詳細は「Red Hat Container Image Updates」を参照してください。

4.7.7. UBI コンテナーイメージソースコードの取得

すべての Red Hat UBI ベースのイメージのソースコードは、ダウンロード可能なコンテナーの形で入手できます。続行する前に、Red Hat ソースコンテナーに注意してください。

  • コンテナーとしてパッケージ化されているにもかかわらず、ソースコンテナーイメージを実行できません。システムに Red Hat ソースコンテナーイメージをインストールするには、podman pull コマンドを使用する代わりに、skopeo コマンドを使用します。

    • skopeo copy コマンドを使用して、ソースコンテナーイメージをローカルシステムのディレクトリーにコピーします。
    • skopeo inspect コマンドを使用して、ソースコンテナーイメージを検査します。
  • skopeo コマンドの詳細は、「Section 1.5.Using skopeo to work with container registries」を参照してください。
  • ソースコンテナーイメージは、それらが表すバイナリーコンテナーに基づいて名前が付けられます。たとえば、ある標準的な RHEL UBI 8 コンテナーでは、registry.access.redhat.com/ubi8:8.1-397-source を追加してソースコンテナーイメージを取得します (registry.access.redhat.com/ubi8:8.1-397-source)。
  • ソースコンテナーイメージがローカルディレクトリーにコピーされたら、tar コマンド、gzip コマンド、および rpm コマンドの組み合わせを使用して、そのコンテンツを操作できます。
  • コンテナーイメージがリリースされてから、関連するソースコンテナーが利用可能になるまでに数時間かかる場合があります。

手順

  1. skopeo copy コマンドを使用して、ソースコンテナーイメージをローカルディレクトリーにコピーします。

    $ skopeo copy \
    registry.access.redhat.com/ubi8:8.1-397-source \
    dir:$HOME/TEST
    ...
    Copying blob 477bc8106765 done
    Copying blob c438818481d3 done
    Copying blob 26fe858c966c done
    Copying blob ba4b5f020b99 done
    Copying blob f7d970ccd456 done
    Copying blob ade06f94b556 done
    Copying blob cc56c782b513 done
    Copying blob dcf9396fdada done
    Copying blob feb6d2ae2524 done
    Copying config dd4cd669a4 done
    Writing manifest to image destination
    Storing signatures
  2. skopeo inspect コマンドを使用して、ソースコンテナーイメージを検査します。

    $ skopeo inspect dir:$HOME/TEST
    {
        "Digest": "sha256:7ab721ef3305271bbb629a6db065c59bbeb87bc53e7cbf88e2953a1217ba7322",
        "RepoTags": [],
        "Created": "2020-02-11T12:14:18.612461174Z",
        "DockerVersion": "",
        "Labels": null,
        "Architecture": "amd64",
        "Os": "linux",
        "Layers": [
            "sha256:1ae73d938ab9f11718d0f6a4148eb07d38ac1c0a70b1d03e751de8bf3c2c87fa",
            "sha256:9fe966885cb8712c47efe5ecc2eaa0797a0d5ffb8b119c4bd4b400cc9e255421",
            "sha256:61b2527a4b836a4efbb82dfd449c0556c0f769570a6c02e112f88f8bbcd90166",
            ...
            "sha256:cc56c782b513e2bdd2cc2af77b69e13df4ab624ddb856c4d086206b46b9b9e5f",
            "sha256:dcf9396fdada4e6c1ce667b306b7f08a83c9e6b39d0955c481b8ea5b2a465b32",
            "sha256:feb6d2ae252402ea6a6fca8a158a7d32c7e4572db0e6e5a5eab15d4e0777951e"
        ],
        "Env": null
    }
  3. すべてのコンテンツを展開するには、次のコマンドを実行します。

    $ cd $HOME/TEST
    $ for f in $(ls); do tar xvf $f; done
  4. 結果を確認するには、次のコマンドを実行します。

    $ find blobs/ rpm_dir/
    blobs/
    blobs/sha256
    blobs/sha256/10914f1fff060ce31388f5ab963871870535aaaa551629f5ad182384d60fdf82
    rpm_dir/
    rpm_dir/gzip-1.9-4.el8.src.rpm
  5. コンテンツの調査と使用を開始します。

4.7.8. UBI イメージの使用に関するヒント

UBI イメージを使用する際に考慮すべき問題を以下に示します。

  • 既存の Red Hat Software Collections ランタイムイメージで使用される数百の RPM パッケージは、新しい UBI イメージに同梱されている yum リポジトリーに保存されます。UBI イメージにこの RPM をインストールして、必要なランタイム (python、php、nodejs など) をエミュレートします。
  • UBI の最小イメージ (ubi8/ubi-minimal) には、いくつかの言語ファイルとドキュメントが含まれていないため、そのコンテナーで rpm -Va を実行すると、多くのパッケージの内容が欠落しているか変更されているものとして表示されます。そのコンテナーの中にファイルの完全なリストがあることが重要な場合は、Tripwire などのツールを使用してファイルをコンテナーに記録し、後で確認することを考慮してください。
  • レイヤー構造のイメージを作成したら、podman history を使用して、どの UBI イメージが構築されたかを確認します。たとえば、前に示した webserver の例を完了したら、podman history johndoe/webserver と入力して、それが構築されたイメージに、Dockerfile の FROM 行に追加した UBI イメージのイメージ ID が含まれていることを確認します。

4.7.9. UBI の新機能を要求する方法

Red Hat パートナーおよびお客様は、標準の方法でサポートチケットを作成することにより、パッケージリクエストを含む新機能を要求できます。Red Hat 以外のお客様はサポートを受けませんが、適切な RHEL 製品向けの標準 Red Hat Bugzilla でリクエストを作成できます。「Red Hat Bugzilla Queue」 も併せて参照してください。

4.7.10. UBI のサポートケースを作成する方法

Red Hat パートナーおよびお客様は、サポートされる Red Hat プラットフォーム (OpenShift/RHEL) で UBI を実行している場合に、通常の方法でサポートチケットを作成できます。Red Hat サポートスタッフがパートナーとお客様の問題に対応します。

「サポートケースを作成する」も併せて参照してください。