発端
授業でCI/CDを紹介するために,dockerコンテナをrender.comにデプロイする最小のサンプルコードを作っていました.
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やスクリプトを実行をする
だけのものです.
これをテストしてたときには問題なく動いていたのに,授業当日(というかオンデマンド用に録画してた時)に,以下のエラーが出てデプロイできず...
Exited with status 128 while running your code.
Check your deploy logs for more information.
当然ログには何も表示されず(renderはログが出ないことで有名),原因特定には数時間を費やすことに.対面授業中のデモとしてやってなかったのが不幸中の幸い.
試行錯誤と原因
ローカル環境ではおなじdockerfileで何も問題なく動くため,最初は全く原因が分からず.
docker imageを変えてもだめ,でもCMDを変えると動く.ふと思いつき,CMDにpwd
やls
を入れて挙動やファイル構造を確認すると(これならrenderのlogに出てくる),/tmp/
にコピーしたはずのファイルが,renderでデプロイしたときに消えているらしい.
対策
ということで,dockerfileのCOPY先を,/tmp/
ではなく/root/
にしたら,問題なく動作しました.
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ヶ月前は問題なく動いていたのに.