alpine ベースの python コンテナに uwsgi をインストール

Alpine Linux

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 で「まさに!」なスレッドがあった。

GCC can't find stdio.h in Alpine Linux
In a fresh Alpine Linux I installed GCC by apk add --update-cache gcc but still a simple program #include <stdio.h> int ...

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 が含まれている様子。

Package index - Alpine Linux packages

ということで apk add linux-headers を実行後、pip install uwsgi 再実行したら…

Successfully built uwsgi
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.20

これでやっと uwsgi がインストールできました。

タイトルとURLをコピーしました