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


## 概要
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`を使う際はサーバのライブラリと実行ファイルは要らないので`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](https://github.com/celeron1ghz/Gomitter-Web)というクソアプリを普通に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
```

半分以下！！