Alpine Linux上でsharpをビルドする

目次

  1. 1. sharpとは?
  2. 2. Alpine Linuxとは?
  3. 3. Alpine Linux上でsharpをビルドする
  4. 4. 必要なパッケージ
  5. 5. sharpのビルド
  6. 6. sharpインストール済みのDockerイメージ

sharpとは?

C++で記述された画像加工モジュールで、非常に高速に画像を処理することができるモジュールです。

https://github.com/lovell/sharp

当然ですが、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

https://github.com/gazf/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をビルドし、生成されたファイルを実行イメージに持ってくるようにしています。これによって実行時に不要なソースなどをイメージから排除することができます。