かなりはまったので、雑にメモする。
環境
- python3.10.12
- poetry1.5.1
やりたかったこと
PythonのFastapiで作ったサンプルアプリケーションを、gcpのCloud Runにデプロイしたかった。
以下のようなDockerfileを作った。
# python3.10のイメージをダウンロード
FROM python:3.10.12-slim-bullseye AS base
..
..
FROM base as production
RUN poetry config virtualenvs.in-project false
..
..
# uvicornのサーバーを立ち上げる
CMD poetry run uvicorn app.main:app --host 0.0.0.0 --port $PORT
ローカルでdocker runしたときはこれで問題なくサーバー起動していたし、gcpにアップされたイメージをpullして、docker runしても、問題なくサーバーが起動していた。
実際に起こったこと
Cloud Runにデプロイすると、起動エラーになってしまい、メッセージは指定されたポート番号でサーバーが起動しない、というようなもの
修正した箇所1
なぜだめなのかは正直まだよくわかっていないのだが、サーバー起動時にpoetryを指定するのではなくて、直接uvicornをたたかないとダメっぽい。
CMD uvicorn app.main:app --host 0.0.0.0 --port $PORT # poetry runは不要
修正した箇所2
これは自分のミスで、docker内は自由に使えるのでpoetryが作成する仮想環境はグローバルにいれればよかったのだが、virtualenvs.in--roject
とvirtualenvs.create
を取り違えており、poetryがグローバルに入っていなかった。
# docker内は自由に使えるのでpoetryが作成する仮想環境はグローバルにいれる
RUN poetry config virtualenvs.create false