Google Cloud SDKのslimイメージはslimじゃない
はじめに
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