
최소 CVE 강화 컨테이너 이미지 컬렉션
작고 강화된 컨테이너 이미지, 무료이며 MIT 라이선스.
소스에서 Chainguard의 apko와 Wolfi 패키지로 빌드, 6시간마다 재빌드.
모든 이미지는 cosign 서명, SPDX SBOM 증명을 제공하며, SLSA 레벨 3 빌드 출처를 포함합니다. 계정 없이 모두 확인할 수 있습니다.
🌐 minimalcontainers.com에서 전체 카탈로그 둘러보기 →
이미지 카탈로그 · 이미지 확인 · 전체 57개 이미지 · HN 토론
이 이미지들의 핵심은 저를 신뢰할 필요가 없다는 것입니다. 하나를 가져와서 출처를 직접 확인하세요:```bash
docker pull ghcr.io/rtvkiz/minimal-python:latest
gh attestation verify oci://ghcr.io/rtvkiz/minimal-python:latest --owner rtvkiz
cosign verify-attestation --type spdxjson
--certificate-identity-regexp='https://github.com/rtvkiz/minimal/'
--certificate-oidc-issuer='https://token.actions.githubusercontent.com'
ghcr.io/rtvkiz/minimal-python:latest
| jq -r '.payload | @base64d | fromjson | .predicate' > python-sbom.spdx.json
더 많은 검증 방법(cosign 서명, SBOM, SLSA 입증)은 [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/HEAD/.github/SECURITY.md)에 있습니다.
## `minimal`의 차이점
| | minimal | Chainguard | Docker Hardened | Minimus / RapidFort |
|---|:---:|:---:|:---:|:---:|
| **라이선스** | MIT | 독점 | Apache-2.0 | 독점 |
| **비용** | $0 | ~$30k/이미지/년 | 무료 + 유료 지원 | 영업 상담 |
| **풀 인증** | 아니요 | 예 | 예 | 예 |
| **속도 제한** | 없음 | 예 | 예 | 예 |
| **빌드 레시피 공개** | 예, 모든 `melange.yaml` | 아니요 | 예, Dockerfiles | 아니요 |
| **Cosign 서명 + SBOM + SLSA L3** | 예 | 예 | 예 | 예 |
| **공급업체 SLA, FedRAMP/STIG** | 아니요 | 예 (유료) | 예 (유료) | 예 (유료) |
강화된 이미지를 비용 없이 혹은 가입 없이 사용하고 싶거나, 모든 빌드 레시피를 처음부터 끝까지 읽고 싶거나, 자신의 내부 카탈로그에 포크할 수 있는 작동하는 템플릿을 원한다면 `minimal`을 선택하세요.
공급업체 계약, FedRAMP 또는 STIG 인증 서류, 또는 첫날부터 수천 개 이상의 이미지가 필요하다면 이 프로젝트는 적합하지 않을 수 있습니다. 이것들은 이 프로젝트가 해결하려고 하지 않는 실제 요구사항입니다.
## 모든 이미지가 제공하는 것
- cosign 키리스 서명, 공개 Rekor 투명성 로그에서 검증 가능.
- in-toto 증명으로 첨부된 SPDX SBOM — 모든 패키지, 버전 및 라이선스.
- SLSA v1.0 빌드 출처 — 어떤 워크플로, 어떤 커밋, 어떤 러너가 이미지를 생성했는지에 대한 암호학적 증명.
- 매일 Grype 스캔 결과는 [공개 카탈로그](https://minimalcontainers.com)와 GitHub 보안 탭에서 확인 가능.
- 기본 `linux/amd64` 및 `linux/arm64` 빌드.
- 기본적으로 루트가 아닌 사용자(UID 65532)이며, 업스트림에서 달리 요구하지 않는 한 적용.
- 가능한 경우 셸 없음 — 대부분의 이미지는 `/bin/sh`를 포함하지 않습니다.
- 6시간 재구축 주기로 Wolfi CVE 패치가 며칠이 아닌 몇 시간 안에 적용됩니다.
## 사용 가능한 이미지 — 총 57개
| 카테고리 | 개수 | 하이라이트 |
|---|---|---|
| **언어 및 런타임** | 9 | python, node-slim, bun, go, java, ruby, php, dotnet, deno |
| **데이터베이스** | 5 | mysql, mariadb, postgres-slim, sqlite, opensearch |
| **캐시, 큐, 메시징** | 7 | redis-slim, valkey, memcached, kafka, rabbitmq, nats, mosquitto |
| **웹 서버 및 프록시** | 6 | nginx, httpd, caddy, haproxy, traefik, envoy |
| **관측성** | 14 | prometheus, alertmanager, victoria-metrics, thanos, mimir, jaeger, loki, tempo, otelcol, fluent-bit, telegraf, node-exporter, blackbox-exporter, pushgateway |
| **인프라** | 7 | coredns, etcd, openbao, keycloak, qdrant, registry, consul |
| **쿠버네티스, CI 및 IaC** | 4 | helm, kubectl, opentofu, trivy |
| **애플리케이션** | 5 | jenkins, gitea, minio, rails, mailpit |
모든 이미지 — 실시간 CVE 스캔, 모든 태그, SBOM 및 빌드 출처와 함께 — **[minimalcontainers.com](https://minimalcontainers.com)**에서 확인하거나 아래 전체 풀 명령 목록을 펼쳐보세요.
<details>
<summary><strong>전체 이미지 카탈로그 및 풀 명령</strong></summary>
<br>
| 이미지 | 풀 명령 | 셸 | 사용 사례 |
|-------|--------------|-------|----------|
| | | **언어** | |
| Python | `docker pull ghcr.io/rtvkiz/minimal-python:latest` | 아니요 | Python 애플리케이션, 마이크로서비스 |
| Node.js-slim | `docker pull ghcr.io/rtvkiz/minimal-node-slim:latest` | 아니요 | Node.js 애플리케이션, JavaScript |
| Bun | `docker pull ghcr.io/rtvkiz/minimal-bun:latest` | 아니요 | 빠른 JavaScript/TypeScript 런타임 |
| Go | `docker pull ghcr.io/rtvkiz/minimal-go:latest` | 아니요 | Go 개발, CGO 빌드 |
| .NET Runtime | `docker pull ghcr.io/rtvkiz/minimal-dotnet:latest` | 아니요 | 애플리케이션용 .NET 10 런타임 |
| Java | `docker pull ghcr.io/rtvkiz/minimal-java:latest` | 아니요 | Java 애플리케이션용 OpenJDK 26 JRE |
| Ruby | `docker pull ghcr.io/rtvkiz/minimal-ruby:latest` | 아니요 | Ruby 4.0 런타임 (소스에서 빌드) |
| PHP | `docker pull ghcr.io/rtvkiz/minimal-php:latest` | 아니요 | PHP 8.5 CLI (소스에서 빌드) |
| Rails | `docker pull ghcr.io/rtvkiz/minimal-rails:latest` | 아니요 | Ruby 4.0 + Rails 8.1 (소스에서 빌드) |
| Deno | `docker pull ghcr.io/rtvkiz/minimal-deno:latest` | 아니요 | 안전한 TypeScript/JavaScript 런타임 |
| | | **데이터베이스** | |
| MySQL | `docker pull ghcr.io/rtvkiz/minimal-mysql:latest` | 예 | MySQL LTS 8.4.x, 소스에서 빌드 |
| MariaDB | `docker pull ghcr.io/rtvkiz/minimal-mariadb:latest` | 예 | MariaDB LTS 11.4.x, 소스에서 빌드 |
| PostgreSQL-slim | `docker pull ghcr.io/rtvkiz/minimal-postgres-slim:latest` | 아니요 | 관계형 데이터베이스 |
| SQLite | `docker pull ghcr.io/rtvkiz/minimal-sqlite:latest` | 아니요 | 임베디드 SQL 데이터베이스 CLI |
| OpenSearch | `docker pull ghcr.io/rtvkiz/minimal-opensearch:latest` | 아니요* | OpenSearch 3.x — 검색 및 분석 |
| | | **캐시, 큐, 메시징** | |
| Redis-slim | `docker pull ghcr.io/rtvkiz/minimal-redis-slim:latest` | 아니요 | 인메모리 데이터 저장소 |
| Memcached | `docker pull ghcr.io/rtvkiz/minimal-memcached:latest` | 아니요 | 인메모리 캐싱 (소스에서 빌드) |
| Valkey | `docker pull ghcr.io/rtvkiz/minimal-valkey:latest` | 아니요 | BSD 라이선스 Redis 포크 (LF) |
| Kafka | `docker pull ghcr.io/rtvkiz/minimal-kafka:latest` | 예 | Apache Kafka 4.x, KRaft 모드 |
| RabbitMQ | `docker pull ghcr.io/rtvkiz/minimal-rabbitmq:latest` | 예 | RabbitMQ 4.x AMQP 브로커 |
| NATS | `docker pull ghcr.io/rtvkiz/minimal-nats:latest` | 아니요 | JetStream이 포함된 NATS 서버 |
| Mosquitto | `docker pull ghcr.io/rtvkiz/minimal-mosquitto:latest` | 아니요 | Eclipse Mosquitto MQTT 브로커 (EPL-2.0/EDL-1.0) |
| | | **웹 서버 및 프록시** | |
| Nginx | `docker pull ghcr.io/rtvkiz/minimal-nginx:latest` | 아니요 | 리버스 프록시, 정적 파일 |
| HTTPD | `docker pull ghcr.io/rtvkiz/minimal-httpd:latest` | 가능* | Apache 웹 서버 |
| Caddy | `docker pull ghcr.io/rtvkiz/minimal-caddy:latest` | 아니요 | 자동 HTTPS 웹 서버 |
| HAProxy | `docker pull ghcr.io/rtvkiz/minimal-haproxy:latest` | 아니요 | TCP/HTTP 로드 밸런서 |
| Traefik | `docker pull ghcr.io/rtvkiz/minimal-traefik:latest` | 아니요 | 클라우드 네이티브 리버스 프록시 |
| Envoy | `docker pull ghcr.io/rtvkiz/minimal-envoy:latest` | 아니요 | 서비스 프록시 및 로드 밸런서 |
| | | **관측성** | |
| Prometheus | `docker pull ghcr.io/rtvkiz/minimal-prometheus:latest` | 아니요 | 메트릭 수집 및 알림 |
| VictoriaMetrics | `docker pull ghcr.io/rtvkiz/minimal-victoria-metrics:latest` | 아니요 | 고성능 메트릭 저장소 |
| Jaeger | `docker pull ghcr.io/rtvkiz/minimal-jaeger:latest` | 아니요 | 분산 추적 (v2) |
| Loki | `docker pull ghcr.io/rtvkiz/minimal-loki:latest` | 아니요 | 로그 수집 (Grafana Labs) |
| Tempo | `docker pull ghcr.io/rtvkiz/minimal-tempo:latest` | 아니요 | 분산 추적 백엔드 (Grafana Labs, AGPL) |
| OTel Collector | `docker pull ghcr.io/rtvkiz/minimal-otelcol:latest` | 아니요 | OpenTelemetry Collector 코어 |
| Fluent Bit | `docker pull ghcr.io/rtvkiz/minimal-fluent-bit:latest` | 아니요 | 경량 로그 프로세서 |
| Node Exporter | `docker pull ghcr.io/rtvkiz/minimal-node-exporter:latest` | 아니요 | Prometheus 호스트 하드웨어 및 OS 메트릭 |
| Blackbox Exporter | `docker pull ghcr.io/rtvkiz/minimal-blackbox-exporter:latest` | 아니요 | Prometheus 엔드포인트 프로빙 (HTTP/DNS/TCP/ICMP) |
| Pushgateway | `docker pull ghcr.io/rtvkiz/minimal-pushgateway:latest` | 아니요 | 배치 작업을 위한 Prometheus 메트릭 푸시 |
| | | **인프라** | |
| CoreDNS | `docker pull ghcr.io/rtvkiz/minimal-coredns:latest` | 아니요 | 쿠버네티스 기본 DNS |
| etcd | `docker pull ghcr.io/rtvkiz/minimal-etcd:latest` | 아니요 | 분산 키-값 저장소 |
| OpenBao | `docker pull ghcr.io/rtvkiz/minimal-openbao:latest` | 아니요 | 비밀 관리 (Vault 포크) |
| Keycloak | `docker pull ghcr.io/rtvkiz/minimal-keycloak:latest` | 예 | ID 및 액세스 관리 |
| Qdrant | `docker pull ghcr.io/rtvkiz/minimal-qdrant:latest` | 아니요 | AI/ML용 벡터 DB (Rust) |
| Registry | `docker pull ghcr.io/rtvkiz/minimal-registry:latest` | 아니요 | OCI 배포 레지스트리 (Docker Registry v2), 소스에서 빌드 |
| Consul | `docker pull ghcr.io/rtvkiz/minimal-consul:latest` | 아니요 | HashiCorp Consul 서비스 검색 + KV (BUSL-1.1) |
| | | **쿠버네티스 및 CI** | |
| Helm | `docker pull ghcr.io/rtvkiz/minimal-helm:latest` | 아니요 | 쿠버네티스 차트 배포를 위한 Helm 3 CLI |
| kubectl | `docker pull ghcr.io/rtvkiz/minimal-kubectl:latest` | 아니요 | 쿠버네티스 클러스터 작업을 위한 kubectl CLI |
| | | **애플리케이션** | |
| Jenkins | `docker pull ghcr.io/rtvkiz/minimal-jenkins:latest` | 예 | CI/CD 자동화 |
| Gitea | `docker pull ghcr.io/rtvkiz/minimal-gitea:latest` | 예 | 자가 호스팅 Git 서비스 |
| MinIO | `docker pull ghcr.io/rtvkiz/minimal-minio:latest` | 아니요 | S3 호환 객체 스토리지 |
| Mailpit | `docker pull ghcr.io/rtvkiz/minimal-mailpit:latest` | 아니요 | 개발자를 위한 SMTP 및 이메일 테스트, 소스에서 빌드 |
| | | **AI/ML** | |
| CUDA Python | *disabled* | 아니요 | Python + CUDA 12.9 + cuDNN 9.10 (빌드 중단됨, 코드 유지됨) |
*\*HTTPD, Jenkins, Kafka, MySQL, OpenSearch, Gitea, Keycloak는 전이적 Wolfi 종속성 또는 업스트림 진입점에서 요구하기 때문에 셸(`sh`/`busybox`/`bash`)을 포함합니다. CI는 셸 존재를 정보 제공용으로 간주합니다.*
</details>
## Quick Start```bash
# Python app
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-python:latest /app/main.py
# Nginx reverse proxy
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-nginx:latest
# PostgreSQL
docker run -d -p 5432:5432 -v pgdata:/var/lib/postgresql/data \
ghcr.io/rtvkiz/minimal-postgres-slim:latest
# Redis
docker run -d -p 6379:6379 ghcr.io/rtvkiz/minimal-redis-slim:latest
# Kafka (KRaft mode — auto-initializes storage on first boot)
docker run -d -p 9092:9092 -v kafkadata:/var/kafka/data \
ghcr.io/rtvkiz/minimal-kafka:latest
docker run 예제 (Node, Go, MySQL, MariaDB, Java, .NET, PHP, Rails, RabbitMQ, Gitea, …)
```bash
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-node-slim:latest index.js
docker run --rm ghcr.io/rtvkiz/minimal-bun:latest --version
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-go:latest build -o /tmp/app .
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-httpd:latest
docker run -d -p 8080:8080 -v jenkins_home:/var/jenkins_home ghcr.io/rtvkiz/minimal-jenkins:latest
docker run -d -p 3306:3306 -v mysqldata:/var/lib/mysql ghcr.io/rtvkiz/minimal-mysql:latest
docker run -d -p 11211:11211 ghcr.io/rtvkiz/minimal-memcached:latest
docker run --rm -v $(pwd):/data ghcr.io/rtvkiz/minimal-sqlite:latest /data/mydb.sqlite "SELECT sqlite_version();"
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-dotnet:latest /app/myapp.dll
| 트리거 | 시점 | 목적 |
|---|---|---|
| 예약됨 | 6시간마다 | Wolfi의 최신 CVE 패치를 가져옴 |
| 푸시 | main 브랜치 병합 시 | 설정 변경 사항 배포 |
| 수동 | 워크플로 디스패치 | 긴급 재빌드 |
취약점 스캔 결과는 실시간 카탈로그, 작업 요약, GitHub Security 탭에 표시됩니다.
소스 빌드 이미지는 전용 워크플로가 매일 업스트림을 확인하고 PR을 열어 추적합니다:
go install chainguard.dev/apko@latest go install chainguard.dev/melange@latest brew install anchore/grype/grype
make python make test-python
make build
make scan
See the [Makefile](https://github.com/rtvkiz/minimal/blob/HEAD/Makefile) for the full target list.
## 프로젝트 구조
<details>
<summary><strong>저장소 레이아웃</strong></summary>
<br>```
minimal/
├── <image>/
│ ├── apko/<name>.yaml # final image config
│ ├── melange.yaml # source build (optional)
│ └── test.sh # smoke test
├── .github/
│ ├── SECURITY.md # disclosure policy + verification recipes
│ └── workflows/
│ ├── build.yml # main CI pipeline (6h rebuilds)
│ ├── patch-go-deps.yml # daily Go transitive CVE patching
│ ├── update-<image>.yml # per-image upstream version tracking
│ └── update-wolfi-packages.yml
├── Makefile
├── README.md
├── CONTRIBUTING.md
└── LICENSE
최근 적용된 사항:
cosign verify-attestation으로 검증 가능.gh attestation verify로 검증 가능.다음 계획:
이 프로젝트가 아닌 것:
PR은 언제나 환영합니다. CONTRIBUTING.md에는 빌드 설정, 이미지 규칙, 푸시 전에 실행하는 로컬 검증 체크리스트가 포함되어 있습니다.
보안 문제를 발견하신 경우, 공개 이슈 대신 GitHub의 비공개 취약성 보고를 이용해 주십시오. 공개 정책 및 응답 타임라인은 .github/SECURITY.md에 명시되어 있습니다.
MIT — LICENSE 참조.
컨테이너 이미지에는 Wolfi 및 기타 소스의 패키지가 포함되어 있으며, 각각 고유한 라이선스(Apache-2.0, MIT, GPL, LGPL, BSD 등)가 적용됩니다. 전체 라이선스 정보는 각 이미지의 SBOM에 포함되어 있습니다:```bash cosign download sbom ghcr.io/rtvkiz/minimal-python:latest | jq '.packages[].licenseConcluded'
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-java:latest -jar /app/myapp.jar
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-php:latest /app/index.php
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-rails:latest -e "require 'rails'; puts Rails.version"
docker run -d -p 5672:5672 -v rabbitmqdata:/var/lib/rabbitmq ghcr.io/rtvkiz/minimal-rabbitmq:latest
docker run -d -p 3000:3000 -v giteadata:/data/gitea ghcr.io/rtvkiz/minimal-gitea:latest
</details>
## 프로덕션에서 사용하기
**변경 불가능한 버전 태그를 고정하세요.** 모든 이미지는 두 개의 태그와 함께 게시됩니다:
| 태그 | 형식 | 예시 | 변경 가능 |
|---|---|---|---|
| 버전 | `VERSION-rEPOCH` | `ghcr.io/rtvkiz/minimal-redis-slim:8.4.1-r0` | 아니요 |
| 최신 | `latest` | `ghcr.io/rtvkiz/minimal-redis-slim:latest` | 예 |
### 개발 변형 (`:latest-dev`)
대부분의 이미지는 **프로덕션과 동일한 소스**로 빌드된 `-dev` 동반 이미지를 게시합니다 — 동일한 런타임 버전, 동일한 선별된 패키지 세트 — 그리고 셸, 패키지 관리자, 컴파일러 툴체인, 이미지에 적합한 디버깅 도구가 포함됩니다. CI 빌드 단계 및 팟 내 디버깅을 위한 것이며, **프로덕션 배포용이 아닙니다.**
일반적인 다단계 사용법:```dockerfile
FROM ghcr.io/rtvkiz/minimal-ruby:latest-dev AS build
WORKDIR /work
COPY Gemfile Gemfile.lock ./
RUN bundle install
FROM ghcr.io/rtvkiz/minimal-ruby:latest
COPY --from=build /work /work
대화형 셸을 얻으려면 엔트리포인트를 재정의하세요 (개발 이미지는 프로덕션 엔트리포인트를 유지하여 바로 사용할 수 있는 호환성을 제공합니다):```bash docker run -it --entrypoint /bin/sh ghcr.io/rtvkiz/minimal-:latest-dev docker run -it --entrypoint /bin/bash ghcr.io/rtvkiz/minimal-:latest-dev
Dev variants share the prod image's signing, SBOM, and SLSA provenance pipeline. They are **not tracked on the public CVE dashboard** — they intentionally ship a larger attack surface. See [`.github/SECURITY.md`](https://github.com/rtvkiz/minimal/blob/HEAD/.github/SECURITY.md#dev-variants--dev-tags) for the policy and [`docs/dev-variants/CONVENTIONS.md`](https://github.com/rtvkiz/minimal/blob/HEAD/docs/dev-variants/CONVENTIONS.md) for the package composition rules.
**현재 제공 중:** 57개 중 57개의 개발 변형 — 카탈로그의 모든 이미지가 이제 프로덕션과 동일한 소스로 빌드된 `:latest-dev` 동반 이미지를 제공합니다.
<details>
<summary><strong>이미지별 개발 변형 상태</strong></summary>
<br>
범례: ✅ `:latest-dev` 제공 중 · 🚧 진행 중 · 📝 계획됨
카테고리는 [`docs/dev-variants/templates/`](https://github.com/rtvkiz/minimal/blob/HEAD/docs/dev-variants/templates/)의 세 가지 템플릿(런타임/데몬/서버)을 따릅니다. "Reference" 열은 Chainguard의 공개 `<image>-public/devConfigs` 패키지 세트를 미러링하는 위치를 나타냅니다. **in-house**는 Chainguard가 Enterprise 전용 이미지를 제공하며, 우리가 직접 개발 구성을 설계했음을 의미합니다.
| 이미지 | 카테고리 | 참조 | 상태 |
|---|---|---|---|
| ruby | 런타임 | Chainguard `ruby-public` | ✅ |
| python | 런타임 | Chainguard `python-public` | ✅ |
| node-slim | 런타임 | Chainguard `node-public` | ✅ |
| go | 런타임 | Chainguard `go-public` | ✅ |
| java | 런타임 | Chainguard `jdk-public` | ✅ |
| dotnet | 런타임 | Chainguard `dotnet-runtime-10-public` | ✅ |
| php | 런타임 | in-house (composer 지연됨 — PR 참조) | ✅ |
| rails | 런타임 | in-house (ruby에서 파생) | ✅ |
| bun | 런타임 | in-house | ✅ |
| deno | 런타임 | in-house | ✅ |
| postgres-slim | 데몬 | Chainguard `postgres-public` | ✅ |
| mariadb | 데몬 | Chainguard `mariadb-public` | ✅ |
| mysql | 데몬 | in-house | ✅ |
| redis-slim | 데몬 | Chainguard `redis-public` | ✅ |
| valkey | 데몬 | Chainguard `valkey-public` | ✅ |
| memcached | 데몬 | in-house | ✅ |
| sqlite | 데몬 | in-house | ✅ |
| opensearch | 데몬 | in-house | ✅ |
| kafka | 데몬 | in-house | ✅ |
| rabbitmq | 데몬 | in-house | ✅ |
| nats | 데몬 | in-house | ✅ |
| etcd | 데몬 | in-house | ✅ |
| qdrant | 데몬 | in-house | ✅ |
| nginx | 서버 | Chainguard `nginx-public` | ✅ |
| haproxy | 서버 | Chainguard `haproxy-public` | ✅ |
| minio | 서버 | Chainguard `minio-client-public` (서버는 in-house) | ✅ |
| httpd | 서버 | in-house | ✅ |
| caddy | 서버 | in-house | ✅ |
| traefik | 서버 | in-house | ✅ |
| envoy | 서버 | in-house | ✅ |
| prometheus | 서버 | in-house | ✅ |
| victoria-metrics | 서버 | in-house | ✅ |
| jaeger | 서버 | in-house | ✅ |
| otelcol | 서버 | in-house | ✅ |
| loki | 서버 | in-house | ✅ |
| fluent-bit | 서버 | in-house | ✅ |
| node-exporter | 서버 | in-house | ✅ |
| blackbox-exporter | 서버 | in-house | ✅ |
| pushgateway | 서버 | in-house | ✅ |
| coredns | 서버 | in-house | ✅ |
| gitea | 서버 | in-house | ✅ |
| jenkins | 서버 | in-house | ✅ |
| keycloak | 서버 | in-house | ✅ |
| openbao | 서버 | in-house | ✅ |
| registry | 서버 | Chainguard `registry-public` | ✅ |
| mailpit | 서버 | in-house (Chainguard는 공개 mailpit을 제공하지 않음) | ✅ |
| consul | 서버 | in-house (Chainguard는 공개 consul을 제공하지 않음; BUSL-1.1) | ✅ |
| tempo | 서버 | in-house (Chainguard는 공개 tempo를 제공하지 않음; AGPL-3.0) | ✅ |
| mosquitto | 데몬 | in-house (Chainguard는 공개 mosquitto를 제공하지 않음; EPL-2.0/EDL-1.0) | ✅ |
</details>```dockerfile
# Production Dockerfile — pin by version tag, ideally by digest
FROM ghcr.io/rtvkiz/minimal-go:1.26.0-r0 AS build
WORKDIR /src
COPY . .
RUN go build -o /out/app
FROM ghcr.io/rtvkiz/minimal-python:3.14.0-r0
COPY --from=build /out/app /usr/bin/app
ENTRYPOINT ["/usr/bin/app"]
Kubernetes에서 서명 + 출처 강제 적용 with sigstore-policy-controller or Kyverno:```yaml
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: verify-minimal-images spec: validationFailureAction: Enforce rules: - name: check-signature match: any: - resources: kinds: [Pod] verifyImages: - imageReferences: - "ghcr.io/rtvkiz/minimal-" attestors: - entries: - keyless: subject: "https://github.com/rtvkiz/minimal/" issuer: "https://token.actions.githubusercontent.com"
`-r0` 접미사는 개정 번호입니다. 업스트림 버전이 올라갈 때마다 `r0`로 재설정되며, 동일한 업스트림 버전의 재빌드(예: 의존성 패치) 시에는 `r1`, `r2`…로 증가합니다. 이전 버전 태그는 재빌드 시에도 유지됩니다.
## 빌드 파이프라인
<details>
<summary><strong>파이프라인 다이어그램</strong></summary>
<br>```
┌─────────────────────────────────────────────────────────────────────────────┐
│ BUILD PIPELINE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Signing Keys: │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ PRs: keygen job (ephemeral) │ Main: repository secrets (persistent)│ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────────────┐ │
│ │ melange-build │ │ build-apko │ │
│ │ Native ARM64 runners │ │ Wolfi pre-built packages │ │
│ │ ┌────────┐ ┌────────────┐ │ │ ┌─────────┐ ┌───────────────┐ │ │
│ │ │ x86_64 │ │ aarch64 │ │ │ │ Wolfi │────►│ apko publish │ │ │
│ │ │ ubuntu │ │ ubuntu-arm │ │ │ │ packages│ │ (multi-arch) │ │ │
│ │ └────┬───┘ └─────┬──────┘ │ │ └─────────┘ └───────┬───────┘ │ │
│ │ └─────┬──────┘ │ │ │ │ │
│ │ ▼ │ └──────────────────────────│──────────┘ │
│ │ ┌──────────────┐ │ │ │
│ │ │ artifacts │ │ │ │
│ │ │ (x86+arm64) │ │ │ │
│ │ └──────┬───────┘ │ │ │
│ └────────────│────────────────┘ │ │
│ ▼ │ │
│ ┌─────────────────────────────┐ │ │
│ │ build-melange │ │ │
│ │ ┌─────────┐ ┌────────────┐ │ │ │
│ │ │ merge │►│ apko │─┼───────────────────────────────┤ │
│ │ │ packages│ │ publish │ │ │ │
│ │ └─────────┘ └────────────┘ │ │ │
│ └─────────────────────────────┘ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Verification & Attestation │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────────────┐ │ │
│ │ │ Grype │─►│ Test │─►│ cosign │─►│ SBOM + SLSA L3 │ │ │
│ │ │ CVE scan │ │ image │ │ sign │ │ attestations │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Note: PRs build and test but do not publish. Only main branch publishes. │
└─────────────────────────────────────────────────────────────────────────────┘
| 워크플로 | 감시 대상 | 수행 작업 |
|---|
update-jenkins.yml | Jenkins LTS 릴리스 | melange 구성, Makefile, build.yml의 버전 업데이트 |
update-redis.yml | Redis GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-mysql.yml | MySQL LTS (8.4.x) GitHub 태그 | 버전과 SHA256 업데이트 |
update-memcached.yml | Memcached GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-kafka.yml | Apache Kafka 4.x GitHub 태그 | 버전과 SHA512 업데이트 |
update-php.yml | php.net 릴리스 API | 버전과 SHA256 업데이트; 새 부/주 버전 시리즈에 대해 이슈 열기 |
update-rails.yml | RubyGems API + Ruby GitHub 태그 | Rails gem과 Ruby 소스 버전을 독립적으로 업데이트 |
update-rabbitmq.yml | RabbitMQ GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-minio.yml | MinIO GitHub 릴리스 | 릴리스 태그, 날짜 기반 버전, SHA256 업데이트 |
update-victoria-metrics.yml | VictoriaMetrics GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-jaeger.yml | Jaeger v2.x GitHub 릴리스 | 버전과 SHA256 업데이트; 주 버전 변경 시 경고 |
update-otelcol.yml | OTel Collector 안정 릴리스 | 버전과 SHA256 업데이트; 사전 릴리스 건너뜀 |
update-qdrant.yml | Qdrant v1.x GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-etcd.yml | etcd v3.x GitHub 릴리스 | 버전과 SHA256 업데이트 |
update-opensearch.yml | OpenSearch 3.x GitHub 릴리스 | Makefile과 README의 버전 업데이트 |
update-gitea.yml | Gitea v1.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-coredns.yml | CoreDNS v1.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-openbao.yml | OpenBao v2.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-loki.yml | Loki v3.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-fluent-bit.yml | Fluent Bit v5.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-keycloak.yml | Keycloak 26.x GitHub 태그 | 버전과 SHA256 업데이트 |
update-wolfi-packages.yml | Wolfi APKINDEX | 새 Python, Node, Go, .NET, Java, PostgreSQL, Deno 버전 감지 |
패치 업데이트는 자동 PR로 생성되고 CI에서 검증됩니다. 부/주 버전 업데이트는 수동 업그레이드 체크리스트와 함께 GitHub 이슈를 생성합니다.
| 이미지 | 버전 | 사용자 | 엔트리포인트 | 작업 디렉토리 |
|---|
| Python | 3.14.x | nonroot (65532) | /usr/bin/python3 | /app |
| Node.js-slim | 25.x | nonroot (65532) | /usr/bin/dumb-init -- /usr/bin/node | /app |
| Bun | latest | nonroot (65532) | /usr/bin/bun | /app |
| Go | 1.26.x | nonroot (65532) | /usr/bin/go | /app |
| Nginx | mainline | nginx (65532) | /usr/sbin/nginx -g "daemon off;" | / |
| HTTPD | 2.4.x | www-data (65532) | /usr/sbin/httpd -DFOREGROUND | /var/www/localhost/htdocs |
| Jenkins | 2.555.x LTS | jenkins (1000) | tini -- java -jar jenkins.war | /var/jenkins_home |
| Redis | 8.6.x | redis (65532) | /usr/bin/redis-server | / |
| MySQL | 8.4.x | mysql (65532) | /usr/bin/docker-entrypoint.sh | / |
| MariaDB | 11.4.x | mariadb (65532) | /usr/bin/mariadbd | /var/lib/mysql |
| Memcached | 1.6.x | memcached (65532) | /usr/bin/memcached | / |
| PostgreSQL | 18.x | postgres (70) | /usr/bin/postgres | / |
| SQLite | 3.51.x | nonroot (65532) | /usr/bin/sqlite3 | /data |
| .NET Runtime | 10.x | nonroot (65532) | /usr/bin/dotnet | /app |
| Java | 26.x | nonroot (65532) | /usr/bin/java | /app |
| Ruby | 4.0.x | nonroot (65532) | /usr/bin/ruby | /work |
| PHP | 8.5.x | nonroot (65532) | /usr/bin/php | /app |
| Rails | Ruby 4.0.x + Rails 8.1.x | nonroot (65532) | /usr/bin/ruby | /app |
| Kafka | 4.2.x | kafka (65532) | /usr/bin/kafka-entrypoint.sh | / |
| RabbitMQ | 4.3.x | rabbitmq (65532) | /opt/rabbitmq/sbin/rabbitmq-server | / |
| NATS | latest | nonroot (65532) | /usr/bin/nats-server | / |
| Valkey | latest | nonroot (65532) | /usr/bin/valkey-server | / |
| MinIO | RELEASE.2025-10-15 | minio (65532) | /usr/bin/minio server --console-address :9001 /data | /data |
| OpenSearch | 3.7.0 | opensearch (65532) | /usr/share/opensearch/opensearch-docker-entrypoint.sh | /usr/share/opensearch/data |
| etcd | 3.6.x | nonroot (65532) | /usr/bin/etcd | /var/lib/etcd |
| VictoriaMetrics | 1.142.x | nonroot (65532) | /usr/bin/victoria-metrics | / |
| Jaeger | 2.18.x | nonroot (65532) | /usr/bin/jaeger | / |
| OTel Collector | 0.151.x | nonroot (65532) | /usr/bin/otelcol | / |
| Qdrant | 1.17.x | nonroot (65532) | /usr/bin/qdrant | /qdrant |
| Deno | 2.x | nonroot (65532) | /usr/bin/deno | /app |
| Gitea | 1.26.x | gitea (65532) | /usr/bin/gitea web --config /etc/gitea/app.ini | /var/lib/gitea |
| CoreDNS | 1.14.x | nonroot (65532) | /usr/bin/coredns | / |
| OpenBao | 2.5.x | openbao (65532) | /usr/bin/bao server | /openbao/data |
| Keycloak | 26.6.x | keycloak (65532) | /opt/keycloak/bin/kc.sh start-dev | /opt/keycloak/data |
| Loki | 3.6.x | loki (65532) | /usr/bin/loki | /loki |
| Fluent Bit | 5.0.x | nonroot (65532) | /usr/bin/fluent-bit | / |