はじめに
Docker
を使用していると様々なイメージをビルドする機会があるのだが、数が多くなるにつれてディスク容量を圧迫していく。
そのため、一つ一つのイメージが小さくして使用量を減らしていくことを考え docker-slim
での軽量化を試みた。
環境
Mac OS Sonoma 14.5
Homebrew 4.3.1
docker-slimについて
- SimToolkit
https://github.com/slimtoolkit/slim
docker-slimのインストール
slimtoolkit
https://slimtoolkit.org/
brew install docker-slim
brew install docker-slim
==> Downloading https://ghcr.io/v2/homebrew/core/docker-slim/manifests/1.40.11
######################################################################################################################################################## 100.0%
==> Fetching docker-slim
==> Downloading https://ghcr.io/v2/homebrew/core/docker-slim/blobs/sha256:7b4aabd09784a08f074d2d2957142b6e9cb85d7197b3705d74bd30d9c9f01952
######################################################################################################################################################## 100.0%
==> Pouring docker-slim--1.40.11.sonoma.bottle.tar.gz
🍺 /usr/local/Cellar/docker-slim/1.40.11: 8 files, 66.3MB
==> Running `brew cleanup docker-slim`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
docker-slimを使う
今回は、以前作成した HugoブログをDockerで構築する2のイメージを軽量化する。
軽量化したいコンテナイメージ
~/workspace/blog-hugo$docker ps [master|… ]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4b98591d947 blog-hugo-hugo "hugo server --bind …" 2 months ago Up 20 minutes 0.0.0.0:1313->1313/tcp blog-hugo-hugo-1
082d153dbbe8 blog-hugo-tcardgen "tail -f /dev/null" 2 months ago Up 20 minutes blog-hugo-tcardgen-1
IDと現在のコンテナイメージサイズ
~/workspace/blog-hugo$docker images blog-hugo-hugo [master|… ]
REPOSITORY TAG IMAGE ID CREATED SIZE
blog-hugo-hugo latest 03b7c5dd095c 3 months ago 2.29GB
~/workspace/blog-hugo$docker images blog-hugo-tcardgen [master|… ]
REPOSITORY TAG IMAGE ID CREATED SIZE
blog-hugo-tcardgen latest ee9b3f491796 3 months ago 1.52GB
slimコマンドを使ってイメージを作成
docker-slim
はslim
コマンドを使うとのこと。
早速使ってみる。
slim
対話式になっており、Enter
を押すと、hint
が出てくる。
>>>
>>>
exit Exit app
xray Shows what's inside of your container image and reverse engineers its Dockerfile
lint Analyzes container instructions in Dockerfiles
build Analyzes, profiles and optimizes your container image auto-generating Seccomp and AppArmor security profiles
merge Merge two container images (optimized to merge minified images)
images Get information about container images
build --target blog-hugo-hugo:latest --http-probe-off
>>> build --target blog-hugo-hugo:latest --http-probe-off
cmd=build info=exec message='changing continue-after from probe to nothing because http-probe is disabled'
cmd=build info=exec message='changing continue-after to enter'
cmd=build state=started
cmd=build info=params rt.as.user='true' keep.perms='true' tags='' image-build-engine='internal' target.type='image' target.image='blog-hugo-hugo:latest' continue.mode='enter'
cmd=build state=image.inspection.start
cmd=build info=image id='sha256:03b7c5dd095ceb7ca748993e3a6ddb5b0c4849319195c0f08afae634a9a9b239' size.bytes='2294014518' size.human='2.3 GB'
cmd=build info=image.stack index='0' name='blog-hugo-hugo:latest' id='sha256:03b7c5dd095ceb7ca748993e3a6ddb5b0c4849319195c0f08afae634a9a9b239'
cmd=build info=image.exposed_ports list='1313/tcp'
cmd=build state=image.inspection.done
cmd=build state=container.inspection.start
cmd=build info=container name='slimk_25391_20240523054757' id='c19ea26452b2864f85c3876894c06ff7550dc78115dfea068433cbe679077a25' status='created'
cmd=build info=container status='running' name='slimk_25391_20240523054757' id='c19ea26452b2864f85c3876894c06ff7550dc78115dfea068433cbe679077a25'
cmd=build info=container message='obtained IP address' ip='172.17.0.2'
cmd=build info=cmd.startmonitor status='sent'
cmd=build info=event.startmonitor.done status='received'
cmd=build info=container target.port.info='1313/tcp => 0.0.0.0:55010' message='YOU CAN USE THESE PORTS TO INTERACT WITH THE CONTAINER' name='slimk_25391_20240523054757' id='c19ea26452b2864f85c3876894c06ff7550dc78115dfea068433cbe679077a25' target.port.list='55010'
cmd=build info=continue.after mode='enter' message='provide the expected input to allow the container inspector to continue its execution'
cmd=build prompt='USER INPUT REQUIRED, PRESS <ENTER> WHEN YOU ARE DONE USING THE CONTAINER'
cmd=build state=container.inspection.finishing
cmd=build state=container.inspection.artifact.processing
cmd=build state=container.inspection.done
cmd=build state=building message="building optimized image" engine=internal
cmd=build state=completed
cmd=build info=results status='MINIFIED' by='19.46X' size.original='2.3 GB' size.optimized='118 MB'
cmd=build info=results has.data='true' image-build-engine='internal' image.name='blog-hugo-hugo.slim' image.size='118 MB' image.id='sha256:390353669295b8a8cb687adfa4c3e2bde0384157e6b8b4e762a0c42625d51c8a' image.digest='sha256:ec30d71099eca70b51264f6deb280cad53c155f2cd6f991b9454bce092a69bd5'
cmd=build info=results artifacts.location='/tmp/slim-state/.slim-state/images/03b7c5dd095ceb7ca748993e3a6ddb5b0c4849319195c0f08afae634a9a9b239/artifacts'
cmd=build info=results artifacts.report='creport.json'
cmd=build info=results artifacts.dockerfile.reversed='Dockerfile.reversed'
cmd=build info=results artifacts.seccomp='blog-hugo-hugo-seccomp.json'
cmd=build info=results artifacts.apparmor='blog-hugo-hugo-apparmor-profile'
cmd=build state=done
cmd=build info=commands message='use the xray command to learn more about the optimize image'
cmd=build info=report file='slim.report.json'
容量のチェック
2.29GB
→ 118MB
に削減されている・・・!
~/workspace/blog-hugo$docker images | grep slim [master|… ]
blog-hugo-hugo.slim latest 390353669295 43 seconds ago 118MB
このイメージは使えるのか?
一旦コンテナを全部削除して。
~/workspace/blog-hugo$docker rm -f $(docker ps -aq) [master|… ]
b4b98591d947
082d153dbbe8
イメージを指定してコンテナを起動する。
compose.yml
を書き換える。
# https://gohugo.io/installation/linux/#docker
services:
hugo:
+ image: blog-hugo-hugo.slim
- build:
- context: ./Docker/hugo
volumes:
- .:/src
ports:
- "1313:1313"
tcardgen:
build:
context: ./Docker/tcardgen
volumes:
- .:/blog
コンテナを立ち上げる。
make up
docker compose up -d
に相当するコマンド
http://localhost:1313にアクセスすると問題なくいける。
参考
slimtoolkit/slim https://github.com/slimtoolkit/slim
docker-slimを使ってDockerイメージのダイエット https://qiita.com/ryuichi1208/items/c96d39a57e11d54f02bf
おわりに
肥大化しているDocker
イメージが前々から気になっていたので、容量削減ができて良かった。
ただ、slim
だと 削減したイメージのDockerfile
の生成はしてくれないのだろうか。
そのあたりは今後確認していきたい。
あとは、Docker desktop
の拡張機能にある、slim.ai
というのもコンテナイメージの削減をしてくれる機能らしい。
これも調査をしてみて使ってみようと思う。