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.
実際にこれはバグではなく、単にデフォルトで入っている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 Linux のgccではgets
関数がなくなっているのでビルドすることができません。