8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

安易に軽量DockerイメージにAlpineを採用するのをやめよう

Last updated at Posted at 2021-07-20

ありのまま起こったことを話します。

_人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人_
> 何もしてないのに急にdockerイメージのビルドに失敗するようになった <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^^Y^^Y^^Y^ ̄

事件

先日あるプロジェクトでphp:7.4-fpm-alpineを使っていたらこんなエラーを吐いてdockerのイメージビルドがコケました。

make: *** [Makefile:195: gd.lo] Error 127

エラーを吐いたのはこのスクリプトだったのですが、こいつをこねくり回しても意味がなかったです。

RUN docker-php-ext-configure gd ~~~

以下で議論されていますがalpine3.14固有の現象のようです。

https://gitlab.alpinelinux.org/alpine/aports/-/issues/12396
https://github.com/docker-library/php/issues/1130

幸い3.13に固定したところビルドは通るようになりました。

なんでこうなった?

musl-libcには一般的な互換性が不足しているらしいです。
Ruby, Python, Node.js, phpあたりなどはネイティブでモジュールをバンドルしてるアプリケーションの場合、パフォーマンス劣化や互換性の問題にぶち当たる可能性があるそうです。
superuser.com

確認例

最新のphp:7.4-fpm-alpine

/var/www/html # ldd $(which php)
	/lib/ld-musl-x86_64.so.1 (0x7fe7cfb34000)
	libargon2.so.1 => /usr/lib/libargon2.so.1 (0x7fe7ce915000)
	libxml2.so.2 => /usr/lib/libxml2.so.2 (0x7fe7ce7eb000)
	libssl.so.1.1 => /lib/libssl.so.1.1 (0x7fe7ce76a000)
	libcrypto.so.1.1 => /lib/libcrypto.so.1.1 (0x7fe7ce4e9000)
	libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x7fe7ce3fb000)
	libz.so.1 => /lib/libz.so.1 (0x7fe7ce3e1000)
	libcurl.so.4 => /usr/lib/libcurl.so.4 (0x7fe7ce367000)
	libonig.so.5 => /usr/lib/libonig.so.5 (0x7fe7ce2dd000)
	libedit.so.0 => /usr/lib/libedit.so.0 (0x7fe7ce2ab000)
	libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fe7cfb34000)
	liblzma.so.5 => /usr/lib/liblzma.so.5 (0x7fe7ce288000)
	libnghttp2.so.14 => /usr/lib/libnghttp2.so.14 (0x7fe7ce260000)
	libbrotlidec.so.1 => /usr/lib/libbrotlidec.so.1 (0x7fe7ce253000)
	libncursesw.so.6 => /usr/lib/libncursesw.so.6 (0x7fe7ce1f7000)
	libbrotlicommon.so.1 => /usr/lib/libbrotlicommon.so.1 (0x7fe7ce1d4000)

Debian10

root@743553942da7:/# ldd $(which php)
	linux-vdso.so.1 (0x00007ffc13565000)
	libargon2.so.1 => /usr/lib/x86_64-linux-gnu/libargon2.so.1 (0x00007f5156c2f000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f5156c15000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f51569f7000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f51569ed000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f515686a000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5156865000)
	libxml2.so.2 => /usr/lib/x86_64-linux-gnu/libxml2.so.2 (0x00007f51566b8000)
	libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f5156626000)
	libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f515633d000)
	libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f51562b8000)
	libsodium.so.23 => /usr/lib/x86_64-linux-gnu/libsodium.so.23 (0x00007f5156261000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f51560a0000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f515607d000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f51570ea000)
	libicui18n.so.63 => /usr/lib/x86_64-linux-gnu/libicui18n.so.63 (0x00007f5155da2000)
	libicuuc.so.63 => /usr/lib/x86_64-linux-gnu/libicuuc.so.63 (0x00007f5155bd3000)
	libicudata.so.63 => /usr/lib/x86_64-linux-gnu/libicudata.so.63 (0x00007f51541e3000)
	liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f51541bb000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5154035000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f515401b000)

まとめ

何もしてないのに壊れたってあるんだなぁ

他のベースイメージの軽量化も進んでおり、Alpineが軽量イメージの定番というのは違うのかなと言う気がしています。
安直にAlpineに走らず、最初は言語の標準イメージを使って見るなどしてみるといいと思います。
※Debian Slim等の軽量化されてイメージがそこそこあるので安易にApineを採用せず他のDockerイメージと比較検討したほうがいいかもしれません。

  • Alpineで採用されているmuslにはglibcと比較した際に互換性上の問題があることがある
  • muslを採用したイメージを使った際には思わぬパフォーマンス劣化に遭遇することがあるので、該当しないかどうかよく確認した方が良い
  • glibcを後から入れる手もあるが、それなら言語の標準イメージなどDebian Slimをベースに作られてるイメージを使った方が合理的と思われる
  • 開発前にデリメリをよく把握した上で選定しよう

参考文献

8
3
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
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?