Alpine Linux上でsharpをビルドする
sharpとは?
C++で記述された画像加工モジュールで、非常に高速に画像を処理することができるモジュールです。
当然ですが、C++で書かれているため、使用するにはコンパイルする必要があります。
Alpine Linuxとは?
Linuxディストリビューションの一つで、セキュア・軽量という特徴があります。イメージサイズが5MB程度なのでDockerのベースイメージとして最適です。
しかし、本当に最小限のモジュールしかインストールされていないためされていないため、何かをコンパイルしたりする場合、難易度が高くなります。
Alpine Linux上でsharpをビルドする
タイトルの通り、軽量ディストリビューションのAlpine Linux上でsharpをビルドしてみます。
今回はDockerイメージとしてnode:alpineを使用します。この先はこのDockerイメージの中での作業となります。
必要なパッケージ
- libtool
- automake
- autoconf
- nasm
- vips
- vips-dev
- fftw
- fftw-dev
- gcc
- g++
- make
- libc6-compat
これらをAlpine Linux上でapk add
する必要があります。一部のモジュールは--repository http://dl-3.alpinelinux.org/alpine/edge/testing
オプションが必要です。まとめると以下のようになります。
apk add \
--no-cache --update \
--repository http://dl-3.alpinelinux.org/alpine/edge/testing \
libtool automake autoconf nasm vips-dev fftw-dev gcc g++ make libc6-compat
sharpのビルド
依存関係さえクリアしてしまえばsharpのビルドはコマンド一発で終わります。
npm install sharp
これでビルドが完了するはずです。
sharpインストール済みのDockerイメージ
これらの作業を踏んで、sharpがインストールされた状態のDockerイメージを作ってみました。
Docker image for alpine-sharp
このリポジトリではマルチステージビルドを使っているため、単純にsharpをビルドした状態より300MB程度軽いイメージとなっています。
以下Dockerfileです。
# ------------ builder ------------
# base image https://hub.docker.com/_/node/
FROM node:alpine as builder
RUN set -x && \
apk add \
--no-cache --update \
--repository http://dl-3.alpinelinux.org/alpine/edge/testing \
libtool automake autoconf nasm vips-dev fftw-dev gcc g++ make libc6-compat
RUN set -x && \
npm set progress=false && \
npm config set depth 0 && \
npm install sharp
# ------------ main ------------
# base image https://hub.docker.com/_/node/
FROM node:alpine
COPY --from=builder node_modules node_modules
COPY test/index.js index.js
RUN set -x && \
apk add \
--no-cache --update \
--repository http://dl-3.alpinelinux.org/alpine/edge/testing \
vips fftw libc6-compat && \
node . && \
rm -f index.js
LABEL maintainer "gazf"
手順としては、sharpをビルドし、生成されたファイルを実行イメージに持ってくるようにしています。これによって実行時に不要なソースなどをイメージから排除することができます。