現象
volumesを設定しているコンテナ(MySQL用)を停止 → 起動したところ
https://qr.paypay.ne.jp/AwOmmPEnNHAhPrpK
$ docker-compose up -d
Creating volume "sample_db-store" with default driver
Creating sample_db_1 ... error
ERROR: for sample_db_1 Cannot start service db: error while creating mount source path '/host_mnt/Users/~/docker/mysql/sql': mkdir /host_mnt/Users/~/docker/mysql/sql: file exists
ERROR: Encountered errors while bringing up the project.
「ホストのディレクトリがマウントできない」という旨のエラーメッセージが表示され、コンテナが起動できない。
動作環境
解決方法
Docker Desktop for Windowsを使用している場合
Docker Desktop for Windows → [Settings] →[Shared Drives] → [Reset Credentials] → 再認証(該当パスにチェックを入れる)
[参考]
https://www.nuits.jp/entry/docker-for-windows-mkdir-file-exists
Docker Desktop for Macを使用している場合
Docker Desktop for Mac → [preferences...] →[Resources] →[File Sharing]
/Usersを消した後、[apply & Restart]
その後、/Usersを追加し、[apply & Restart]
解決までに試したこと
動作背景
docker-composeで、以下のようにMySQLのコンテナを構築していた。
version: '3'
services:
db:
image: mysql:8.0
volumes:
- db-store:/var/lib/mysql
- ./logs:/var/log/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/mysql/sql:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- TZ=${TZ}
ports:
- ${DB_PORT}:3306
volumes: db-store
volumesにはdata, log周りに関するものに加えて
- ./docker/mysql/sql:/docker-entrypoint-initdb.d
を定義している。
MySQL用イメージでは/docker-entrypoint-initdb.d
へマウントする際、指定したホスト側のディレクトリに存在する.sql
,.sh
ファイルを、コンテナ初回起動時に読み込んで実行してくれる。
https://hub.docker.com/_/mysql/
そのため、コンテナへマウントするホスト側のディレクトリ./docker/mysql/sql
に、テーブル作成用のSQLとSQL実行用のシェルスクリプトを置いていた。初回起動時は問題なく動作。挟んでおいたSQLとシェルスクリプトも問題なく走っていた。
しかし、一度コンテナをdocker-compose stop
で停止後、docker-compose up
で起動時に本現象が発生した。
試したこと①:ボリュームの削除
調べていると似たような挙動が、ボリュームの削除によって解決できるという情報を見つけたので、コンテナと名前付きボリュームを削除してみた。
$ docker-compose down --volumes
Removing sample_db_1 ... done
Removing volume sample_db-store
$ docker-compose up -d
失敗。
試したこと②:Docker Desktop for Mac の共有フォルダの認証情報更新(今回の解決法)
よく似たDocker Daemonのエラー
docker: Error response from daemon: error while creating mount source path '/host_mnt/c/tmp': mkdir /host_mnt/c: file exists.
が、Docker Desktop for Windowsを使用している場合に報告されていることがわかった。
しかしながら、Docker Desktop for Macで同様のエラーの発生報告されていることが見当たらなかった。
ダメ元で、Windowsと少しフローは異なるがDocker Desktop for Macで上記のエラーの解決法を真似てみたところ、動いた。
原因
おそらく、Docker DesktopのVolumesの共有設定に何らかの問題がおこり、ホスト側のディレクトリ情報にアクセスができなかったのではないか、と思っているのですが、詳細はわかっておりません。
根本原因について知っている方、いらっしゃいましたら教えてください