Ubuntuのコンテナにwatchmanを頑張って入れる

メモです。

元はServerless Frameworkでserverless-appsync-simulatorとserverless-offlineを使おうと思ったら Error: spawn watchman ENOENTっていうエラーが出て起動できず、ぐぐったらwatchmanをインストールすればいいってことでその対応。

MacならHomebrewであっさりインストールできるのだが、あいにく自分はVS Code + Remote Containersである。コンテナとしては公式のNode.jsのイメージを使っていてこれはUbuntuベース。

というわけでLinuxにwatchmanをインストールしようとしたらそこそこハマったのでそのメモ。

まず、Linuxにwatchmanを入れるにはソースからコンパイルして入れる必要がある。一応バイナリも配布されているらしいが。

ソースからコンパイルしてインストールするにあたり事前に以下のパッケージをインストールしておく必要がある。

apt install -y make libtool libssl-dev autoconf automake pkg-config g++ libpython-dev

最後のlibpython-devってのは今回自分が使っているようにPythonがインストールされていないイメージではpyconfig.hが存在せずビルドに失敗するから。

これらを入れたら以下のようにGitからソース持ってきて入れる。

git clone https://github.com/facebook/watchman.git -b v2022.07.18.00 --depth 1
cd watchman
./autogen.sh

なお、公式のインストール手順だとGitからクローンするバージョンがv2021.09.20.00と古い。そうするとpcreのダウンロードに失敗するので新しいものを使う。そして公式手順では./autogen.shの次に./configureしてmake installするというおなじみの手順があるのだが、新しいものを使うと./configureが生成されずmake installもできない。というわけで以下のようにやっていく。

まず、そのままだと./autogen.shにも失敗する。どうやら新しいやつだとRustも必要だったのでインストールする。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

Rustをインストールした後に./autogen.shを実行する。 前述の通り、masterの最新でビルドした場合はconfigureが生成されず、make installもできない。そのためこのあたりを手動でセットアップする必要がある。まず、ビルドされた成果物はbuild/binフォルダにあるのでこのディレクトリに対してPATHを通すか、すでにPATHが通っているどこかのディレクトリに中身をコピーする。自分の場合はひとまずすでにPATHが通っている/usr/local/binにコピーした。

そしてwatchmanを実行してみるとこんなエラーが出る。

./built/bin/watchman: error while loading shared libraries: /usr/local/lib/libgflags.so.2.2: cannot open shared object file: No such file or directory

これはビルドされた共有ライブラリをちゃんと参照できていないということ。これらはbuild/lib以下にあるのでこれを/usr/local/libにコピーした上で環境変数LD_LIBRARY_PATHをセットした。

cp -p ./built/lib/lib*
export LD_LIBRARY_PATH=/usr/local/lib/

そして実行してみると今度は次のエラーである。

[watchman] while computing sockname: failed to create /usr/local/var/run/watchman/root-state: No such file or directory

これは単にディレクトリがないだけなので作成する。

mkdir -p /usr/local/var/run/watchman

ここまでやってようやく起動に成功する。ちなみにautogen.shの実行は結構時間がかかる。コンテナのなかで実行してるからかもしれないが。自分の環境だと10分以上は平気でかかった。

本来の目的であったsls offline startも問題なく実行できた。めでたし。

あとはこれをDockerfileに起こすだけ。

©Keisuke Nishitani, 2020   プライバシーポリシー