Edited at

alpine linux+Dockerでmysqlを使用したアプリを作る際に気をつけたいこと

More than 3 years have passed since last update.


概要

alpine linuxでDockerコンテナを作るとなると大抵は「できるだけ容量を小さくしたい」という考えがあると思います。

大抵のアプリではデータベースを使うと思うので、mysqlの開発ライブラリを入れた上でそれぞれの言語用の接続ライブラリを作ると思います。alpine linuxでのmysqlライブラリはmariadb-devですがこいつが異様にfatです。

https://pkgs.alpinelinux.org/package/main/x86_64/mariadb-dev

接続ライブラリだけなはずなのになんでこんなに重いんだと思ったので。


結論

alpine linuxのmariadb-devはserverごと入るのでデカイ。Dockerコンテナを作る時でmariadb-devを使う際はサーバのライブラリと実行ファイルは要らないのでDockerfilerm /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

半分以下!!