Alpine Linux 上でPHPのiconvがうまく動かない件の解決策

このブログでは何度もDocker関連の記事をあげていますが、今回もDockerの記事です。

弊社では Alpine Linux をベースイメージに使った公式のPHPイメージを使ってコンテナを作っているのですが、iconvという文字コードを変換する関数がうまく動かずに悩んでいました。

こんなエラーが出てました。

Wrong charset, conversion from `ISO-2022-JP' to `UTF-8//TRANSLIT//IGNORE' is not allowed.

bugs.alpinelinux.org

実際にこれはバグではなく、単にデフォルトで入っているiconvの実装が普通のものと違うことから生じているエラーなようです。

解決策

https://forum.alpinelinux.org/forum/installation/php-iconv-issue で紹介されている先のDockerfileを参考に最新のiconvのソースをビルドして置き換えることで解決できました。現在の最新のバージョンは1.15なのでDockerfileに以下のコードを加えます。

RUN curl -SL http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz | tar -xz -C ~/ &&\
    rm /usr/bin/iconv &&\
    mv ~/libiconv-1.15 ~/libiconv && \
    ~/libiconv/configure --prefix=/usr/bin && \
    make && make install

ENV LD_PRELOAD /usr/bin/lib/preloadable_libiconv.so

これだけで、PHPは新しく入れた方のiconvを使ってくれるようになりました!

ちなみに古い記事だとiconvのバージョンが1.14の方を使っているものがありますが、新しい Alpine Linuxgccではgets関数がなくなっているのでビルドすることができません。