Dockerfileとは書き方の基本とイメージを小さく保つ考え方
Dockerfileとは、Dockerイメージの作り方を書く設計書です。FROM・RUN・COPY・CMDなどの基本命令、ビルドの流れ、レイヤーとキャッシュの考え方、秘密情報を入れないための注意点を整理します。
公的機関・公式資料などの一次情報と照合して作成しています。このサイトについて
Dockerfileとは
Dockerfile とは、Docker のイメージを作るための指示書です。Docker の公式ドキュメントでは、テキスト形式で書かれ、イメージをビルドするための命令が含まれると説明されています。この指示書に従って、土台となるイメージの上に、ソフトウェアの導入やファイルのコピーを重ねて、アプリが動くイメージを作ります。
同じ Dockerfile からは、同じ内容のイメージが作れるため、環境の再現性が高まります。手作業の環境構築を、読めて、共有できて、バージョン管理できるファイルに置き換えられる点が、大きな利点です。
基本(主な命令と流れ)
公式ドキュメントに記載されている、基本の命令です。
| 命令 | 役割 |
|---|---|
| FROM | イメージの土台(ベースイメージ)を指定する |
| RUN | 新しいレイヤーでコマンドを実行し、結果を記録する(ソフトの導入など) |
| WORKDIR | 以降の命令の作業フォルダを設定する |
| COPY | 手元のファイルを、イメージにコピーする |
| CMD | コンテナを起動したときに、既定で実行するコマンドを定める |
ビルドまでの流れは、公式では次のように示されています。
| 手順 | 内容 |
|---|---|
| 1 | 書式の指定(構文のバージョンを示す行) |
| 2 | ベースイメージを選ぶ(FROM) |
| 3 | 必要なソフトを導入する(RUN) |
| 4 | アプリのファイルをコピーする(COPY) |
| 5 | 環境変数、公開するポート、起動のコマンドなどを設定する(ENV、EXPOSE、CMD) |
| 6 | docker build で、名前とタグを付けてビルドする |
例として、小さなPythonアプリの Dockerfile です。
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
使うベースイメージの版は、公式の一覧で、現在の提供状況を確認してください。
Dockerfileの具体例
公式ドキュメントでは、Dockerfile の各命令が、イメージの層(レイヤー)を作り、レイヤーは積み重なって、効率よくキャッシュされると説明されています。この性質を活かした書き方が、ビルドの速さに影響します。
上の例で、先に requirements.txt だけをコピーして、依存の導入を行い、そのあとでアプリ全体をコピーする順番にしているのは、キャッシュを活かすためです。アプリのコードを少し直しても、依存のファイルが変わらなければ、導入の層は再利用されます。
| 書き方 | コードを1行直したときのビルド |
|---|---|
| 先にアプリ全体をコピーして、そのあとで依存を導入 | 依存の導入が毎回やり直しになり、遅い |
| 先に依存のファイルだけをコピーして導入、あとでアプリ全体 | 導入の層は再利用され、速い |
たとえば、依存の導入に2分かかるとします。1日に15回ビルドするなら、毎回やり直しだと 2 × 15 = 30 分、キャッシュが効くなら、導入のやり直しは、ほぼゼロにできます(仮定の数値)。
Dockerfileの実践ステップ
- 動かしたいアプリと、必要なソフト(言語、ライブラリ)を整理する。
- 公式のイメージの中から、適切なベースイメージを選ぶ。
- 最小限の Dockerfile を書き、ビルドして、動かす。
- 変更の少ないものを上に、変更の多いものを下に書くよう、命令の順番を整える。
- 不要なファイルをコピーしないよう、除外の設定ファイル(.dockerignore)を用意する。
- 秘密情報が含まれていないか確認する。
- Dockerfile を、ソースと一緒にバージョン管理する。
Dockerfileの注意点
- パスワードやAPIキーを、Dockerfile に書いたり、イメージに含めたりしないでください。イメージを共有すると、流出します。
- ベースイメージが古いと、脆弱性が残ります。定期的に、更新して再ビルドします。
- latest のような、版が動くタグは、再現性が下がります。版を固定することを検討します。
- 不要なファイルを含めると、イメージが大きくなり、取得と起動が遅くなります。
- 書き方の推奨は更新されます。最新の公式ドキュメントを確認してください。
Dockerfileでよくあるミス
- 命令の順番が悪く、ビルドのたびに時間がかかる。
- 秘密情報を、環境変数やファイルとしてイメージに含める。
- 不要なファイルまでコピーして、イメージが肥大する。
- 版を固定せず、ある日突然ビルドが失敗する。
Dockerfileのチェックリスト
- ベースイメージの提供元と版を確認したか。
- 命令の順番が、キャッシュを活かせる形か。
- 秘密情報が含まれていないか。
- 不要なファイルを除外しているか。
- ベースイメージの更新の方針があるか。
DockerfileのFAQ(よくある質問)
Q. Dockerfile と docker-compose の設定ファイルは、何が違いますか。
A. Dockerfile は1つのイメージの作り方、Compose の設定ファイルは複数のコンテナをどう組み合わせて動かすかを書くものです。役割が異なり、併用されます。
Q. イメージが大きくなるのは、なぜですか。
A. 不要なファイルや、導入したソフトの残りがレイヤーに含まれるためです。必要なものだけを入れる工夫が必要です。
Q. ベースイメージは、どう選べばよいですか。
A. 提供元が明確な、公式のイメージを選び、必要な機能と大きさのバランスで決めます。
筆者の見解(Dockerfile)
Dockerfile は、短く書けることより、読んだ人が何が入っているか分かることが大切だと考えます。後から保守する人が、なぜその命令があるのかを理解できないと、更新が止まり、古いイメージが使われ続けるためです。私見では、最小限の Dockerfile から始めて、ビルドの遅さや大きさが問題になった時点で、順番と除外の工夫を足す進め方が、無理がありません。
Dockerfileの関連項目
出典(一次情報)
本記事は一般的な情報の提供を目的としています。SaaS・ツールの機能・料金・無料枠・仕様は頻繁に更新されるため、最新の内容は各社の公式ページでご確認ください。契約・法務・セキュリティに関する判断は、専門家や社内の担当部門にご相談ください。「筆者の見解」は一つの考え方です。