uwsgi と Web サーバを分けてコンテナ立ち上げたいな…と思って、とりあえず docker hub で uwsgi のイメージを探してみたんですが、たいてい nginx とセットになっていて uwsgi 単品のイメージは良いのが見当たらなかったので「じゃあ自分で作るかぁ」と。
で、どうせなら軽くするために alpine ベースのイメージのほうがいいよね、と python:alpine イメージをベースに構築始めたら結構つまづいたのでメモを残します。
結論
pip install uwsgi の前に、あらかじめ gcc, musl-dev, linux-headers のパッケージをインストールしておく必要があります。
# apk add --no-cache gcc musl-dev linux-headers
# pip install uwsgi
試行錯誤の痕
python:alpine 起動後、まずは何も考えずに pip install uwsgi を実行すると…
Exception: you need a C compiler to build uWSGI
あーなるほど、C コンパイラが必要なのね。
じゃあ apk add gcc してもう一度チャレンジ。
fatal error: stdio.h: No such file or directory
stdio.h が見つからないって、心臓無いようなものでは…?と思いながらもしょうがないのでググってみたら stackoverflow で「まさに!」なスレッドがあった。
musl-dev パッケージを入れろと。
alpine は gcc のインストール時に C ライブラリが一緒に入らないので、個別で入れる必要があるらしい。
指示通り apk add musl-dev した後再々チャレンジ。
fatal error: linux/limits.h: No such file or directory
お、stdio.h はちゃんと見つけたのね…からの今度は limits.h か。なんで見つからないの…?と思って調べてみると、/usr/include/limits.h ちゃんとある。
完全に「???」となっていた時、エラーメッセージもう一度よく見たら linux/limits.h: No such~ と、ファイルパスに linux/ がついてる。
ってことは、/usr/include/linux/limits.h が必要ってことか!?
alpine の公式リストで調べたら linux-headers パッケージに /usr/include/linux/limits.h が含まれている様子。
ということで apk add linux-headers を実行後、pip install uwsgi 再実行したら…
Successfully built uwsgi
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.20
これでやっと uwsgi がインストールできました。