Go용 Dockerfile

3927 단어 godockerlinux
나는 새로운 바둑 프로젝트를 시작할 때마다 많은 단계를 반복합니다.
설정.gitignore , CI 구성, Dockerfile 등과 같이 ...

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

FROM golang:1.18beta1-bullseye as builder

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 main.go

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.18beta1-bullseye as builder


빌드 단계로 사용하는 Go 이미지입니다.

WORKDIR /build

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


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

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

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


여기에서 Go 프로그램을 빌드합니다.CGO_ENABLED=0 C 라이브러리를 엉망으로 만들고 싶지 않기 때문입니다.GOOS=linux GOARCH=amd64 설명하기 쉬운 Linux x86-64입니다.GOAMD64=v3Go 1.18 이후 새로운 것입니다.
Arch Linux rfcs 에서 AMD64 버전에 대해 읽었기 때문에 v3를 사용합니다. TLDR의 최신 컴퓨터는 이미 x86-64-v3입니다.

FROM gcr.io/distroless/base-debian11

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

ENTRYPOINT ["/app"]


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

좋은 웹페이지 즐겨찾기