vagrant+VirtualBox上(Ubuntu)で、公式のmysqlイメージを使って、コンテナを立ててデータを永続化(ホストにマウント(data volume))したときのマイナートラブルです。
$ docker --version
Docker version 1.9.1, build a34a1d5
$ docker-compose --version
docker-compose version 1.5.2, build 7240ff3
TL;DR
Vagrant+VirtualBoxのVM上で動くDockerの話です。ホストでDocker動かしている場合は関係ないかもしれません。
docker-composeでMySQLのデータ永続化をホストにマウントして使うときは、vagrantユーザーをvboxsfグループに入れておく必要があります。
$ sudo gpasswd -a $USER vboxsf
そうしないと、Permissionの問題でエラーが起こることがあるようです。
IOError: [Errno 13] Permission denied: '/home/vagrant/Dev/data/mysql/auto.cnf'
MySQLコンテナのデータ永続化
ドキュメントに書いてあるのはDockerの起動コマンド
$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
これを、docker-composeのyamlに書き直すと下のようになります。
mysql:
restart: always
image: mysql
volumes:
- /my/own/datadir:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=my-secret-pw
これでマウントできるので起動して、マウントしたディレクトリをtreeコマンドで見てみると以下のようになります。
|-- datadir
| |-- auto.cnf
| |-- ib_buffer_pool
| |-- ibdata1
| |-- ib_logfile0
| |-- ib_logfile1
| |-- ibtmp1
| |-- mysql [error opening dir]
| |-- performance_schema [error opening dir]
| `-- sys [error opening dir]
「error opening dir」と不穏な空気です。
docker-compose buildするとエラー
この状態でdocker-compose.yml内にあるbuildが必要なコンテナをビルドするとエラーになります。
Traceback (most recent call last):
File "/usr/local/bin/docker-compose", line 9, in <module>
load_entry_point('docker-compose==1.5.2', 'console_scripts', 'docker-compose')()
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 54, in main
command.sys_dispatch()
File "/usr/local/lib/python2.7/dist-packages/compose/cli/docopt_command.py", line 23, in sys_dispatch
self.dispatch(sys.argv[1:], None)
File "/usr/local/lib/python2.7/dist-packages/compose/cli/docopt_command.py", line 26, in dispatch
self.perform_command(*self.parse(argv, global_options))
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 171, in perform_command
handler(project, command_options)
File "/usr/local/lib/python2.7/dist-packages/compose/cli/main.py", line 192, in build
force_rm=bool(options.get('--force-rm', False)))
File "/usr/local/lib/python2.7/dist-packages/compose/project.py", line 235, in build
service.build(no_cache, pull, force_rm)
File "/usr/local/lib/python2.7/dist-packages/compose/service.py", line 683, in build
dockerfile=self.options.get('dockerfile', None),
File "/usr/local/lib/python2.7/dist-packages/docker/api/build.py", line 49, in build
context = utils.tar(path, exclude=exclude, dockerfile=dockerfile)
File "/usr/local/lib/python2.7/dist-packages/docker/utils/utils.py", line 85, in tar
t.add(os.path.join(root, path), arcname=path, recursive=False)
File "/usr/lib/python2.7/tarfile.py", line 1994, in add
with bltn_open(name, "rb") as f:
IOError: [Errno 13] Permission denied: '/home/vagrant/Dev/data/mysql/auto.cnf'
やはりPermissionのエラーです。
ビルド以外の動作でも起こりそうですが確認してません。
マウントしたMySQLのディレクトリにアクセスできない
エラーメッセージからPermissionの問題だとわかったので、lsコマンドでdatadirの中を見てみます。
drwxrwxr-x 5 vboxadd vboxsf 4096 Jan 7 06:49 .
drwxrwxr-x 7 vagrant vagrant 4096 Jan 7 07:25 ..
-rw-r----- 1 vboxadd vboxsf 56 Jan 7 05:08 auto.cnf
-rw-r----- 1 vboxadd vboxsf 694 Jan 7 06:19 ib_buffer_pool
-rw-r----- 1 vboxadd vboxsf 50331648 Jan 7 06:49 ib_logfile0
-rw-r----- 1 vboxadd vboxsf 50331648 Jan 7 05:08 ib_logfile1
-rw-r----- 1 vboxadd vboxsf 79691776 Jan 7 06:49 ibdata1
-rw-r----- 1 vboxadd vboxsf 12582912 Jan 7 06:49 ibtmp1
drwxr-x--- 2 vboxadd vboxsf 4096 Jan 7 05:08 mysql
drwxr-x--- 2 vboxadd vboxsf 4096 Jan 7 05:08 performance_schema
drwxr-x--- 2 vboxadd vboxsf 12288 Jan 7 05:08 sys
vboxsfグループである必要がありそうだとわかりましたので、現行のユーザー(vagrant)をvboxsfグループに追加します。
$ sudo gpasswd -a $USER vboxsf
これで、中身も見えて、ビルドも通ります。
Vagrant+VirtualBox特有の問題な気がしますが、ホストで試した時もパーミッションの問題が起こった時はグループ足してあげれば治りそう。
Show comments