

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

# 必要最低限の AL2023 コンテナイメージの構築
<a name="barebones-containers"></a>

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

**注記**  
標準 AL2023 コンテナイメージは、ほとんどのユースケースに適しています。標準のコンテナイメージを使用すると、イメージ上に簡単に構築できます。必要最低限のコンテナイメージの場合、既存のイメージ上に構築することがより困難になります。

**アプリケーションの依存関係を最低限に抑えたコンテナを作成する方法**

1. ランタイム依存関係を決定します。これはアプリケーションによって異なります。

1. `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 コンテナを起動します。このコンテナはべアボーンコンテナのブートストラップに使用されます。このコンテナ自体はデプロイされませんが、デプロイするコンテナが生成されます。

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

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

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

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

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

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

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

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

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

1. 空のディレクトリを作成し、ステップ 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
   ```

1. 次のコマンドを実行してコンテナを構築します。

   ```
   $ docker build -t al2023-barebones-bash-example
   ```

1. 以下のコマンドを使用してコンテナを実行し、`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
   ```

1. 以下のコマンドを使用して、コンテナを構築します。

   ```
   $ docker build -t al2023-barebones-c-hello-world-example .
   ```

1. 以下のコマンドを実行して、コンテナを起動します。

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