ベアボーン AL2023 コンテナイメージの構築 - Amazon Linux 2023

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ベアボーン AL2023 コンテナイメージの構築

AL2023 コンテナイメージは、AL2023 AMI に含まれているのと同じソフトウェアコンポーネントから構築されています。これには、ベースコンテナレイヤーがパッケージマネージャー などの Amazon EC2 インスタンスで実行する場合と同様に動作することを可能にするソフトウェアが含まれていますdnf。このセクションでは、アプリケーションに必要な最低限の依存関係のみを含むコンテナをゼロから構築する方法について説明します。

注記

標準の AL2023 コンテナイメージは、ほとんどのユースケースに適しています。標準のコンテナイメージを使用すると、イメージ上に簡単に構築できます。ベアボーンコンテナイメージを使用すると、イメージ上に構築するのが難しくなります。

アプリケーションの依存関係を最低限に抑えたコンテナを作成する方法
  1. ランタイム依存関係を決定します。これはアプリケーションによって異なります。

  2. FROM scratch をビルドする Dockerfile または Containerfile を作成します。次の Dockerfile の例では、bash シェルとその依存関係のみを含むコンテナを構築できます。

    FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build RUN mkdir /sysroot RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install bash FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/bin/bash"]
    1. この Dockerfile は以下のように機能します。

      1. build という名前の AL2023 コンテナを起動します。このコンテナはべアボーンコンテナのブートストラップに使用されます。このコンテナ自体はデプロイされませんが、デプロイするコンテナが生成されます。

      2. /sysroot ディレクトリを作成します。このディレクトリは、build コンテナがべアボーンコンテナに必要な依存関係をインストールする場所になります。以降のステップでは、/sysroot パスはベアボーンイメージのルートディレクトリとなるようにパッケージ化されます。

        この --installroot オプションをこのように dnf に使用して、他の AL2023 イメージを作成します。これは、インストーラーとイメージ作成ツールを動作させる dnf の機能です。

      3. dnf を呼び出して、/sysroot にパッケージをインストールします。

        rpm -q system-release --qf '%{VERSION}' コマンドは system-release パッケージをクエリ (-q) し、クエリ対象のパッケージのバージョン (%{VERSION} 変数は RPM のバージョンに対応する rpm 変数) を出力するようにクエリ形式 (--qf) を設定します。

        dnf--releasever 引数を build コンテナ内の system-release バージョンに設定すると、Amazon Linux の更新されたコンテナベースイメージがリリースされるたびに、この Dockerfile を使用してベアボーンコンテナを再構築できます。

        を 2023.5.20240624 などの--releasever任意の Amazon Linux 2023 バージョンに設定することができます。これにより、buildコンテナは最新の AL2023 バージョンとして実行されますが、現在の AL2023 AL2023リリースに関係なく、2023.5.20240624 からベアボーンコンテナを構築します。

        --setopt=install_weak_deps=False 設定オプションでは、推奨や提案ではなく、必要な依存関係のみをインストールするように dnf に指示します。

      4. インストールしたシステムを空の (FROM scratch) コンテナのルートにコピーします。

      5. この /bin/bash の場合は、ENTRYPOINT を目的のバイナリに設定します。

  3. 空のディレクトリを作成し、ステップ 2 の例の内容を Dockerfile という名前のファイルに追加します。

    $ mkdir al2023-barebones-bash-example $ cd al2023-barebones-bash-example $ cat > Dockerfile <<EOF FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build RUN mkdir /sysroot RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install bash && dnf --installroot /sysroot clean all FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/bin/bash"] EOF
  4. 次のコマンドを実行してコンテナを構築します。

    $ docker build -t al2023-barebones-bash-example
  5. 以下のコマンドを使用してコンテナを実行し、bash オンリーコンテナがどれほど最小限であるかを確認します。

    $ docker run -it --rm al2023-barebones-bash-example bash-5.2# rpm bash: rpm: command not found bash-5.2# du -sh /usr/ bash: du: command not found bash-5.2# ls bash: ls: command not found bash-5.2# echo /bin/* /bin/alias /bin/bash /bin/bashbug /bin/bashbug-64 /bin/bg /bin/catchsegv /bin/cd /bin/command /bin/fc /bin/fg /bin/gencat /bin/getconf /bin/getent /bin/getopts /bin/hash /bin/iconv /bin/jobs /bin/ld.so /bin/ldd /bin/locale /bin/localedef /bin/pldd /bin/read /bin/sh /bin/sotruss /bin/sprof /bin/type /bin/tzselect /bin/ulimit /bin/umask /bin/unalias /bin/wait /bin/zdump

より実用的な例として、以下の手順では Hello World! を表示する C アプリケーション用のコンテナを構築します。

  1. 空のディレクトリを作成し、C ソースコードおよび Dockerfile を追加します。

    $ mkdir al2023-barebones-c-hello-world-example $ cd al2023-barebones-c-hello-world-example $ cat > hello-world.c <<EOF #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } EOF $ cat > Dockerfile <<EOF FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as build COPY hello-world.c / RUN dnf -y install gcc RUN gcc -o hello-world hello-world.c RUN mkdir /sysroot RUN mv hello-world /sysroot/ RUN dnf --releasever=$(rpm -q system-release --qf '%{VERSION}') \ --installroot /sysroot \ -y \ --setopt=install_weak_deps=False \ install glibc && dnf --installroot /sysroot clean all FROM scratch COPY --from=build /sysroot / WORKDIR / ENTRYPOINT ["/hello-world"] EOF
  2. 以下のコマンドを使用して、コンテナを構築します。

    $ docker build -t al2023-barebones-c-hello-world-example .
  3. 以下のコマンドを実行して、コンテナを起動します。

    $ docker run -it --rm al2023-barebones-c-hello-world-example Hello World!