Go
ここに示す例は、Go アプリケーションを Docker Hardened イメージに移行する方法を示すものです。
以下の例では Docker Hardened イメージへの移行前後における Dockerfile を示します。 例は 4 種類あります。
- 移行前 (Wolfi): サンプルの Dockerfile は Wolfi ディストリビューションイメージを用いているものであり、DHI への移行前のものです。
- 移行前 (DOI): サンプルの Dockerfile Docker 公式イメージを用いているものであり、DHI への移行前のものです。
- 移行後 (マルチステージ): サンプルの Dockerfile を DHI へ移行した後のものであり、マルチステージビルドとしています (最小でセキュアなイメージとして推奨されます)。
- 移行後 (シングルステージ): サンプルの Dockerfile を DHI へ移行した後のものであり、シングルステージビルドとしています (より単純なものですが、イメージサイズは大きくなり、攻撃対象領域も大きくなります)。
メモマルチステージビルドは、たいていのユースケースに対して推奨されます。 シングルステージビルドは、単純であるためにサポートされていますが、サイズやセキュリティとのトレードオフを考慮することが必要です。
Docker Hardened イメージをプルするにあたっては、あらかじめ
dhi.ioへの認証を行っておく必要があります。 その際には Docker ID 情報 (Docker Hub 用として用いるユーザー名、パスワードと同じ)を用います。 Docker アカウントを持っていない場合は、それを 生成 してください。認証をするには
docker login dhi.ioを実行します。
#syntax=docker/dockerfile:1
FROM cgr.dev/chainguard/go:latest-dev
WORKDIR /app
ADD . ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache git
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
ENTRYPOINT ["/app/main"]#syntax=docker/dockerfile:1
FROM golang:latest
WORKDIR /app
ADD . ./
# パッケージの追加を必要とする場合は apt を使ってインストールすること
# RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
ENTRYPOINT ["/app/main"]#syntax=docker/dockerfile:1
# === ビルドステージ: Go アプリケーションのコンパイル ===
FROM dhi.io/golang:1-alpine3.21-dev AS builder
WORKDIR /app
ADD . ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache git
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
# === 最終ステージ: 最小ランタイムイメージの生成 ===
FROM dhi.io/golang:1-alpine3.21
WORKDIR /app
COPY --from=builder /app/main /app/main
ENTRYPOINT ["/app/main"]#syntax=docker/dockerfile:1
FROM dhi.io/golang:1-alpine3.21-dev
WORKDIR /app
ADD . ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache git
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" --installsuffix cgo -o main .
ENTRYPOINT ["/app/main"]