標題通り、2024年5月1日にリリースされたばかりのRedHat Enterprise Linux (以下RHEL)9.4のPodman 4.9でヒアドキュメントが使えるようになったらしいので、早速試してみました。
RHEL 9.4でと書きましたが、今後リリースされるであろうRHELクローンディストリビューションでも、当然Fedoraや他のLinuxディストリビューションで該当のバージョン以上のPodmanをインストールした場合も、同じように使えると思います。
Podmanをインストールしてみる
まずはPodmanをインストールします。Podman 4.9.4がインストールされました。
$ sudo dnf install -y poman $ podman --version podman version 4.9.4-rhel
イメージの作成
次に、イメージを作成するためのマニフェストファイルを作成します。 RHELネタなのに別のディストリビューションイメージを使ってて申し訳ないです*1。
あえていうことではないと思いますが、コメントアウトしている部分を各イメージの作成時にコメントをはずしてイメージを作成します。
$ cat test.py print("hello world") $ cat Containerfile FROM docker.io/ubuntu:22.04 # あまり良くない書き方をあえてしてみる #RUN apt-get update #RUN apt-get install -y python3 #RUN rm -rf /var/lib/apt/lists/* # HereDoc 命令で書いてみる #RUN <<EOF #apt-get update #apt-get install -y python3 #rm -rf /var/lib/apt/lists/* #EOF # Switch to non-root user: RUN useradd --create-home appuser WORKDIR /home/appuser USER appuser ADD test.py /home/appuser/ # Runs as non-root user: ENTRYPOINT ["python3", "test.py"]
該当部分は&&でつなげて、こんな感じで書きますよね。 また、Pythonのコードを実行するだけなら、
#RUN apt-get update && \ apt-get install -y python3 && \ rm -rf /var/lib/apt/lists/*
それぞれのイメージを作成します。
$ podman build --compress -t simple:latest -f Containerfile . $ podman build --compress -t heredocuse:latest -f Containerfile .
イメージレイヤーを確認してみる
ヒアドキュメントを使っていない方を確認すると、イメージレイヤーは共通する一行目のイメージを除いて5つに増えています。
$ podman image inspect simple:latest ... "RootFS": { "Type": "layers", "Layers": [ "sha256:629ca62fb7c791374ce57626d6b8b62c76378be091a0daf1a60d32700b49add7", "sha256:a7992000b484c3e017e0616e2251030d68efc55f7cfddce150b0a0e453ada814", "sha256:721a4397c8ec8513e98ceb2906fdff22915ea5122ef829ef16127bf342542088", "sha256:bf8e648dd9531f4969250f8eae90dd2d2c24be450857d79288bccca5e03fabc5", "sha256:8f87fbb2b75296a167cd299a27802c355397c7ec83a42b426fe64167d5736c9f", "sha256:6cc2607a7d83f0a7f12b53d94c230f604f6e06b72330094b9253c27044d53efb" ] },
ヒアドキュメントを使って作ったイメージは3つになっています。イメージレイヤーが確かに削減できることを確認できました。
$ podman image inspect heredocuse:latest ... "RootFS": { "Type": "layers", "Layers": [ "sha256:629ca62fb7c791374ce57626d6b8b62c76378be091a0daf1a60d32700b49add7", "sha256:611117edc2b166b60d11e2862b1375a96fddac2936ee39f74e4326ecdf5d52ec", "sha256:8e1737d9fc29ad2ea6ee545f60e081cc246bb574ea334040c0b1ce6f58cd02cc", "sha256:903e022ff745a58be3f56f9007c617828c6b509ac386957f14e8173478f14982" ] },
レイヤーの数は旧来の書き方(&&で繋ぐやり方)と一緒でした。 タイプする文字数と見栄えを考えると、ヒアドキュメントを使うほうがシンプルに見えるような気がします。
$ podman image inspect anduse:latest ... "RootFS": { "Type": "layers", "Layers": [ "sha256:629ca62fb7c791374ce57626d6b8b62c76378be091a0daf1a60d32700b49add7", "sha256:8aa62e8bd5ba9ea0c64fb30474579eca21a164402df846553a8bb651e53517c0", "sha256:57059babea575317fa99e6fd7ff9629637af3922bcf8a02d933d102ea3f92bca", "sha256:ca40c6a791e9d54894be21e4c4eb674728578239e1612084e1ac3dc55396ccd9" ] },
ヒアドキュメントはDockerでも使えるので、今後は&&を使わずにヒアドキュメントを積極的に使っていきたいと思いました。 え、現在利用しているPodmanやDockerのバージョンが古くて使えないですって? それなら管理者に相談しましょう。
*1:ファイルの内容は使い回しなので...