
Kubernetes の hostPath の FileOrCreate と File の違い
Kubernetes の hostPath を使ってホストのファイルを Pod にマウントするとき、type を指定することでどのように扱うかを制御できます。その中でも FileOrCreate と File は似ているようで、実は動作が大きく異なります。
例えば、アプリケーションのログファイルをマウントしたいとき、FileOrCreate を使うか File を使うかで挙動が変わるため、意図しない動作にならないように注意が必要です。
FileOrCreate と File の違い
(1) FileOrCreate の特徴
指定したパスに ファイルがない場合 は、新しく空のファイルを作成する
作成されるファイルのパーミッションは 0644、所有者は root
すでにファイルがある場合は、そのまま使用する
🔹 例
もし /var/log/myapp.log を FileOrCreate で指定し、そのファイルが存在しなければ、Kubernetes が新しく空のファイルを作成します。
📌 こんなときに便利!
ログファイルのように、「なければ作る」方が都合が良いケースで活躍します。
(2) File の特徴
指定したパスに ファイルがすでに存在する場合のみ マウントが成功する
ファイルがないとエラー になり、Pod のスケジュールが失敗する
指定したパスにディレクトリやブロックデバイスがある場合もエラー
🔹 例
/var/log/myapp.log を File で指定した場合、そのファイルが 事前に存在していなければならず、なければエラーになります。
📌 こんなときに便利!
設定ファイルなど 事前に用意されているべきファイル を扱う場合に適しています。例えば、/etc/config.yaml などの設定ファイルを間違って空で作られたくないときに File を使うと安全です。
どちらを使うべき?
FileOrCreate → 「なければ作る」
例: ログファイル、アプリが動的に作るファイル
File → 「なければエラー」
例: 設定ファイル、削除されると問題があるファイル
hostPath の YAML 設定例
📌 FileOrCreate の場合(なければ作る)
volumes:
- name: log-volume
hostPath:
path: /var/log/myapp.log
type: FileOrCreate
→ /var/log/myapp.log が存在しない場合、新しく作成される
📌 File の場合(なければエラー)
volumes:
- name: log-volume
hostPath:
path: /var/log/myapp.log
type: File
→ /var/log/myapp.log が存在しないとエラーになり、Pod はスケジュールされない
まとめ
FileOrCreate は ファイルがなければ作る
File は ファイルがなければエラーになる
どちらを選ぶかは、ファイルの性質や事前準備の可否によって決めるのがポイントです。ログファイルのように柔軟に作りたい場合は FileOrCreate、削除されたら困る設定ファイルなら File を使うと良いですね。