Google Cloud SDKのslimイメージはslimじゃない

2025/04/14に公開

はじめに

Google Cloud SDKの公式Dockerイメージには、複数のイメージタグが用意されています。ぱっと見で目につく使えそうなのは以下のようなタグです。

  • gcr.io/google.com/cloudsdktool/cloud-sdk:stable
  • gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  • gcr.io/google.com/cloudsdktool/cloud-sdk:alpine

じゃあ slimが軽量そうだからこれ使えばヨシ!👉

とやってしまいそうなんですが、実際にイメージサイズを比較するとstable < alpine << slim のようになります。

$ podman image ls | grep cloud-sdk
gcr.io/google.com/cloudsdktool/cloud-sdk                                       stable              3f5b7b72a837  12 days ago    612 MB
gcr.io/google.com/cloudsdktool/cloud-sdk                                       slim                d8d3c1d7f6dc  12 days ago    1.73 GB
gcr.io/google.com/cloudsdktool/cloud-sdk                                       alpine              5a2366b84f37  12 days ago    879 MB

stableイメージが612MBなのに対してslimイメージは1.73GBとおよそ3倍ほどのサイズになっています。なぜでしょうか?

相違点

dockerやpodmanのimage history --no-trunc というサブコマンドを使うことでDockerfileで実行されたビルド命令の履歴を見ることができます。そこからDockerfileを復元してみました。COPYの際に中間イメージが失われているので一部不正確なところがあります。

stableイメージの Dockerfile(推定)

FROM debian:bookworm
COPY dir:f662c46b0d5efa4a408a108bd5c648307cee3c8aba96a7110feb9bba972d8caf /usr/lib/google-cloud-sdk
ENV PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/google-cloud-sdk/bin"
RUN groupadd -r -g 1000 cloudsdk && \
    useradd -r -u 1000 -m -s /bin/bash -g cloudsdk cloudsdk
RUN if [ "$(uname -m)" = "x86_64" ]; then \
        echo -n "x86_64" > /tmp/arch; \
    else \
        echo -n "arm" > /tmp/arch && \
        apt-get update -qqy && \
        apt-get -qqy upgrade && \
        apt-get install -qqy python3-dev python3-crcmod; \
    fi
RUN gcloud --version && \
    gsutil version -l && \
    bq version && \
    gcloud-crc32c /usr/lib/google-cloud-sdk/bin/gcloud && \
    gcloud config set core/disable_usage_reporting false && \
    gcloud config set component_manager/disable_update_check true && \
    gcloud config set metrics/environment docker_image_stable && \
    rm -rf /root/.cache/pip/ && \
    find /usr/lib/google-cloud-sdk -name '*.pyc' -delete && \
    find /usr/lib/google-cloud-sdk -name '*__pycache__*' -exec rm -r {} +
VOLUME ["/root/.config"]
COPY file:41dd57c698db67b2e92eb6324bbdcdf5d52c83fad74fc3b8e06d49eb52473dc0 /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

slimイメージの Dockerfile(推定)

FROM debian:bookworm
ARG CLOUD_SDK_VERSION
ARG INSTALL_COMPONENTS
ENV CLOUD_SDK_VERSION=517.0.0
COPY file:d8ac8f6cfdec9e11abcb8f84f90425ee26412c87cc50de81b61efcc6ac1c6288 /usr/local/bin/docker
COPY file:aa292d1ead1f98d147394592180d04214c9b6e7376d2765ecf85137ad5d3beac /usr/local/libexec/docker/cli-plugins/docker-buildx
RUN groupadd -r -g 1000 cloudsdk && \
    useradd -r -u 1000 -m -s /bin/bash -g cloudsdk cloudsdk
RUN mkdir -p /usr/share/man/man1/
RUN apt-get update -qqy && \
    apt-get -qqy upgrade && \
    apt-get install -qqy \
        curl \
        gcc \
        python3-dev \
        python3-crcmod \
        python3-pip \
        apt-transport-https \
        lsb-release \
        openssh-client \
        git \
        gnupg && \
    export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
    curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/google-cloud-cli.gpg && \
    echo "deb [signed-by=/etc/apt/keyrings/google-cloud-cli.gpg] https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" > /etc/apt/sources.list.d/google-cloud-sdk.list && \
    apt-get update && \
    apt-get install -y google-cloud-cli=${CLOUD_SDK_VERSION}-0 $INSTALL_COMPONENTS && \
    gcloud config set core/disable_usage_reporting true && \
    gcloud config set component_manager/disable_update_check true && \
    gcloud config set metrics/environment docker_image_slim && \
    gcloud --version && \
    gsutil version -l && \
    bq version && \
    gcloud-crc32c /usr/bin/gcloud && \
    docker --version
RUN git config --system credential.'https://source.developers.google.com'.helper gcloud.sh
VOLUME ["/root/.config"]

Dockerfileの長さからして結構違いますが、主に次のような相違が見受けられます。

  • 導入方法の違い: stableイメージは事前ビルドされたSDKをCOPYで追加しているのに対し、slimイメージはaptリポジトリから直接インストールしています。
  • 追加パッケージ: slimイメージには多くの追加パッケージ(curl, gcc, git, openssh-client...)に加えてdockerとdocker buildxがインストールされています。これがサイズ増加の主な原因でしょう。
  • クリーンアップ処理: stableイメージでは不要ファイル(キャッシュ、pycファイルなど)の詳細なクリーンアップが行われていますが、slimイメージではそのような最適化が少ないです。

使い分け

stable を使うべきケース

  • CI/CD ランタイムで gcloud コマンドだけを使いたいとき
  • 最小限の依存で済ませたいとき
  • コンテナサイズを小さく保ちたいとき

slim を使うべきケース

  • Docker CLI を併用する必要があるとき
  • Cloud SDK をカスタムコンポーネント付きでビルドしたいとき
  • 開発ベースイメージとして柔軟に拡張したいとき

多くのケースでstableイメージを選択して問題ないと思いますが、gcloud cliのcomponent managerが無効になっているため、各種のプラグインをgcloudコマンドでインストールすることはできません。gke-gcloud-auth-pluginが必要となる、といった場合はslimイメージをベースにビルドした方が簡単かもしれません。

おわりに

なお、コンテナイメージの公式ドキュメントにもきちんと記載があります。

:stable, :VERSION-stable: Default, Smallest (Debian-based) image with a standard gcloud installation.

ドキュメントを読めといういつもの結論になってしまいましたが、名前に惑わされず、実際の中身や目的に応じてイメージを選ぶことが重要ですね。

Discussion