概要
alpine linuxでDockerコンテナを作るとなると大抵は「できるだけ容量を小さくしたい」という考えがあると思います。
大抵のアプリではデータベースを使うと思うので、mysqlの開発ライブラリを入れた上でそれぞれの言語用の接続ライブラリを作ると思います。alpine linuxでのmysqlライブラリはmariadb-dev
ですがこいつが異様にfatです。
接続ライブラリだけなはずなのになんでこんなに重いんだと思ったので。
結論
alpine linuxのmariadb-dev
はserverごと入るのでデカイ。Dockerコンテナを作る時でmariadb-dev
を使う際はサーバのライブラリと実行ファイルは要らないのでDockerfile
にrm /usr/lib/mysqld*
とrm /usr/bin/mysql*
を追加する。
以下調査内容と削除前後のビフォーアフター。
犯人探し
適当にalpineのコンテナを作り、mysqlのdevパッケージだけ入れる。
docker run -dit alpine ash
apk add --update mariadb-dev
ディレクトリの容量を調査
/ # du -sh /
380.5M /
/ # du -sh /*
796.0K /bin
0 /dev
400.0K /etc
4.0K /home
3.5M /lib
0 /linuxrc
16.0K /media
4.0K /mnt
0 /proc
8.0K /root
4.0K /run
216.0K /sbin
0 /sys
4.0K /tmp
374.8M /usr
808.0K /var
/ # du -sh /usr/*
118.5M /usr/bin
12.0K /usr/data
6.6M /usr/include
234.4M /usr/lib
16.0K /usr/local
5.4M /usr/mysql-test
4.0K /usr/sbin
9.9M /usr/share
/ # ls -lah /usr/lib/
total 233036
drwxr-xr-x 6 root root 4.0K Mar 5 01:51 .
drwxr-xr-x 13 root root 4.0K Mar 5 01:51 ..
drwxr-xr-x 2 root root 4.0K Mar 5 01:50 engines
lrwxrwxrwx 1 root root 15 Mar 5 01:50 libaio.so.1 -> libaio.so.1.0.1
-rwxr-xr-x 1 root root 5.2K Oct 29 19:39 libaio.so.1.0.1
-rw-r--r-- 1 root root 4.1M Mar 1 16:17 libcrypto.a
lrwxrwxrwx 1 root root 18 Mar 5 01:50 libcrypto.so -> libcrypto.so.1.0.0
lrwxrwxrwx 1 root root 28 Mar 5 01:50 libcrypto.so.1.0.0 -> ../../lib/libcrypto.so.1.0.0
lrwxrwxrwx 1 root root 15 Mar 5 01:50 libformw.so.6 -> libformw.so.6.0
-rwxr-xr-x 1 root root 58.9K Dec 18 16:06 libformw.so.6.0
-rw-r--r-- 1 root root 73.8K Dec 16 10:40 libgcc_s.so.1
lrwxrwxrwx 1 root root 15 Mar 5 01:50 libmenuw.so.6 -> libmenuw.so.6.0
-rwxr-xr-x 1 root root 25.9K Dec 18 16:06 libmenuw.so.6.0
-rw-r--r-- 1 root root 10.6M Feb 10 09:16 libmysqlclient.a
lrwxrwxrwx 1 root root 20 Mar 5 01:51 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx 1 root root 24 Mar 5 01:50 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rwxr-xr-x 1 root root 3.2M Feb 10 09:18 libmysqlclient.so.18.0.0
lrwxrwxrwx 1 root root 16 Mar 5 01:51 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx 1 root root 17 Mar 5 01:50 libmysqlclient_r.so -> libmysqlclient.so
-rw-r--r-- 1 root root 194.0M Feb 10 09:18 libmysqld.a
lrwxrwxrwx 1 root root 15 Mar 5 01:51 libmysqld.so -> libmysqld.so.18
-rwxr-xr-x 1 root root 13.1M Feb 10 09:18 libmysqld.so.18
-rw-r--r-- 1 root root 38.0K Feb 10 09:14 libmysqlservices.a
lrwxrwxrwx 1 root root 18 Mar 5 01:50 libncursesw.so.6 -> libncursesw.so.6.0
-rwxr-xr-x 1 root root 338.5K Dec 18 16:06 libncursesw.so.6.0
lrwxrwxrwx 1 root root 16 Mar 5 01:50 libpanelw.so.6 -> libpanelw.so.6.0
-rwxr-xr-x 1 root root 13.5K Dec 18 16:06 libpanelw.so.6.0
-rw-r--r-- 1 root root 719.1K Mar 1 16:17 libssl.a
lrwxrwxrwx 1 root root 15 Mar 5 01:50 libssl.so -> libssl.so.1.0.0
lrwxrwxrwx 1 root root 25 Mar 5 01:50 libssl.so.1.0.0 -> ../../lib/libssl.so.1.0.0
lrwxrwxrwx 1 root root 19 Mar 5 01:50 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x 1 root root 1.3M Dec 16 10:40 libstdc++.so.6.0.21
drwxr-xr-x 3 root root 4.0K Mar 5 01:50 mysql
drwxr-xr-x 2 root root 4.0K Mar 5 01:50 pkgconfig
lrwxrwxrwx 1 root root 17 Mar 5 01:50 terminfo -> ../share/terminfo
そうか、devパッケージだからサーバ(mysqld)も入ってるのか。
接続のライブラリだけ欲しいから/usr/lib/mysqld*
は削除してよさそう。
ということは
/ # ls -lah /usr/bin/mysql*
-rwxr-xr-x 1 root root 13.1M Feb 10 09:18 /usr/bin/mysql_client_test_embedded
-rwxr-xr-x 1 root root 4.4K Feb 10 09:14 /usr/bin/mysql_config
-rwxr-xr-x 1 root root 4.1K Feb 10 09:14 /usr/bin/mysql_convert_table_format
-rwxr-xr-x 1 root root 13.1M Feb 10 09:18 /usr/bin/mysql_embedded
-rwxr-xr-x 1 root root 16.3K Feb 10 09:14 /usr/bin/mysql_install_db
-rwxr-xr-x 1 root root 3.0M Feb 10 09:18 /usr/bin/mysql_plugin
-rwxr-xr-x 1 root root 11.7K Feb 10 09:14 /usr/bin/mysql_secure_installation
-rwxr-xr-x 1 root root 17.1K Feb 10 09:14 /usr/bin/mysql_setpermission
-rwxr-xr-x 1 root root 3.0M Feb 10 09:18 /usr/bin/mysql_tzinfo_to_sql
-rwxr-xr-x 1 root root 3.1M Feb 10 09:18 /usr/bin/mysql_upgrade
-rwxr-xr-x 1 root root 3.8K Feb 10 09:14 /usr/bin/mysql_zap
-rwxr-xr-x 1 root root 3.2M Feb 10 09:18 /usr/bin/mysqlbinlog
-rwxr-xr-x 1 root root 13.6M Feb 10 09:18 /usr/bin/mysqld
-rwxr-xr-x 1 root root 24.2K Feb 10 09:14 /usr/bin/mysqld_multi
-rwxr-xr-x 1 root root 30.8K Feb 10 09:14 /usr/bin/mysqld_safe
-rwxr-xr-x 1 root root 34.1K Feb 10 09:14 /usr/bin/mysqlhotcopy
-rwxr-xr-x 1 root root 3.1M Feb 10 09:18 /usr/bin/mysqlslap
-rwxr-xr-x 1 root root 3.6M Feb 10 09:18 /usr/bin/mysqltest
-rwxr-xr-x 1 root root 13.0M Feb 10 09:18 /usr/bin/mysqltest_embedded
CLIを使わないので/usr/bin/mysql*
も削除してよいですね。
ビフォーアフター
下記はGomitterというクソアプリを普通にDocker化した時の容量
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
celeron1ghz/gomitter latest ba4aa7c1e2cb 32 minutes ago 492.7 MB
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
celeron1ghz/gomitter latest 703a02f09970 4 minutes ago 200 MB
半分以下!!