[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つの方法で作成し、画面表示させてみました。
- 同期先のディレクトリにエディタ(Sublimeなど)経由で生成
- Docker上でtouchで生成
- 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に接続しているエディタ経由で行う方が無難そうです。
ディスカッション
コメント一覧
まだ、コメントがありません