herokuのサーバー上に一時ファイルを作ったこと
herokuのサーバー上に一時ファイルを作る必要があり、それが出来るようになるまでに困ったところと解決策をメモ
1. 一時ファイルを作成できるのは /tmp 内だけ
それ以外の場所にファイルを作成しようとしても無駄です
例えば、 java で一時ファイルを作るためには次のようにする
try { File file = new File("/tmp/X.txt"); // /tmp 内なのでOK PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("XXXXXXX"); pw.close(); } catch(IOException e) {}
以下のようにしても一時ファイルは作成されない
try { File file = new File("X.txt"); // カレントディレクトリが/tmpでないならファイルは作成されない PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("XXXXXXX"); pw.close(); } catch(IOException e) {}
2. dynosは3つある
一時ファイルがちゃんと作成されているか確認したい
では、heroku run "ls /tmp" で確認してみよう -> 見当たらない...
見当たらないのでてっきり出来ていないものかと思いきや、そういうわけではない
dynosは3つ存在するのだ
1つ目は Web Dynos, 2つ目は Worker Dynos, 3つ目は One-off Dynos (これらの詳細は下記のリンク先で確認できる)
heroku runは(多分)One-off Dynos
1.のプログラムが実行され、ファイルを書き込んでいるのは Web Dynos か Worker Dynos のどちらか (知らない)
1.のプログラム実行後に heroku run で /tmp の中身を見ても、それらのDynosは相互に影響を与えないため確認できない
heroku公式の以下のリンク先にある Types of dynos を読むとそれが分かる
Dynos and the Dyno Manager | Heroku Dev Center
経緯
一時ファイルが作成できない
/tmpにしかファイルは書き込めないらしい
/tmpにjavaでファイルを作成して、heroku runでファイルが作成されたか確認
ない
stack overflowにそれっぽい記事がある
heroku公式の説明をちゃんと読めとある、読もう
herokuは3つのdynos上で動くらしい
One-off Dynos は temporary dynos で administrative tasks を処理するために使われる...と書いてあるのでなんとなく heroku run はここっぽい
また、javaのプログラムはadministrative taskでもないしここではなさそう
Web DynosとWorker Dynosの説明を見るかぎりjavaはこのどちらかっぽい
ひょっとしてheroku runにファイルが存在しないのは、作られてないんじゃなくて作られたサーバーが違うのでは...? => その通りだったっぽい