はじめに
Dockerfileの最初に書かれる FROM
命令は、単なるベースイメージ指定以上の意味を持っています。
特に中〜上級者がDockerを本番環境で活用する際、この一行がビルドサイズ・セキュリティ・メンテナンス性に大きく影響します。
この記事では、FROM
命令の高度な使い方、マルチステージビルドでの応用、軽量化・最適化のベストプラクティスをハンズオンで解説します。
1. FROM命令の基本構文とタグの扱い
基本構文は以下の通りです:
FROM <image>[:<tag>] [AS <name>]
例:
FROM ubuntu:22.04
タグを省略した場合、:latest
がデフォルトで使われますが、これは非推奨です。
理由は、ビルドごとに異なるバージョンのイメージが取得される可能性があるため、再現性が損なわれるからです。
2. ベースイメージの選定戦略
軽量ベースを選ぶ
alpine
は軽量(約5MB)で人気ですが、glibc非互換なため注意。debian:bookworm-slim
やubuntu: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:20
と node: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
を使った超軽量コンテナの構築」に進みましょう。
コメントを残す