63
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

コンテナ起動時、error while creating mount source path '/host_mnt/Users/~': mkdir /host_mnt/Users/~: file exists になったときの対処法

Last updated at Posted at 2020-11-03

現象

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のコンテナを構築していた。

docker-compose.yml
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-compose.yml
 - ./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の共有設定に何らかの問題がおこり、ホスト側のディレクトリ情報にアクセスができなかったのではないか、と思っているのですが、詳細はわかっておりません。

根本原因について知っている方、いらっしゃいましたら教えてください:qiitan-cry:

63
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?