Docker
作成日時:2024-10-14
更新日時:2024-10-14
Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 24.0 ドキュメント
Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント
Dockerfileを書く時注意事項
Dockerfileを書く際には、以下の点に気を付けることが重要です:
- ベースイメージの選択:
- 目的に合った軽量なイメージを選ぶ
- 公式イメージを使用し、信頼性を確保する
- マルチステージビルド:
- ビルド環境と実行環境を分離し、最終イメージのサイズを小さくする
- レイヤーの最小化:
- RUN命令をチェーンし、レイヤー数を減らす
- &&とかで繋ぐ
- 不要なファイルは削除する
- キャッシュの効率的な利用:
- 変更が少ない手順を先に記述し、ビルド時間を短縮する
- あえて無効にして、不正なキャッシュを使用させないことも
- 環境変数の活用:
- ENV命令で設定し、柔軟性を高める
- ENVで環境変数を指定すれば、実行基盤に環境変数が無い場合、その値をデフォルトで使用する。
- 適切なユーザー権限:
- rootユーザーでの実行を避け、セキュリティを向上させる
- ヘルスチェックの追加:
- HEALTHCHECK命令でコンテナの状態を監視する
- オーケストレーションのときとか。
- LBとか外部でやってるならやんなくていいかも
- dockerヘルスチェックは設定次第では若干パフォーマンスに影響を与える。
- .dockerignoreファイルの使用:
- 不要なファイルをビルドコンテキストから除外する
- COPYでコンテナに置くフォルダの中で要らないものを除外する感じ
- ADDとかも
- バージョン管理:
- パッケージやツールのバージョンを明示的に指定する
- ドキュメント化:
- LABEL命令でメタデータを追加し、管理を容易にする
- cdを使わない
- workdirを使え
DockerfileにおけるCOPYとADD命令の比較
1. 基本的な機能
COPY
- 単純なファイルやディレクトリのコピー
- ローカルのファイルシステムからコンテナイメージへのコピーのみ
ADD
- COPYの機能を含む、より高度な機能を持つ
- ローカルファイルシステムからのコピーに加え、URLからのダウンロードや自動解凍機能を持つ
2. 主な違い
ソースの種類
- COPY: ローカルファイルシステムのみ
- ADD: ローカルファイルシステム、リモートURL
圧縮ファイルの扱い
- COPY: そのままコピー
- ADD: 自動的に解凍(ただし、タールアーカイブのみ)
URLからのダウンロード
- COPY: 不可
- ADD: 可能
3. 使用例
COPY の例
COPY ./app /app
COPY config.json /etc/app/config.json
ADD の例
ADD https://example.com/big.tar.xz /usr/src/things/
ADD project.tar.gz /app/
4. ベストプラクティス
基本的にはCOPYを使用
- 単純で予測可能な動作
- セキュリティリスクが低い
ADDは特殊な場合のみ使用
- リモートURLからファイルを取得する場合
- ローカルの圧縮ファイルを自動解凍する場合
リモートファイルのダウンロードには別のRUN命令を使用
RUN curl -O https://example.com/file.tar.gz \ && tar -xzf file.tar.gz -C /usr/src/app \ && rm file.tar.gz
5. 注意点
- ADDはキャッシュ無効化の原因になりやすい
- ADDでリモートファイルを取得する場合、ファイルの整合性確認が難しい
- COPYはより明示的で、イメージビルドの動作が予測しやすい
6. 結論
- 単純なファイルコピーにはCOPYを使用
- 特殊な機能が必要な場合のみADDを検討
- セキュリティとパフォーマンスを考慮し、適切な命令を選択
その他
- 1コンテナ1プロセス
- 脆弱性診断(コンテナスキャン)