自分自身のビルドステージを参照する COPY --from

COPY --from が現在のステージ自身を参照しないように依存関係を修正してください。

説明

マルチステージ 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 ステージにコピーします。ソースと実行環境の互換性は別途確認が必要です。

参考資料