>백엔드 개발 >Golang >Go에서 Docker 이미지용 정적 바이너리를 처음부터 어떻게 빌드하나요?

Go에서 Docker 이미지용 정적 바이너리를 처음부터 어떻게 빌드하나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-31 17:17:30846검색

How to Build Static Binaries in Go for Docker Images from Scratch?

Go에서 정적 바이너리 생성을 위한 플래그

Docker 이미지를 처음부터 빌드할 때 실행 중 오류를 방지하기 위해 정적 바이너리가 필요합니다. 그러나 RUN go build -o /go/bin/myapp 명령은 "해당 파일 또는 디렉터리 없음" 오류와 함께 실패하는 바이너리를 생성할 수 있습니다.

이를 극복하려면 다음 플래그가 필요합니다.

RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' .

설명:

  • CGO_ENABLED=0: Go 프로그램이 다음을 수행할 수 있도록 하는 기능인 CGO(C에서 Go 호출)를 비활성화합니다. C 코드를 호출하세요. 이는 Linux가 정적 바이너리를 빌드할 때 문제를 일으킬 수 있는 C 라이브러리를 동적으로 연결하기 때문에 필요합니다.
  • -a: 최신 상태인지 여부에 관계없이 모든 패키지와 종속성을 강제로 다시 빌드합니다. -date.
  • -ldflags '-extldflags "-static"': 외부 링커에 전달할 플래그를 지정합니다. 이 경우 -static은 정적 링크를 사용하여 필요한 모든 라이브러리가 바이너리에 포함되도록 해야 함을 나타냅니다.

CGO_ENABLED=0 및 -ldflags '-extldflags "를 모두 사용하는 것이 중요합니다. -static"' 이유:

  • CGO_ENABLED=0은 CGO를 비활성화하지만 정적 링크를 보장하지는 않습니다.
  • -ldflags '-extldflags "-static"'은 정적 링크를 강제하지만 비활성화하지는 않습니다. CGO.

두 플래그를 모두 사용하면 결과 바이너리가 정적이며 외부 라이브러리에 의존하지 않는지 확인할 수 있습니다.

위 내용은 Go에서 Docker 이미지용 정적 바이너리를 처음부터 어떻게 빌드하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.