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"]