Amazon Linux 2 に HEIC 変換に対応した ImageMagick 7 をインストールする
Amazon Linux 2 に HEIC 変換に対応した ImageMagick 7 をインストールしようとしたらとても大変だったので備忘録を残しておきます。
以下の Dockerfile で動くと思うので、急ぎの方はご利用ください。
たくさんビルドしないといけないので、30分以上かかります。
FROM amazonlinux:2
WORKDIR /imagemagick
# pkg-config のパスを通す
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
# 動的ライブラリ(.soファイル)の検索パスを追加
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
# yum でインストール可能な依存関係をインストール
RUN yum update -y && \
yum install -y \
gcc \
gcc-c++ \
git \
make \
wget \
tar \
gzip \
pkg-config \
libtool \
openssl-devel \
libpng-devel \
libjpeg-turbo-devel \
gdk-pixbuf2-devel && \
yum clean all
# cmake をビルド&インストール
RUN wget https://cmake.org/files/v3.27/cmake-3.27.0.tar.gz && \
tar -xvzf cmake-3.27.0.tar.gz && \
cd cmake-3.27.0 && \
./bootstrap && \
make && \
make install
# libde265 をビルド&インストール
RUN git clone https://github.com/strukturag/libde265.git -b v1.0.12 libde265 && \
cd libde265 && \
mkdir build && \
cd build && \
cmake .. && \
make && \
make install
# libheif をビルド&インストール
RUN git clone https://github.com/strukturag/libheif.git -b v1.16.2 libheif && \
cd libheif && \
mkdir build && \
cd build && \
cmake --preset=release .. && \
make && \
make install
# ImageMagick をビルド&インストール
RUN wget https://imagemagick.org/download/ImageMagick-7.1.1-15.tar.gz && \
tar -xzf ImageMagick-7.1.1-15.tar.gz && \
cd ImageMagick-7.1.1-15 && \
./configure && \
make && \
make install
解説
上記 Dockerfile のコメントに書いてある通りなのですが、こうなった経緯を書いておきます。
libheif と cmake
HEIC に対応した ImageMagick をビルドするには、予め libde265 と libheif がインストールしてある必要があります(同じ作者です)。
libheif に関しては、2023年5月にリリースされたv1.16.0で autotools を用いたビルド方式が完全に削除 されています。そのため、現在は cmake を用いたビルドのみに対応 しており、cmake のインストールが必要になります。
yum でインストールできる cmake はv2系までのようなので、3系をインストールするためにはソースからビルドする必要があります。そのため、cmake のビルドからこの Dockerfile はスタートしています。
また、cmake でビルドするためには pkg-config の設定が必要です。ENV PKG_CONFIG_PATH=…
でパスを通しているのはそのためです。
libde265 はまだ autotools を用いたビルドができるようですが、いずれ削除されると思われるのでこちらも cmake でビルドするようにしています(libheif のビルドには libde265 が必要)。
ImageMagick のビルドと動的ファイルのリンク
それ以外に ImageMagick 関連で yum install しているものについては以下があります。
- libpng-devel: PNG に対応するために必要
- libjpeg-turbo-devel: JPEG に対応するために必要
- gdk-pixbuf2-devel: 画像ファイルのロード、保存、変換、レンダリングなどを行うためのライブラリ
ImageMagick 自体は、yum でインストールできる ImageMagick は6系までなのと、HEIC対応するためにこちらもソースからビルドしています。
最後に ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
してる部分ですが、libde265, libheif, ImageMagick を make install した時に配置される .so ファイルが上記のパスになっていて、それを検索パスに追加しています。
make install した実行結果を見ると、どこにインストールしているかが書いてあります。
$ pwd
/imagemagick/libheif/build
$ make install
[ 49%] Built target heif
[ 52%] Built target heif-info
[ 64%] Built target heif-convert
[ 77%] Built target heif-enc
[ 81%] Built target heif-test
[ 89%] Built target heif-thumbnailer
[ 96%] Built target heif-libde265
[100%] Built target pixbufloader-heif
Install the project...
-- Install configuration: "Release"
-- Up-to-date: /usr/local/lib64/libheif
-- Up-to-date: /usr/local/lib64/pkgconfig/libheif.pc
-- Up-to-date: /usr/local/bin/heif-info
-- Up-to-date: /usr/local/share/man/man1/heif-info.1
-- Up-to-date: /usr/local/bin/heif-convert
-- Up-to-date: /usr/local/share/man/man1/heif-convert.1
-- Up-to-date: /usr/local/bin/heif-enc
-- Up-to-date: /usr/local/share/man/man1/heif-enc.1
-- Up-to-date: /usr/local/bin/heif-thumbnailer
-- Up-to-date: /usr/local/share/man/man1/heif-thumbnailer.1
-- Up-to-date: /usr/local/lib64/libheif/libheif-libde265.so
-- Up-to-date: /usr/local/lib64/libheif.so.1.16.2
-- Up-to-date: /usr/local/lib64/libheif.so.1
-- Up-to-date: /usr/local/lib64/libheif.so
...
ビルドした ImageMagick に対応しているかどうかは magick -list format に HEIC が含まれているかどうかで確認できます。
$ magick -list format | grep HEIC
HEIC r-- High Efficiency Image Format (1.16.2)
configure 実行時に表示される設定値で HEIC が yes になっていたら OK です(no だとやり直し)
HEIC --with-heic=yes yes 成功!
HEIC --with-heic=yes no やり直し!
cmake によるビルドもそうなのですが、パスの設定にけっこうハマってしまいました。ライブラリは協調して動くので当たり前なのですが、何も分からないところから正解を見つけるのは大変でした。
おまけ
以下のように Multi-stage build すると少しイメージを小さくできます(200MB くらい)。
FROM amazonlinux:2 as build-stage
WORKDIR /imagemagick
# pkg-config のパスを通す
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
# yum でインストール可能な依存関係をインストール
RUN yum update -y && \
yum install -y \
gcc \
gcc-c++ \
git \
make \
wget \
tar \
gzip \
pkg-config \
libtool \
openssl-devel \
libpng-devel \
libjpeg-turbo-devel \
gdk-pixbuf2-devel && \
yum clean all
# cmake をビルド&インストール
RUN wget https://cmake.org/files/v3.27/cmake-3.27.0.tar.gz && \
tar -xvzf cmake-3.27.0.tar.gz && \
cd cmake-3.27.0 && \
./bootstrap && \
make && \
make install
# libde265 をビルド&インストール
RUN git clone https://github.com/strukturag/libde265.git -b v1.0.12 libde265 && \
cd libde265 && \
mkdir build && \
cd build && \
cmake .. && \
make && \
make install
# libheif をビルド&インストール
RUN git clone https://github.com/strukturag/libheif.git -b v1.16.2 libheif && \
cd libheif && \
mkdir build && \
cd build && \
cmake --preset=release .. && \
make && \
make install
# ImageMagick をビルド&インストール
RUN wget https://imagemagick.org/download/ImageMagick-7.1.1-15.tar.gz && \
tar -xzf ImageMagick-7.1.1-15.tar.gz && \
cd ImageMagick-7.1.1-15 && \
./configure && \
make && \
make install
# 実行ステージ
FROM amazonlinux:2
# 実行に必要なファイルのみをコピー
COPY --from=build-stage /usr/ /usr/
# 動的ライブラリ(.soファイル)の検索パスを追加
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH
株式会社アルダグラムのTech Blogです。 世界中のノンデスクワーク業界における現場の生産性アップを実現する現場DXサービス「KANNA」を開発しています。 採用情報はこちら herp.careers/v1/aldagram0508/
Discussion