처음부터 100kB Docker 이미지 빌드
100mB 알파인 이미지가 작다고 생각할 수도 있지만 100kB는 어떻습니까? 이미지가 작을수록 더 빨리 배송되고 공격 벡터가 더 적습니다. 또한 이미지를 최적화하여 앱을 실행하는 데 필요한 것을 정확히 찾아 분리할 수 있습니다.
최적화하자.
스크래치 기반 도커 이미지에는 두 가지 주요 특징이 있습니다.
FROM scratch
-- 빈 도커 이미지 이 접근 방식을 사용하면 런타임 이미지에 앱을 실행하는 데 필요한 항목이 정확히 포함되며 잘못 구성되거나 악용될 수 있는 추가 구성 파일, 데몬 또는 라이브러리가 없습니다.
기본적인 정적 Hello World 스크래치 이미지를 살펴보겠습니다. 가장 적은 종속성을 필요로 하고 작은 ELF 객체 바이너리를 생성하기 때문에 C를 사용할 것입니다.
Hello World 만들기
hello.c
#include <stdio.h>
int main(void){
puts("Hello World\n");
}
Makefile
hello: hello.c
gcc -o $@ $< -static
도커파일
.dockerignore
# this prevents our host binary from sneaking into the build
hello
Dockerfile
FROM alpine:latest as builder
WORKDIR /build
RUN apk update && \
apk add gcc make libc-dev
COPY . ./
RUN make
FROM scratch
WORKDIR /
COPY --from=builder /build/hello .
CMD ["/hello"]
두 개의
FROM
가 있음을 주목하세요. 하나는 builder
입니다. 최종 이미지는 우리의 주자가 될 것입니다. COPY --from
를 사용하여 스크래치 이미지에 들어갈 파일을 선택할 수 있습니다. 정적 ELF 바이너리를 사용하면 /build/hello
만 필요합니다.빌드 및 실행
$ docker build . -t hello-scratch|tail -n 1
Successfully tagged hello-scratch:latest
$ docker run hello-scratch
Hello World
최종 이미지는 82.7kB입니다.
$ docker images |grep hello-scratch | egrep -o '[^ ]+$'
82.7kB
내부는 무엇입니까?
docker save
를 사용하여 이미지를 검사하고 layer.tar
에 단일 파일만 포함되어 있음을 확인할 수 있습니다. hello
$ mkdir hello-scratch && cd hello-scratch
$ docker save hello-scratch |tar -x
$ ls
3e69d91b5842be72dcd4175adcf218a03f78826504be6a46ed41c099e97520e8.json e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954 manifest.json repositories
$ ✗ tar -tf e599e214ce17b356493f9524fa57f7ef816d21dd78020019196020c770a39954/layer.tar
hello
다음 단계
다음 포스트에서는 좀 더 정교한 예를 보여드리겠습니다. 이 프로세스는 C, C++, golang & rust와 같은 정적으로 컴파일된 앱에서 가장 쉽습니다. 그러나 적절한 도구를 사용하면 모든 런타임 종속성을 최종
scratch
이미지로 수집한다고 가정하면 모든 이미지를 빌드할 수 있습니다.
Reference
이 문제에 관하여(처음부터 100kB Docker 이미지 빌드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tonymet/build-100kb-docker-images-from-scratch-4ll5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)