第7章 UBI コンテナーへのソフトウェアの追加

UBI (Red Hat Universal Base Images) は、RHEL コンテンツのサブセットから構築されます。UBI は、UBI でインストールするために自由に利用可能な RHEL パッケージのサブセットも提供します。実行中のコンテナーにソフトウェアを追加または更新するには、RPM パッケージおよび更新を含む dnf リポジトリーを使用します。UBI は、Python、Perl、Node.js、Ruby などの事前にビルドされた言語ランタイムコンテナーイメージを提供します。

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

  • UBI init および UBI 標準イメージでは、dnf コマンドを使用します。
  • UBI minimal イメージでは、microdnf コマンドを使用します。
注記

実行中のコンテナーでソフトウェアパッケージを直接インストールして作業すると、パッケージを一時的に追加します。この変更はコンテナーイメージに保存されません。パッケージの変更を永続化するには、Buildah を使用した Containerfile からのイメージのビルド セクションを参照してください。

注記

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

7.1. UBI init イメージの使用

Containerfile を使用してコンテナーをビルドできます。この Containerfile は、コンテナーがホストシステムで実行されている場合に Web サーバー (httpd) をインストールして、systemd サービス (/sbin/init) により Web サーバーが自動的に起動されるように設定します。podman build コマンドは、1 つ以上の Containerfiles および指定されたビルドコンテキストディレクトリー内の命令を使用してイメージをビルドします。コンテキストディレクトリーは、アーカイブ、Git リポジトリー、または Containerfile の URL として指定できます。コンテキストディレクトリーが指定されていない場合、現在の作業ディレクトリーはビルドコンテキストと見なされ、Containerfile が含まれている必要があります。--file オプションで Containerfile を指定することもできます。

前提条件

  • container-tools メタパッケージがインストールされている。

手順

  1. 新しいディレクトリーに以下の内容を含む Containerfile を作成します。

    FROM registry.access.redhat.com/ubi9/ubi-init
    RUN dnf -y install httpd; dnf clean all; systemctl enable httpd;
    RUN echo "Successful Web Server Test" > /var/www/html/index.html
    RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf
    EXPOSE 80
    CMD [ "/sbin/init" ]

    Containerfile は、httpd パッケージをインストールし、ブート時に httpd サービスが開始できるようにし、テストファイル (index.html) を作成し、Web サーバーをホスト (ポート 80) に公開し、コンテナーの起動時、systemd init サービス (/sbin/init) を開始します。

  2. コンテナーをビルドします。

    # podman build --format=docker -t mysysd .
  3. オプション: systemd を使用してコンテナーを実行する場合、システムで SELinux が有効になっている場合は、container_manage_cgroup ブール変数を設定する必要があります。

    # setsebool -P container_manage_cgroup 1
  4. mysysd_run という名前のコンテナーを実行します。

    # podman run -d --name=mysysd_run -p 80:80 mysysd

    mysysd イメージが mysysd_run コンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。

    注記

    ルートレスモードでは、1024 以上のホストのポート番号を選択する必要があります。以下に例を示します。

    $ podman run -d --name=mysysd -p 8081:80 mysysd

    1024 未満のポート番号を使用するには、net.ipv4.ip_unprivileged_port_start 変数を変更する必要があります。

    # sysctl net.ipv4.ip_unprivileged_port_start=80
  5. コンテナーが実行されていることを確認します。

    # podman ps
    a282b0c2ad3d  localhost/mysysd:latest  /sbin/init  15 seconds ago  Up 14 seconds ago  0.0.0.0:80->80/tcp  mysysd_run
  6. Web サーバーをテストします。

    # curl localhost/index.html
    Successful Web Server Test