podman イメージを縮小する

イメージはレイヤ構造のため、Dockerfile に記述された RUN や ADD 、またコンテナ内で変更した後にcommitするとレイヤが新しく生成されます。このため、レイヤのサイズが大きくなってしまいます。

イメージを縮小する方法としてbuild時に–squash、–squash-allを使う方法があります。

たとえば以下のようなDockerfileがあったとします。

FROM registry.centos.org/centos:centos8

RUN dnf -y update && dnf clean all

RUN dnf -y install glibc-locale-source glibc-langpack-en
RUN localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
RUN echo 'LANG="ja_JP.UTF-8"' >  /etc/locale.conf
ENV LANG ja_JP.UTF-8

RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

RUN dnf install -y java-11-openjdk-headless.x86_64

RUN dnf clean all

これをそのまま–squash、–squash-allを付けずにbuildすると587MBになります。レイヤは10個あります。

podman build -t centos8_jp_java11:v2 .
# podman images
REPOSITORY                   TAG          IMAGE ID      CREATED         SIZE
localhost/centos8_jp_java11  v2           0bd774f2dee3  41 minutes ago  587 MB
registry.centos.org/centos   centos8      b000d67685a5  4 months ago    223 MB
# podman inspect localhost/centos8_jp_java11:v2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            "Layers": [
                "sha256:4d330ab6e8a980ae73947d118271068b3ebc6cdc23571fcecf469243fdbd00e0",
                "sha256:45e00047dacc6941f19f63a50b51d927dcbbe1a3542c1b956d27255112ea830a",
                "sha256:d424f860bf7e41d8bc15f16deb2a0141cb166dc273ee529c992797ec26dbcca5",
                "sha256:ebaf4a698dc4f2c0b67992b701191ed4a7d5f6448c4384d5a4594d5f0028a8c6",
                "sha256:920f65df8c6e9db35187cdc72190bfb4ab81e414bfbd54db7aecd6f02da8eb37",
                "sha256:68c304d9ce746602f3ad4683ee06802ebdb801b8269fe5f6d1459ddc33e9c598",
                "sha256:eeccfad7eaeb58587087fb79fd0886529f80d6afd0a2da51a3ab355f07be58fe",
                "sha256:b21871ade9ebb9037f981cc8fc35bb3336859e0408df146681842ac921dc5d62",
                "sha256:4b4e57d3ac2054eaccd58fa1e4efcc73236d9e2ec7516d9d8e4becd9184e27a7",
                "sha256:e326b833080c23a7b663ec5393273c52a3cc20243de3f564e46a47bc621bf418"
            ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

–squashを付けてbuildすると531MBとなりました。レイヤは2個になってます。–squashの場合、Dockerfileの

「FROM registry.centos.org/centos:centos8」部分のレイヤは単一Layerの変換対象にはなっていません。

podman build --squash -t centos8_jp_java11:v1 .
# podman images
REPOSITORY                   TAG          IMAGE ID      CREATED         SIZE
localhost/centos8_jp_java11  v2           0bd774f2dee3  41 minutes ago  587 MB
localhost/centos8_jp_java11  v1           f8a3732b31a3  46 minutes ago  531 MB
registry.centos.org/centos   centos8      b000d67685a5  4 months ago    223 MB
# podman inspect localhost/centos8_jp_java11:v2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            "Layers": [
                "sha256:4d330ab6e8a980ae73947d118271068b3ebc6cdc23571fcecf469243fdbd00e0",
                "sha256:b831b5cf64682ab15675c1d71b94fdb29b66bc6e1713d386e4672efc7108dd0b"
            ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

次に–squash-allを付けてbuildすると487MBとなりました。レイヤは1個になっており、

「FROM registry.centos.org/centos:centos8」部分のレイヤも含め、単一Layerの変換対象にはなってます。

podman build --squash-all -t centos8_jp_java11:v3 .
# podman images
REPOSITORY                   TAG          IMAGE ID      CREATED         SIZE
localhost/centos8_jp_java11  v3           2d8df1dc505a  35 minutes ago  487 MB
localhost/centos8_jp_java11  v2           0bd774f2dee3  41 minutes ago  587 MB
localhost/centos8_jp_java11  v1           f8a3732b31a3  46 minutes ago  531 MB
registry.centos.org/centos   centos8      b000d67685a5  4 months ago    223 MB
# podman inspect localhost/centos8_jp_java11:v2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            "Layers": [
                "sha256:e5178cd0a1caca5399132779a678391afc25a5fc469085ed4ef9c2b3475662bc"
            ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~