node-gyp に依存しているモジュール (例: mdns ) を Alpine Linux 上でインストールすると、ビルドに必要なパッケージが足りななくてインストールに失敗する。
Dockerfile
FROM node:alpine
RUN npm install mdns
$ docker build .
(略)
mdns@2.3.4 install /node_modules/mdns
node-gyp rebuild
(略)
gyp ERR! configure error
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
(略)
ビルドに必要な python / make / g++ を入れれば良いのだが、せっかく軽量な Alpine を使ってるのに Docker イメージが重くなってしまう。
そこで apk の --virtual NAME
オプションを指定しておくことで、ビルドのためだけに入れたパッケージをビルド後にまとめて削除する。
Dockerfile
FROM node:alpine
RUN apk add --no-cache --virtual .gyp python make g++ \
&& apk --no-cache add avahi-dev \
&& npm install mdns \
&& apk del .gyp
※ avahi-dev
は mdns
が依存しているパッケージ
削除することでイメージサイズを 310MB → 165MB まで減らすことができた。