docker-composeでmysqlのデータ永続化したときのPermission Deniedの解決方法

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 Hub

ドキュメントに書いてあるのは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

Adsense

Share

  • このエントリーをはてなブックマークに追加

About

どこにでもいる平凡なプログラムを書く人間のログ。

Recently

Tags

Pages

-->