説明
マルチステージ Dockerfile で COPY --from が現在のステージ名を参照すると、そのステージが自分自身の出力に依存します。この循環依存によりイメージのビルドが失敗します。
想定される影響
- イメージをビルドできず、デプロイや復旧が遅れる場合があります。
- 各ステージの役割と成果物の流れが不明確になり、保守しにくくなる場合があります。
対処方法
- ビルドコンテキストのファイルには通常の COPY を使い、別ステージの成果物にはそのステージ名を COPY --from に指定してください。
- ステージ間に循環依存がないことと、最終イメージ内の成果物のパス・実行互換性を確認してください。外部イメージや名前付きコンテキストも意図した参照か確認してください。
例
既存の Go ビルド例を比較します。実際のソースとモジュールファイルが必要です。最終バイナリは Alpine のライブラリと対象アーキテクチャに対応している必要があります。
変更前
dockerfile
FROM golang:1.22 AS builder
WORKDIR /src
COPY --from=builder /src/app /app
RUN go build -o /src/app .
変更後
dockerfile
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o /src/app .
FROM alpine:3.20
WORKDIR /app
COPY --from=builder /src/app /app/app
CMD ["/app/app"]
補足:
- 変更前: builder が COPY --from=builder で自分自身を参照するため、ビルドできません。
- 変更後: builder の成果物を別の runtime ステージにコピーします。ソースと実行環境の互換性は別途確認が必要です。