Dockerfile で COPY . . を先に書くと、ソースを1行直しただけで依存のインストールまで毎回やり直しになる。原因はレイヤーキャッシュが上から順に無効化されるためだった。
依存定義ファイルだけを先にコピーして、インストールを済ませてからソース全体をコピーすると、キャッシュがよく効く。
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
Astro のビルド専用イメージでも同じ順序にしておくと、記事を1本足しただけの再ビルドが速くなる。変わりにくいものを上に、変わりやすいものを下に置くのが基本だと腹落ちした。