Go용 Dockerfile

4922 단어 linuxgodocker
새로운 Go 프로젝트를 시작할 때마다 여러 단계를 반복합니다.
설정.gitignore과 마찬가지로 CI 구성, Dockerfile, ...

그래서 다음과 같은 기본 Dockerfile을 사용하기로 결정했습니다.

FROM golang:1.18-bullseye as builder

RUN go install golang.org/dl/go1.18@latest \
    && go1.18 download

WORKDIR /build

COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app -tags timetzdata -trimpath .

FROM gcr.io/distroless/base-debian11

COPY --from=builder /build/app /app

ENTRYPOINT ["/app"]


이미지 크기를 작게 유지하기 위해 multi-stage build을 사용합니다.
첫 번째 단계는 Go official image ,
두 번째 단계는 Distroless입니다.

Distroless 전에는 Alpine official image을 사용합니다.
Go에 가장 적합한 기본 이미지를 선택하기 위해 인터넷에서 전체 토론이 있습니다.
일부 블로그를 읽은 후 Distroless가 작고 안전한 기본 이미지임을 발견했습니다.
그래서 나는 한동안 그것을 고수합니다.

또한 Distroless Debian 버전을 Go 공식 이미지 Debian 버전과 일치시키는 것을 잊지 마십시오.

FROM golang:1.18-bullseye as builder


빌드 단계로 사용하는 Go 이미지입니다.
공식 Go 이미지이거나 일부 회사에서는 사용자 지정 이미지가 필요할 수 있습니다.

RUN go install golang.org/dl/go1.18@latest \
    && go1.18 download


이것은 선택 사항입니다.
제 경우에는 회사에서 Go 이미지를 업데이트하는 속도가 느려서 이 트릭을 사용하여 최신 Go 버전을 설치합니다.

WORKDIR /build

COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .


나는 /build를 사용하여 해당 디렉토리에서 무언가를 만들고 있음을 강조합니다.

4COPY 라인은 Go를 충분히 사용한다면 익숙합니다.
첫 번째는 Go 모듈을 정의하기 때문에 go.modgo.sum입니다.
두 번째는 vendor 입니다. 이것은 선택 사항이지만 Dockerfile을 빌드할 때마다 Go 모듈을 다시 다운로드해야 하는 것을 원하지 않기 때문에 사용합니다.

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app -tags timetzdata -trimpath .


Go 프로그램을 빌드하는 곳입니다.
CGO_ENABLED=0 C 라이브러리를 엉망으로 만들고 싶지 않기 때문입니다.GOOS=linux GOARCH=amd64는 x86-64를 사용하는 Linux로 설명하기 쉽습니다.GOAMD64=v3Go 1.18 이후로 새로운 것입니다.
Arch Linux rfcs에서 AMD64 버전에 대해 읽었기 때문에 v3를 사용합니다. TLDR의 최신 컴퓨터는 이미 x86-64-v3입니다.
-tags timetzdata 기본 이미지에 시간대 데이터베이스가 없는 경우를 포함합니다.-trimpath 재현 빌드를 지원합니다.

FROM gcr.io/distroless/base-debian11

COPY --from=builder /build/app /app

ENTRYPOINT ["/app"]


마지막으로 app를 Distroless 기본 이미지에 복사합니다.

좋은 웹페이지 즐겨찾기