はじめに
alpine3.13から3.16にアップデートする際にハマったので備忘録を作成。
alpine3.13ではiconvに不具合がありソースからインストールしていた。
https://blog.bagooon.com/?p=1516
RUN apk add --no-cache --virtual .build-deps \
make \
gcc \
g++ \
&& 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 \
&& rm -Rf ~/libiconv \
&& apk del .build-deps
ENV LD_PRELOAD /usr/bin/lib/preloadable_libiconv.so
この不具合が解消されているため、alpine3.16では別の方法で対応する必要がある。
設定の変更について
alpine3.16では事前にiconvが有効になっているため、自前でインストールする必要は無くなりました。
https://github.com/docker-library/php/issues/1272
RUN docker-php-ext-install iconv
が記載されていて下記エラーが出ている場合、既にインストールされている可能性があります。
#17 125.8/usr/src/php/ext/iconv/iconv.c:197:25: error: '_libiconv_version' undeclared (first use in this function)
#17 125.8 197 | _libiconv_version >> 8, _libiconv_version & 0xff);
#17 125.8 | ^~~~~~~~~~~~~~~~~
#17 125.8 /usr/src/php/ext/iconv/iconv.c:197:25: note: each undeclared identifier is reported only once for each function it appears in
#17 125.8 /usr/src/php/ext/iconv/iconv.c: In function '_php_iconv_appendl':
#17 125.8 /usr/src/php/ext/iconv/iconv.c:97:15: warning: implicit declaration of function 'libiconv'; did you mean 'zif_iconv'? [-Wimplicit-function-declaration]
#17 125.8 97 | #define iconv libiconv
#17 125.8 | ^~~~~~~~
#17 125.8 /usr/src/php/ext/iconv/iconv.c:363:29: note: in expansion of macro 'iconv'
#17 125.8 363 | if (iconv(cd, (char **)&in_p, &in_left, (char **) &out_p, &out_left) == (size_t)-1) {
#17 125.8 | ^~~~~
#17 125.9 make: *** [Makefile:208: iconv.lo] Error 1
インストール済みかチェックする場合、docker run コンテナ名 php -m | grep iconv
を実行してインストール済みか確認する事ができます。
ICUデータの入れ替え
alpine3.16から、ICUデータが2分割されて、en
or full
となりました。
デフォルトは、en
となっているので、自前でfullをインストールする必要があります。
インストール自体は、apkを利用できます。
下記実行しenを削除。fullをインストールします。
RUN apk del icu-data-en && apk add icu-data-full
https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.16.0#ICU_data_split
https://github.com/docker-library/php/issues/1302
おわりに
原因究明、情報提供してくれた同僚に感謝。
コンテナサイズを小さくするため、icu-data-fullがデフォルトでインストールされることは今後無いかと思います。
RUN apk del icu-data-en && apk add icu-data-full
は必須で記載することになりそうですね。