Docker for Macのファイル共有がめちゃくちゃ遅い

ホストと共有したディレクトリでcrosstool-ngのビルドなど行ってみると信じられないほど時間がかかったので簡単に検証してみる。

検証方法

10000個のファイルの作成・削除にかかる時間を、コンテナ内ディレクトリと共有ディレクトリについて計測する。 ファイル作成用のスクリプトは以下:

root@e42095502d60:/# cat /usr/bin/mkfiles
#!/bin/bash
mkdir tmp
for i in $(seq $1); do
  echo $i >>tmp/$i.txt
done

結果

まずコンテナ内ディレクト

root@e42095502d60:~# pwd
/root
root@e42095502d60:~# time mkfiles 10000

real    0m0.297s
user    0m0.070s
sys     0m0.220s
root@e42095502d60:~# time rm -r tmp

real    0m0.167s
user    0m0.000s
sys     0m0.160s

次に共有ディレクトリ(-v ${PWD}/synctest:/synctestでコンテナを起動している)

root@e42095502d60:/synctest# pwd
/synctest
root@e42095502d60:/synctest# time mkfiles 10000

real    0m15.094s
user    0m0.460s
sys     0m1.520s
root@e42095502d60:/synctest# time rm -r tmp

real    0m5.633s
user    0m0.030s
sys     0m0.330s

冗談かと思うくらい遅い。

結論

大量のファイルを扱う操作はコンテナ内で閉じるようにして、必要最小限のファイルだけ共有ディレクトリに置く。