[Flask/Docker]Flaskで`PermissionError`が出たときの対処法とDockerへのファイル追加方法による挙動の違いについて

はじめに

PermissionErrorが出たのでその対処法と、
その発生要因を検証していてわかった別のことをメモします。

エラーとその対処

Flask + Dockerで開発していて以下のエラーが出ました。
Flask自体は動いていて、あるページに遷移したときに出たメッセージです。

PermissionError: [Errno 1] Operation not permitted: '/xxx/templates/application.html'

エラー文から分かるように、ファイルの権限を変更すると動くようになりました。

# chmod 755 -R tbl/templates

問題自体は解決したものの、今まで出ていなかった権限エラーが突然出てきた理由が分からないのが釈然としません。
ファイルの生成方法がいつもと違ったのが理由なのでは…と思い、軽く検証することにしました。

新規ファイル生成の方法別検証

ファイル生成の方法によって挙動が変わるのかを調べるべく、テンプレートのhtmlファイルを3つの方法で作成し、画面表示させてみました。

  1. 同期先のディレクトリにエディタ(Sublimeなど)経由で生成
  2. Docker上でtouchで生成
  3. VSCode Remote Container経由で生成

結果は以下でした

生成方法 画面表示できる ls -l
1 できる 直後: なし(Docker/VSCodeどちらからも認識されていない)
しばらく経つと: -rw-r–r– 1 root root
2 できる -rw-r–r– 1 root root
3 できる -rw-r–r– 1 root root

ls -lはファイルの権限と所有者情報です

今回の検証では、PermissionErrorが出た原因は、ファイルの生成方法では無さそう、ということが分かりました。

ただ、同期先ディレクトリにDocker外でファイル作成した場合、

  • そもそもDocker/VSCodeで認識されない
  • が、Dockerで動いているFlaskからは認識され、動作もする
  • しばらく経つとDocker/VSCodeからも認識されるようになる

という挙動をすることが分かりました。

Dockerとホストとのファイル同期は時間差がある、あるいは、特定の操作をしないとDockerからは認識されない、ということでしょうか。

いずれにせよ、Docker上で作業している時は新規ファイル作成時にはDocker内かDockerに接続しているエディタ経由で行う方が無難そうです。

参考