とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

RHEL 9.4のPodman 4.9でヒアドキュメントが使えるようになったらしいので試してみた

標題通り、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:ファイルの内容は使い回しなので...