Go용 Dockerfile
설정
.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
를 사용하여 해당 디렉토리에서 무언가를 만들고 있음을 강조합니다.4
COPY
라인은 Go를 충분히 사용한다면 익숙합니다.첫 번째는 Go 모듈을 정의하기 때문에
go.mod
및 go.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=v3
는 Go 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 기본 이미지에 복사합니다.
Reference
이 문제에 관하여(Go용 Dockerfile), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/haunt/dockerfile-for-go-4jjp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)