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オプションが必要です。まとめると以下のようになります。

1
2
3
4
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のビルドはコマンド一発で終わります。

1
npm install sharp

これでビルドが完了するはずです。

sharpインストール済みのDockerイメージ

これらの作業を踏んで、sharpがインストールされた状態のDockerイメージを作ってみました。

Docker image for alpine-sharp

https://github.com/gazf/alpine-sharp

このリポジトリではマルチステージビルドを使っているため、単純にsharpをビルドした状態より300MB程度軽いイメージとなっています。

以下Dockerfileです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# ------------ 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をビルドし、生成されたファイルを実行イメージに持ってくるようにしています。これによって実行時に不要なソースなどをイメージから排除することができます。