M1 Mac で Docker のビルドエラー fatal error: vips/vips8 への対処方法
M1 Mac ( Apple Silicon )で Node.js を使う Docker イメージのビルドで次のようなエラーが出るときの対処方法についてです。
サンプル 1:
../src/common.cc:24:22: fatal error: vips/vips8: そのようなファイルやディレクトリはありません
#include <vips/vips8>
^
compilation terminated.
sharp.target.mk:137: ターゲット 'Release/obj.target/sharp/src/common.o' のレシピで失敗しました
make: ディレクトリ '/node_modules/sharp/build' から出ます
make: *** [Release/obj.target/sharp/src/common.o] エラー 1
サンプル 2:
npm verb stack Error: command failed
npm verb stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/@npmcli/promise-spawn/index.js:64:27)
npm verb stack at ChildProcess.emit (node:events:390:28)
npm verb stack at maybeClose (node:internal/child_process:1064:16)
npm verb stack at Process.ChildProcess._handle.onexit (node:internal/child_process:301:5)
npm verb pkgid sharp@0.29.3
npm verb cwd /app
npm verb Linux 5.10.76-linuxkit
npm verb argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "--verbose"
npm verb node v16.13.1
npm verb npm v8.2.0
npm ERR! code 1
npm ERR! path /app/node_modules/sharp
npm ERR! command failed
npm ERR! command sh -c (node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy)
npm ERR! sharp: Please see https://sharp.pixelplumbing.com/install for required dependencies
npm ERR! sharp: Installation error: Use with glibc 2.28 requires manual installation of libvips >= 8.11.3
npm verb exit 1
私は Node.js の NPM パッケージ sharp
を使うプロジェクトでこのエラーに遭遇しました。
具体的にはベースイメージとして node:16
と node:14
を使用した場合にこの問題が発生しました。
記事執筆時点で node:16
は buster
を、 node:14
は stretch
をベースとしています。
❯ docker run --rm node:16 cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
❯ docker run --rm node:14 cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
ちなみに、ホスト側の macOS の環境は次のとおりです:
❯ sw_vers
ProductName: macOS
ProductVersion: 12.1
BuildVersion: 21C52
ウェブ上で検索するといくつかの解決策が提案されています。 私が目にした範囲では次の 3 つの方法が有効なようでした。
- A)
bullseye
ベースのイメージを使う - B) イメージのプラットフォームを変更する
- C)
vips
(libvips
)をインストールする
A) bullseye
ベースのイメージを使う
記事執筆時点では bullseye
ベースのイメージだと問題ありませんでした。
FROM node:16-bullseye
FROM node:14-bullseye
B) イメージのプラットフォームを変更する
FROM
のオプション --platform
でプラットフォームを変更します。
FROM node:16
FROM node:14
C) vips
( libvips
)をインストールする
Homebrew が利用できる場合は次のコマンドで vips
をインストールできます。
RUN brew reinstall vips
apt-get
が利用できる場合は次のコマンドが libvips
をインストールできます。
RUN apt-get update -y && \
apt-get upgrade -y libvips libvips-dev
参考: Can't compile under Apple Silicon M1 arm64 · Issue #2460 · lovell/sharp · GitHub
これらの中から状況に合った方法を選ぶとよいかと思います。 私は A) の方法を選びました。