설명
멀티스테이지 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 단계로 복사합니다. 소스와 런타임 호환성은 별도 확인 대상입니다.