이를 위해 스크래치 도커 이미지를 사용할 것입니다. 이렇게 하면 최종 이미지의 크기가 95% 이상 줄어듭니다.
왜요? 최종 도커 이미지의 크기를 줄임으로써 공격 표면적을 줄입니다. 이는 공격자가 도커 이미지에서 악용할 수 있는 라이브러리와 도구가 적다는 것을 의미합니다. 이것이 가능하려면 외부 라이브러리가 필요하지 않도록 go 애플리케이션을 정적으로 컴파일해야 합니다.
이를 달성하기 위해 두 단계를 사용하여 최종 도커 이미지를 빌드합니다. 첫 번째 단계에서는 Golang의 공식 이미지를 사용하여 go 애플리케이션을 정적으로 컴파일합니다. 그런 다음 두 번째 단계에서는 첫 번째 단계에서 정적으로 컴파일된 바이너리를 복사합니다. 시작하려면 도커파일 우리 프로젝트의 뿌리에서. 이름을 scratch.dockerfile로 지정하겠습니다. 원하는 경우 파일 이름을 자유롭게 변경하십시오.
주의: 일반적으로 도커 및 컨테이너를 처음 사용하는 경우 다음 게시물을 읽고 시작하는 것이 좋습니다. 여기 기본을 위해. 도커를 시작하는 방법도 배울 수 있습니다. 여기 .
데모 애플리케이션
의미 있는 데모를 만들기 위해서는 베어본 Golang 애플리케이션이 필요했습니다. 따라서 다음의 기본 예제를 사용했습니다. 진 웹 프레임워크 찾을 수 있는 여기 . 위의 코드를 수정하지 않았습니다. 수정 없이 자신의 사용자 정의 코드로 대체할 수 있다고 확신합니다.
1단계 - Golang 애플리케이션 빌드
이 단계에서는 go 애플리케이션을 정적으로 컴파일할 것입니다. 하지만 먼저 dockerfile 내부에서 docker의 기본 이미지를 설정하는 것으로 시작합니다. Golang에 사용 가능한 최신 이미지를 사용할 것입니다. 따라서 태그가 없습니다. 또한 단계 이름을 |_+_|로 지정하여 다음 단계에서 더 쉽게 참조할 수 있습니다.
Google 문서 대 페이지
builder
다음으로 작업 디렉토리를 애플리케이션을 빌드할 디렉토리로 변경할 것입니다. GOPATH에서 개발 환경과 동일한 구조를 사용하는 것이 좋습니다. Golang 이미지의 경우 GOPATH는 |_+_|입니다. 이렇게 하면 go 애플리케이션이 개발 환경에서와 동일하게 작동합니다.
FROM golang as builder
다음으로 프로젝트 파일을 복사하고 프로젝트 종속성을 설치하고 go 애플리케이션을 빌드해 보겠습니다.
/go
팁: 사용하는 경우 모듈 이동 , GOPATH(|_+_|) 외부의 디렉터리에 프로젝트 코드를 복사하는 것이 좋습니다. |_+_| 안에 넣으면 go 모듈이 비활성화되기 때문입니다. 이로 인해 응용 프로그램이 중단될 수 있습니다.
WORKDIR /go/src/github.com/coding-latte/golang-docker-multistage-build-demo
2단계 – 배포 이미지
이 단계에서는 배포할 이미지를 빌드합니다. 따라서 기본 이미지를 스크래치로 설정하겠습니다 – |_+_|. 단계 이름은 다단계 빌드의 마지막 단계이므로 필요하지 않습니다.
... COPY . . RUN go get . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . ...
다음으로 |_+_| 1단계 – 빌더에서 Golang 정적 바이너리를 컴파일했습니다. 먼저 |_+_|를 복사해 보겠습니다. SSL/TLS를 사용하여 애플리케이션에 액세스하려는 경우 중요합니다. 그렇지 않으면 앱이 SSL/TLS를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.
/go/src
그런 다음 작업 디렉토리를 bin(또는 원하는 다른 이름)으로 변경하고 컴파일된 바이너리를 해당 디렉토리에 복사합니다.
GOPATH
마지막으로 컨테이너가 시작될 때 실행되도록 go 앱을 설정하고 포트 8080을 노출합니다.
... WORKDIR /app/project-name COPY . . ...
앱이 다른 포트를 사용하는 경우 포트 8080을 해당 포트로 바꾸십시오. 여러 포트를 사용하는 경우 단일 공백으로 구분합니다.
주의: 완전한 dockerfile을 찾을 수 있습니다 여기 . 그리고 당신이 오히려 사용하려는 경우 알파인 리눅스 스크래치 대신 docker 이미지를 사용하면 해당 dockerfile을 찾을 수 있습니다. 여기 .
도커 이미지 빌드
이제 도커 이미지를 빌드할 수 있습니다.
FROM scratch
주의: 스크래치.dockerfile을 dockerfile의 이름으로 사용하지 않는 경우 위 명령에서 올바른 이름과 경로로 바꾸십시오. 도커 이미지 빌드에 대해 자세히 알아볼 수 있습니다. 여기 .
따라서 스크래치 도커 이미지를 사용할 때의 최종 도커 이미지 크기는 공식 Golang 도커 이미지를 사용할 때 844MB에 비해 15.5MB입니다. 스크래치 대신 알파인 이미지를 사용한 경우 스크래치 최종 크기 위에 5MB를 추가하면 약 20MB가 됩니다. 이것은 golang의 공식 도커 이미지에서 여전히 큰 크기 축소입니다.
소스 코드
이 게시물의 소스 코드를 찾을 수 있습니다 여기 .
원래 발행인 메인나 위클리프 ~에 코딩라떼닷컴
#도커 #고
코딩라떼닷컴
Golang으로 작은 Docker 이미지 빌드
Golang으로 작은 도커 이미지 만들기 - 이 게시물에서는 golang 앱의 최종 도커 이미지 크기를 줄이는 방법을 살펴보겠습니다.
무소속 논문 출판