Docker でpyprojの新しいの(ver2.1以上)を Jetson Nanoのdocker build でインストールするのにハマったのでメモします。
pyproj は測地系の変換をするのに使用できる、とても便利なツールです。
(cf.) 過去の自分の投稿
背景
何に困ったか
今まで pip3 する requirementx.txt にpyproj==2.6.1.post1
を書いて使っていました。ノートPCのWSL1 (ubuntu18.04)や Google Cloud Platform のCI/CDのDocker image (ubuntu18.04 base)で動いていました。同じことを Jetson Nano (Jetpak4.4? ubuntu18.04)や raspberry pi4 の docker で行おうとしましたが、CPUがARMv8と異なるせいか、このrequirements.txt では動きませんでした。
PROJ のversion
pyproj の安定板は、現在(2020/10/07)では 2.6.1 のようです。
http://pyproj4.github.io/pyproj/stable/
ここにあるように、PROJは6.2.0以上のものをインストールしておく必要があります。問題は、pyproj が使用するPROJ というライブラリの新しいものをインストールできていないことありました。
(cf.) PROJ (https://proj.org/)
PROJとlibproj.a だけをインストールするだけなら、以下で入ります。
実際に、本家のインストールの説明に書かれています。
$ sudo apt install proj-bin
$ sudo apt install libproj-dev
しかし、これを実行しても古いものしか入らないのが問題。
$ proj
Rel. 4.9.3, 15 August 2016
usage: proj [ -bCeEfiIlormsStTvVwW [args] ] [ +opts[=arg] ] [ files ]
$ ldd `which proj` | grep libproj
libproj.so.12 => /usr/lib/x86_64-linux-gnu/libproj.so.12 (0x00007f2adad70000)
この状態でも pyproj == 1.9.6
とpyprojも古いものにすれば、pip3 install できました。しかし、自分の書いたコードは pyproj >= 2.1 のAPIを利用していました。コードを書き換えたくないので、頑張ってpyproj をインストールすることにしました。
インストール方法
結局、PROJ の最新版をソースからbuild して install して、そのあとにpip3 すれば pyproj==2.6.1.post1 が入りました。この PROJ のインストールですが、割とはまりました。
PROJのインストール
ポイントは、
- PROJに必要なライブラリをビルド前にインストールする
- libproj.a は /usr/local/lib にinstall されるので、ここをLD_LIBRARY_PATH に含めておくこと。自分の環境では、この変数は空だった。
$ apt install -y \
zlib1g-dev libsqlite3-dev pkg-config sqlite3 libcurl4-gnutls-dev libtiff5-dev
$ wget https://download.osgeo.org/proj/proj-7.1.1.tar.gz
$ tar zxvf proj-7.1.1.tar.gz
# cd proj-7.1.1 && ./configure && make && make install
$ export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
無事に新しいのが入ったぞ。
$ proj
Rel. 7.0.1, May 1st, 2020
usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]
$ ldd `which proj` | grep libproj
libproj.so.19 => /usr/local/lib/libproj.so.19 (0x0000007fad95b000)
pyproj のインストール
pip3を実行すると分かりますが、PROJ_DIR という環境変数の設定が必要です。私は以下でOKでした。$PROJ_DIR/lib/libproj.a
や $PROJ_DIR/bin/proj
を参照しているようでした。
$ export PROJ_DIR=/usr/local/
$ pip3 install pyproj==2.6.1.post1
この内容をDockerfile に書き、無事にdocker build できました。docker build には時間がかかりました。ソースからbuild は大変だ。
後で気が付いたきっと楽かもしれない方法
PROJ のビルドや pyprojのインストールには依存関係にいろいろはまりましたが、pyprojのソースにある Dockerfile を参考にすればよかったかも。じつはdocker で配布するのが今どきなのか?
https://github.com/OSGeo/PROJ/blob/master/Dockerfile には以下のようにあります。
pyproj もgithubからcloneして直接にビルドしてみる?(https://github.com/pyproj4/pyproj)
おわり
というわけで、無事に目的(ARMv8 での docker build/runで pyproj を利用)はできました。特にTODOはないですが、きっと将来 apt や pip で簡単に入るようになる幸せな世の中になっているに違いない、、、、と思います。他力本願ですみませんが、とりあえず今日はここまでです。