DockerfileのFROM命令を極める:ベースイメージ選定と実践テクニック

はじめに

Dockerfileの最初に書かれる FROM 命令は、単なるベースイメージ指定以上の意味を持っています。
特に中〜上級者がDockerを本番環境で活用する際、この一行がビルドサイズ・セキュリティ・メンテナンス性に大きく影響します。

この記事では、FROM 命令の高度な使い方、マルチステージビルドでの応用、軽量化・最適化のベストプラクティスをハンズオンで解説します。


1. FROM命令の基本構文とタグの扱い

基本構文は以下の通りです:

FROM <image>[:<tag>] [AS <name>]

例:

FROM ubuntu:22.04

タグを省略した場合、:latest がデフォルトで使われますが、これは非推奨です。
理由は、ビルドごとに異なるバージョンのイメージが取得される可能性があるため、再現性が損なわれるからです。


2. ベースイメージの選定戦略

軽量ベースを選ぶ

  • alpine は軽量(約5MB)で人気ですが、glibc非互換なため注意。
  • debian:bookworm-slimubuntu:jammy も安定性重視に最適。

言語別公式イメージの使い分け

例:Node.js

FROM node:20 AS dev
FROM node:20-slim AS prod

-slim-alpine タグを使い分けることで、開発用・本番用のサイズバランスを取ります。


3. マルチステージビルドでのFROM活用

マルチステージビルドを使うと、ビルド環境と実行環境を分離できます。

例:Goアプリのビルド

# ビルドステージ
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

# 実行ステージ
FROM debian:bookworm-slim
COPY --from=builder /app/app /usr/local/bin/app
CMD ["app"]

こうすることで、最終イメージにGoコンパイラや不要な依存を含めず、サイズを数百MB単位で削減できます。


4. ビルドキャッシュを意識したFROMの指定

DockerはFROMごとにキャッシュレイヤーを構築します。
異なるタグを頻繁に使うとキャッシュが無効になり、ビルド時間が増加します。

対策

  • 明示的に固定タグを使う (FROM ubuntu:22.04)
  • 同系統イメージを統一して使う(bookworm-slim 系で統一)
  • ビルドキャッシュ共有時は --cache-from オプションを活用

5. セキュリティ観点からのFROM選定

ベースイメージにも脆弱性があります。
Trivyなどのスキャナーで定期的にチェックしましょう。

trivy image debian:bookworm-slim

また、信頼できる公式イメージ以外は避けることが基本原則です。
社内レジストリを運用する場合は、ベースイメージをセキュリティ検証済みに固定しておくと安心です。


6. 実践ハンズオン:Node.jsアプリを軽量化する

以下の例で、node:20node:20-slim の違いを比較します。

プロジェクト構成

project/
 ├─ app.js
 └─ package.json

app.js

console.log("Hello from Docker!");

package.json

{
  "name": "docker-from-sample",
  "version": "1.0.0",
  "scripts": {
    "start": "node app.js"
  }
}

① 標準的なDockerfile

FROM node:20
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]

ビルド後のサイズ:約 1.1GB


② 軽量版Dockerfile(slim活用)

FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --production=false
COPY . .
CMD ["npm", "start"]

ビルド後のサイズ:約 250MB
約4分の1に軽量化されます。


7. ベストプラクティスまとめ

観点推奨アプローチ
再現性タグ・digest固定 (FROM ubuntu:22.04@sha256:xxxx)
軽量化-slim / -alpine 系を活用
セキュリティTrivyなどで定期スキャン
ビルド効率ベースイメージを統一しキャッシュを活かす
マルチステージビルド環境と実行環境を分離

8. 次のステップ

  • FROM scratch を用いた完全最小構成のコンテナを試す
  • ベースイメージを社内レジストリで統一し、セキュリティアップデートを自動化する
  • TrivyやGrypeと連携したビルドパイプラインの自動スキャンを導入する

まとめ

FROM 命令はDockerfileの第一行でありながら、ビルド品質の要です。
ベースイメージ選びを戦略的に行うことで、セキュリティ・パフォーマンス・開発効率すべてを向上できます。
次回は、「FROM scratch を使った超軽量コンテナの構築」に進みましょう。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です