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