Go — 단 3단계로 최소 도커 이미지 구축

Go — 단 3단계로 최소 도커 이미지 구축

2022-10-13 last update

5 minutes reading optimization go docker containers
Docker & Go 이미지 작성자 github.com/ashleymcnamara/gophers

Go — 단 3단계로 최소 도커 이미지 구축



docker용 Go 애플리케이션을 빌드할 때 일반적으로 golang:1.13과 같은 일부 이미지에서 시작합니다. 그러나 런타임에 해당 이미지를 실제로 사용하는 것은 리소스 낭비입니다. 절대 최소 도커 이미지로 Go 애플리케이션을 구축하는 방법을 살펴보겠습니다.


1. Go 버전 선택



golang:latest 또는 golang을 사용하고 싶을 수도 있지만 이것이 좋은 생각이 아닌 데는 여러 가지 이유가 있지만 그 중 가장 중요한 이유는 빌드 반복 가능성입니다. 개발 및 테스트한 프로덕션 배포에 동일한 버전을 사용하려는 경우 또는 애플리케이션의 이전 버전을 패치해야 하는 경우 특정 릴리스에 고정된 Go 버전을 유지하는 것이 좋습니다. 그리고 새로운 것과 작동할 것이라는 것을 알고 있을 때만 업데이트하십시오.

따라서 항상 패치 버전 번호를 포함한 전체 사양을 사용하고 이미지가 제공되는 기본 OS도 이상적으로 사용하십시오. 1.13.0-alpine3.10

2. 최소한으로 유지



여기에는 두 가지 측면이 있습니다. 즉, 빌드 시간을 짧게 유지하고 결과 이미지를 작게 유지하는 것입니다.

빠른 빌드



Docker는 중간 계층을 캐시하므로 Dockerfile을 올바르게 구성하면 각 후속 재구축(변경 후)에 걸리는 시간을 줄일 수 있습니다. 경험상의 규칙은 소스(예: COPY 소스)가 얼마나 자주 변경되는지에 따라 명령을 정렬하는 것입니다.

또한 빌드 컨텍스트를 작게 유지하는 데 도움이 되는 .dockerignore 파일을 사용하는 것을 고려하십시오. 기본적으로 docker build를 실행할 때 docker는 현재 디렉토리의 모든 것을 빌드 데몬에 제공해야 합니다(Docker 데몬 메시지에 빌드 컨텍스트 보내기 도커 빌드의 시작). 간단히 말해서, 리포지토리에 앱을 빌드하는 데 필요하지 않은 많은 데이터(예: 테스트, 문서 생성기의 마크다운 등)가 포함된 경우 .dockerignore가 빌드 속도를 높이는 데 도움이 됩니다. 최소한 다음 내용으로 시작할 수 있습니다. COPY 하면 Dockerfile이 있습니다. . (그렇지 않아야 함, BTW) 해당 Dockerfile만 변경할 때 아래의 모든 항목을 실행하고 무효화할 필요가 없습니다.

.git
Dockerfile
testdata

작은 이미지



매우 간단합니다 — 긁힘을 사용합니다. 다른 어떤 것도 가까이 오지 않습니다(그럴 수 없기 때문에). 스크래치는 실제 이미지가 아니라 완전히 비어 있는 시스템이라는 점에서 특별한 "기본"이미지입니다. 참고: 이전 버전의 docker에서는 명시적 스크래치 이미지가 실제로 레이어로 사용되었지만 docker 1.5에서는 더 이상 그렇지 않습니다.

이것이 작동하는 방식은 단일 Dockerfile 내에서 2단계 빌드를 사용하는 것입니다. 여기서 builder라는 하나의 이미지에서 실제로 앱을 빌드한 다음(예를 들어 실제로 원하는 이름이 될 수 있음) 결과 바이너리( 및 기타 모든 필수 파일)를 스크래치 기반의 최종 이미지로 만듭니다.

3. 모두 합치기



완전한 Dockerfile이 어떻게 생겼는지 볼까요?




이 정보가 유용하거나 자신만의 몇 가지 팁이나 트릭을 공유하고 싶다면 댓글을 남겨주세요.