Docker+djangoで詰まった所
こんにちは!最近開発でDockerを導入し始めたはみがきたぬきです。
今回はDockerコンテナ環境でdjangoを動かした時に起きた問題が解決できたので備忘録として残していきたいとおもいます。
用語の簡単な説明
Docker -> 開発環境を仮想ですぐに用意してくれる優れもの
django -> pythonで動かすwebアプリケーションフレームワーク、扱いやすい
①modelsを書いた後コンテナが立ち上がらない問題
Dockerの設定やmodels(テーブル定義的な)を書いたあと
docker-compose up -d --build
でコンテナの起動をしてみると
ステータスがアップにならず、立ち上がらない・・・
docker-compose run web
でテストで動かしてみると
エラーがずらーっと出てきました。一番下の方にヒントらしき一文があります。
RRECURSIVE RELATIONSHIP CONSTANT
Google先生に聞いてみると、同じようなエラーを吐かれている方がいらっしゃったので、参考に直して、もう一度立ち上げてみると
動きました!
本来はmodelsで外部キーを記述する際、modelをコンマで囲わずに記述するのですが、まさか一部の条件で囲わないといけないとは知りませんでした。
②Pillow(pythonの画像系のライブラリ)での問題
djangoのmodelsで「ImageField」と呼ばれる画像のパスなんかを取り扱うフィールドを定義できるのですが、その際「Pillow」と呼ばれるpythonのライブラリが必要らしいです。
[dev-packages]
flake8 = ">=3.5.0"
pytest = ">=4.1.0"
pytest-django = ">=3.4.5"
pytest-sugar = ">=0.9.2"
pytest-factoryboy = ">=2.0.2"
[packages]
django = "<=3.0"
psycopg2 = "<=2.8.3"
gunicorn = "<=19.9"
pillow = "*"
とコンテナを立ち上げる際にインストールさせるリストに記述し、立ち上げ!
すると、めちゃくちゃにエラーを吐かれ、エラー文を見てもよくわからない状態に、試行錯誤で「pipenvが原因だろうか?」と考え、それを介さずにインストールすることに。Dockerファイルに以下のコードを追加
RUN pip install pillow
もう一度立ち上げてみるとヒントが出てきました。
エラー文が変わり、下の方に「could not be found for zlib」と書いてあります。
「docker zlib pillow」なんかで検索してみると「zlib-dev」と「jpge-dev」が必要そうだとわかりDockerファイルに追記
RUN apk update \
&& apk add --virtual build-tools gcc python3-dev musl-dev jpeg-dev zlib-dev \
&& apk add postgresql-dev
パッケージリストにもう一度Pillowを書き直し、立ち上げてみるとコンテナが立ち上がりました!
早速ImageFieldをモデルに追記し、データベースに反映させると・・・
「Pillowがないよ!」と出ました
調べてみるとインストールはされているが、中身がない状態?ということがわかりました
おそらく、インストールする際にzlibやjpegみたいな物がまだ必要だと言うことだと思い、「django manage.py pillow not installed」と検索してみると同じ現象になっている方のサイトが出てきました。参考にしながら以下のコードもDockerファイルに追記
RUN apk add libjpeg
するとうまくマイグレーションすることができました!
まとめ
・一度動かし、冷静にエラー文をみると割と解決方法が書いてる
・検索ワードには「環境」+「エラーの原因だと思われるコード」を入れると割と出てくる
・出てこなくても、近い検索結果が出てくれば一度試してみると上手くいくか、ヒントが出てくる。
同じようなエラーが出ているひとの手助けになればいいです。