Notice
Recent Posts
Recent Comments
Link
devops
Docker 도커의 Multi-stage build로 이미지 경량화하기 본문
반응형
Dockerfile을 이용해서 이미지를 빌드하다 보면 최종 컨테이너 이미지에 필요 없는 환경과 파일이 포함될 수 있다. 이를 해결하기 위해서 빌드와 실행을 구분해 이미지를 빌드할 수 있는 'Multi-stage build' 기능을 이용하면 된다.
위처럼 빌드를 통해서 text 파일이 생성되면, 이 파일만 이용해서 내용을 추가하고 최종 스테이지에선 필요한 파일만 사용할 수 있게 된다.
# syntax=docker/dockerfile:1
FROM golang:1.16 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go ./
RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app ./
CMD ["./app"]
간단히 코드를 통해서 살펴보자.
위 코드를 보면 golang:1.16 이미지를 이용해서 빌드를 진행한다. (AS builder를 추가하여 빌드 스테이지 임을 명시)
그리고 다시 alpine:latest 이미지를 실행하는 코드에서 새로운 스테이지가 시작된다.
COPY --from=builder /go/src/github.com/alexellis/href-counter/app ./
위 명령을 보면 --from=builder 선언을 통해서 해당 빌드 스테이지에 존재하는 경로의 파일을 새 스테이지로 복사한다. 대체로 빌드된 아티팩트(app)를 불러오고 마지막 CMD ["./app"] 코드를 통해서 컨테이너 생성과 함께 해당 app 파일이 실행된다.
스테이지는 여러 번 선언이 가능하다.
# syntax=docker/dockerfile:1
FROM alpine:latest AS builder
RUN apk --no-cache add build-base
FROM builder AS build1
COPY source1.cpp source.cpp
RUN g++ -o /binary source.cpp
FROM builder AS build2
COPY source2.cpp source.cpp
RUN g++ -o /binary source.cpp
위 코드를 보면 FROM으로 이미지 실행과 동시에 AS '이름'을 선언해서 스테이지를 구분 지을 수 있다. CI/CD 파이프라인 구성에 있어서 이미지 경량화는 중요한 작업이기 때문에 multi-stage build는 아주 유용하다.
https://docs.docker.com/build/building/multi-stage/
반응형
'DevOps > Docker' 카테고리의 다른 글
도커 로그인 오류 Error saving credentials: error storing credentials - err: exit status 1, out: `` (0) | 2022.06.30 |
---|---|
도커(Docker) - Dockerfile 작성과 팁 (0) | 2022.05.30 |
context requires credentials to be passed as environment variables 오류 해결 (0) | 2022.05.27 |
Docker 명령어 정리 (1) | 2022.05.25 |
Docker Registry, Repository, Tag 그리고 Copy, Dockerfile (0) | 2022.05.25 |
Comments