LoginSignup
1
1

RenderのDockerコンテナは起動時に/tmp/をクリアする(ようになった)

Posted at

発端

授業でCI/CDを紹介するために,dockerコンテナをrender.comにデプロイする最小のサンプルコードを作っていました.

修正前のDockerfile
FROM python:slim

COPY requirements.txt /tmp/
RUN pip install -U pip \
    && pip install -r /tmp/requirements.txt

COPY main.py start.sh /tmp/
RUN chmod +x /tmp/start.sh
CMD [ "/tmp/start.sh" ]

中身はそれほど大したものではなく,

  • ホストのファイルをコンテナの/tmp/にコピーして
  • pip installやスクリプトを実行をする

だけのものです.

これをテストしてたときには問題なく動いていたのに,授業当日(というかオンデマンド用に録画してた時)に,以下のエラーが出てデプロイできず...

renderのイベントログ
Exited with status 128 while running your code.
Check your deploy logs for more information.

当然ログには何も表示されず(renderはログが出ないことで有名),原因特定には数時間を費やすことに.対面授業中のデモとしてやってなかったのが不幸中の幸い.

試行錯誤と原因

ローカル環境ではおなじdockerfileで何も問題なく動くため,最初は全く原因が分からず.

docker imageを変えてもだめ,でもCMDを変えると動く.ふと思いつき,CMDにpwdlsを入れて挙動やファイル構造を確認すると(これならrenderのlogに出てくる),/tmp/にコピーしたはずのファイルが,renderでデプロイしたときに消えているらしい.

対策

ということで,dockerfileのCOPY先を,/tmp/ではなく/root/にしたら,問題なく動作しました.

修正後のDockerfile
FROM python:slim

COPY requirements.txt /root/
RUN pip install -U pip \
    && pip install -r /root/requirements.txt

COPY main.py start.sh /root/
RUN chmod +x /root/start.sh
CMD [ "/root/start.sh" ]

まあたしかに/tmp/は起動時にクリアするのは妥当だけれども,ローカルのdockerコンテナはそんな挙動はしていないし,修正前のものはrenderでも1ヶ月前は問題なく動いていたのに.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1