Node.js
ここに示す例は、Node.js アプリケーションを 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/node:latest-dev
WORKDIR /usr/src/app
COPY package*.json ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache python3 make g++
RUN npm install
COPY . .
CMD ["node", "index.js"]#syntax=docker/dockerfile:1
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
# パッケージの追加を必要とする場合は apt を使ってインストールすること
# RUN apt-get update && apt-get install -y python3 make g++ && rm -rf /var/lib/apt/lists/*
RUN npm install
COPY . .
CMD ["node", "index.js"]#syntax=docker/dockerfile:1
# === ビルドステージ: 依存パッケージのインストールとアプリケーションのビルド ===
FROM dhi.io/node:23-alpine3.21-dev AS builder
WORKDIR /usr/src/app
COPY package*.json ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache python3 make g++
RUN npm install
COPY . .
# === 最終ステージ: 最小ランタイムイメージの生成 ===
FROM dhi.io/node:23-alpine3.21
ENV PATH=/app/node_modules/.bin:$PATH
COPY --from=builder --chown=node:node /usr/src/app /app
WORKDIR /app
CMD ["index.js"]#syntax=docker/dockerfile:1
FROM dhi.io/node:23-alpine3.21-dev
WORKDIR /usr/src/app
COPY package*.json ./
# パッケージの追加を必要とする場合は apk を使ってインストールすること
# RUN apk add --no-cache python3 make g++
RUN npm install
COPY . .
CMD ["node", "index.js"]