"Distroless"이미지에는 응용 프로그램과 런타임 종속성 만 포함됩니다. 여기에는 패키지 관리자, 쉘 또는 표준 Linux 배포에서 찾을 것으로 예상되는 다른 프로그램이 포함되어 있지 않습니다.
자세한 내용은이 토크 (비디오)를 참조하십시오.
2023 년 3 월 이후 Alistroless 이미지를 사용하여 OCI 매니페스트를 사용합니다. application/vnd.oci.image.manifest.v1+json
또는 application/vnd.oci.image.index.v1+json
참조하는 오류가 표시되면 컨테이너 툴링 업데이트 (Docker, Docker, 지브 등) 최신.
런타임 컨테이너의 내용을 정확하게 앱에 필요한 것으로 제한하는 것은 Google과 수년 동안 생산에 컨테이너를 사용한 기타 기술 거인이 사용하는 모범 사례입니다. 스캐너의 신호로의 소음 (예 : CVE)을 향상시키고 필요한 것에 대한 출처를 확립하는 부담을 줄입니다.
방해물 이미지는 매우 작습니다 . 가장 작은 혼란스러운 이미지 인 gcr.io/distroless/static-debian12
는 약 2 MIB입니다. 이는 alpine
크기의 약 50% (~ 5 MIB)이며 debian
크기의 2% 미만 (124 MIB)입니다.
이 이미지는 Bazel을 사용하여 제작되었지만 다른 Docker 이미지 빌드 툴링을 통해 사용할 수도 있습니다.
다음 이미지는 현재 Distroless Project에서 게시 및 업데이트됩니다 (지원 타임 라인은 Support_Policy 참조)
영상 | 태그 | 아키텍처 접미사 |
---|---|---|
gcr.io/distroless/static-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-nossl-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/cc-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/python3-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64 |
gcr.io/distroless/java-base-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java17-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java21-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, PPC64LE |
gcr.io/distroless/nodejs18-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs20-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs22-debian12 | 최신, 비 루트, 디버그, 디버그-비 루트 | AMD64, ARM64, ARM, S390X, PPC64LE |
이 이미지는 지원되는 모든 아키텍처에 대한 참조와 함께 이미지 인덱스를 나타냅니다. 아키텍처 특정 이미지는 gcr.io/distroless/static-debian12:latest-amd64
와 같은 태그의 추가 아키텍처 접미사를 사용하여 직접 참조 할 수 있습니다.
다른 태그는 더 이상 사용되지 않는 것으로 간주되며 더 이상 업데이트되지 않습니다.
모든 Distroless 이미지는 Cosign이 Withermal Keys (Keyless)로 서명합니다. 이는 2023 년 11 월부터 유일하게 지원되는 메커니즘입니다. 이미지를 만들기 전에 사용하는 방해물을 확인하는 것이 좋습니다. Alisholess Image의 키없는 서명을 다음과 같이 확인할 수 있습니다.
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
Distroless 이미지에는 기본적으로 쉘이 포함되어 있지 않습니다. 즉, DockerFile ENTRYPOINT
명령은 정의 된 경우 컨테이너 런타임을 쉘로 접두사하지 않도록 vector
형태로 지정해야합니다.
이것은 작동합니다 :
ENTRYPOINT ["myapp"]
그러나 이것은 작동하지 않습니다.
ENTRYPOINT "myapp"
같은 이유로, EntryPoint가 빈 벡터로 설정된 경우 CMD 명령은 vector
형태로 지정되어야합니다 (아래 예제 참조). 기본적으로 정적으로,베이스 및 CC 이미지에는 빈 벡터 엔트리 포인트가 있습니다. 언어 런타임이 포함 된 이미지에는 언어 별 기본값이 있습니다 (Java, Nodejs, Python3 참조).
Docker Multi-Stage 빌드는 Distroless 이미지를 쉽게 사용합니다. 다음 단계에 따라 시작하십시오.
애플리케이션 스택에 오른쪽 기본 이미지를 선택하십시오.
다단계 Docker 파일을 작성하십시오. 참고 : Docker 17.05 이상이 필요합니다.
기본 아이디어는 애플리케이션 아티팩트를 구축하고 런타임 방해 이미지에 삽입 할 수있는 한 단계가 있다는 것입니다. 자세한 내용은 다단계 빌드에 대한 설명서를 참조하십시오.
다음은 GO의 빠른 예입니다.
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
여기에서 다른 예제를 찾을 수 있습니다.
예제를 실행하려면 언어 디렉토리로 이동하여 실행하십시오.
docker build -t myapp .
docker run -t myapp
Node.js Express 앱 노드-발현을 실행하고 컨테이너 포트를 노출하려면 :
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
이것은 Express 응용 프로그램을 LocalHost : 3000에 노출시켜야합니다
바젤을 사용하여 컨테이너 이미지를 생성하는 방법에 대한 전체 설명서는 Bazel-Contrib/Rules_oci 저장소를 참조하십시오.
GO 기반 Debian 패키지 관리자 (현재)를 사용하여 Bazel Config를 생성하는 방법에 대한 설명서 및 예에 대해서는 Bazel Package Manager 규칙을 사용하는 방법에 대한 설명 및 예제를 참조하십시오 (이 repo에는 사용되지 않음). /package_manager
예제는 예제 디렉토리 의이 저장소에서 찾을 수 있습니다.
/예제 디렉토리에서 일반적인 응용 프로그램 스택을 실행하는 방법에 대한 몇 가지 예가 있습니다. 여기를 참조하십시오 :
이미지에서 몇 가지 일반적인 작업을 완료하는 방법에 대한 예는 여기를 참조하십시오.
이 이미지가 어떻게 제작되고 출시되는지에 대한 자세한 내용은 여기를 참조하십시오.
Distroless Images는 Debian 12 (Bookworm)를 기반으로합니다. 이미지에는 데비안 버전 접미사 (예 : -debian12
)가 명시 적으로 태그됩니다. 배포없이 이미지를 지정하면 현재 -debian12
이미지를 선택하지만 미래에는 새로운 버전의 데비안으로 변경됩니다. 다음 데비안 버전이 해제 될 때 빌드가 깨지지 않도록 분배를 명시 적으로 참조하는 것이 유용 할 수 있습니다.
Distroless는 GitHub 조치를 사용하여 업데이트가있을 때 풀 요청을 자동으로 생성하여 업스트림 데비안 릴리스를 추적합니다.
방해물 이미지는 최소화되어 있으며 쉘 액세스가 부족합니다. :debug
이미지 세트는 입력 할 바쁜 상자 쉘을 제공합니다.
예를 들어:
cd examples/python3/
Dockerfile
편집하여 최종 이미지를 다음과 같이 변경하십시오 :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
그런 다음 쉘 엔트리 포인트로 빌드하고 시작합니다.
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
참고 : 사용중인 이미지에 이미
gcr.io/distroless/java17-debian12:nonroot
와 같은 태그가있는 경우, 대신 태그debug-<existing tag>
사용하십시오gcr.io/distroless/java17-debian12:debug-nonroot
.
참고 : LDD는 쉘 스크립트이므로 기본 이미지에 설치되어 있지 않으므로 복사하거나 다운로드 할 수 있습니다.
프로젝트가 혼란스러워하는 경우 PR을 보내서 여기에 프로젝트를 추가하십시오!