0
0

More than 1 year has passed since last update.

php-alpine 3.16でiconvを利用する

Last updated at Posted at 2022-08-30

はじめに

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は必須で記載することになりそうですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0