Dockerのbuildを少しだけ早くした
概要
あまり詳しく書いていなかったが、このサイトはこんな技術スタックで構成している。
- SSGフレームワーク: Astro
- Astro Theme: larry-xue/astro-zen-blog
- JSパッケージマネージャー: Bun
- ホスティング: Nginx on Docker(WSL)
ミニPCをサーバー運用している都合K8sを動かすリソースはないため、composeで動かしている。
そんなわけで、新しい記事を書いたら、その都度docker compose up -d --buildしているわけだが、2点問題があった。
- 毎回
bun run iが内部で走っている COPY . /appが重い
備忘の為に、メモとして残しておく。
対応
bun run iのcache
依存を記録したファイルとlockファイルだけ先にCOPYして、installしてから本体をCOPYするようにする。
before:
Dockerfile.before
### builder
FROM oven/bun:latest AS builder
WORKDIR /app
COPY . /app
RUN bun i
RUN bun run build
after:
Dockerfile.after
### builder
FROM oven/bun:latest AS builder
WORKDIR /app
COPY package.json bun.lock package-lock.json /app
RUN bun i
COPY . /app
RUN bun run build
...
=> CACHED [builder 2/6] WORKDIR /app 0.0s
=> CACHED [builder 3/6] COPY package.json bun.lock package-lock.json /app 0.0s
=> CACHED [builder 4/6] RUN bun i 0.0s
=> [builder 5/6] COPY . /app 0.1s
=> [builder 6/6] RUN bun run build 6.1s
...
ファイルのsumからCacheを引き当てる都合、JSの依存を更新しない限り、RUN bun iまでがキャッシュされる。
ということで、記事を追加したくらいのユースケースで毎回RUN bun iが走るのをこれで抑制できる。
COPYの削減
.dockerignoreを追加してCOPYの対象を減らすことでCOPYが劇的に速くなった。
.dockerignore
node_modules/
これだけ。
COPYの対象から要らないファイルを削るだけなのだが、今回はnode_modulesの容量がソースコードに対してデカかったので、これでかなり速くなった。
.gitとか、他にもいくつか外していいものもあるかもしれない。