Docker ホストとコンテナ間でファイル共有できないときの対処

  • URLをコピーしました!
目次

はじめに

Docker ではホストとコンテナの間でファイルを共有するために ボリュームマウントバインドマウント を利用します。
しかし、設定や権限の問題で「ファイルが見えない」「書き込みできない」などのトラブルが起こりがちです。

本記事では、確認手順ごとに 正常例/異常例/それに対応する解決方法 をセットで解説します。

主な原因

  • マウント指定の誤り(-v--mount の書き方違い)
  • ホスト側ディレクトリ未作成
  • 権限不足(UID/GID の不一致、root 権限必要)
  • SELinux/AppArmor による制御
  • read-only オプションの影響

確認と解決の手順

1. コンテナにマウントされているか確認

docker inspect コンテナ名 | grep Mounts -A 5
  • 正常例
"Mounts": [
  {
    "Type": "bind",
    "Source": "/home/user/share",
    "Destination": "/data"
  }
]

👉 SourceDestination が表示されていれば OK。

  • 異常例
"Mounts": []

👉 マウントされていない。

解決方法
マウント指定を修正:

docker run -v /home/user/share:/data myimage
# または
docker run --mount type=bind,source=/home/user/share,target=/data myimage

2. ホスト側ディレクトリの存在確認

ls -ld /home/user/share
  • 正常例
drwxr-xr-x  2 user user 4096 Sep 27 10:00 /home/user/share

👉 ディレクトリが存在し、権限も付与されている。

  • 異常例
ls: cannot access '/home/user/share': No such file or directory

👉 ディレクトリが存在しない。

解決方法
ホスト側に作成:

mkdir -p /home/user/share
chmod 755 /home/user/share

3. コンテナ内でのマウント状況確認

docker exec -it コンテナ名 ls -ld /data
  • 正常例
drwxr-xr-x  2 user user 4096 Sep 27 10:00 /data

👉 ホストの /home/user/share と一致。

  • 異常例
drwxr-xr-x  2 root root 4096 Sep 27 10:05 /data

👉 空のディレクトリが生成されている。

解決方法

  • パスの誤りがないか確認→ 1.コンテナにマウントされているか確認へ
  • ホスト側未作成の場合→ 2.ホスト側ディレクトリの存在確認へ

4. 書き込みテスト

docker exec -it コンテナ名 touch /data/test.txt
  • 成功例
# ホストで確認
ls /home/user/share/test.txt
test.txt

👉 双方向で共有できている。

  • 失敗例
touch: cannot touch '/data/test.txt': Permission denied

👉 権限またはセキュリティ設定が原因。

解決方法

  • UID/GID を合わせる
sudo chown -R 1000:1000 /home/user/share
  • SELinux 有効環境ではオプションを追加
docker run -v /home/user/share:/data:Z myimage
  • read-only 指定されていないか確認(:rw を付与)

再発防止のポイント

  • docker inspect でマウント状況を必ず確認する
  • ホスト側ディレクトリは事前に作成する
  • コンテナ内ユーザーとホストの UID/GID を揃える
  • SELinux/AppArmor の影響を理解して :z / :Z を適切に利用する

まとめ

  • 「どこで問題が起きているか」 を順番に切り分けるのが重要
  • docker inspectls -ldexec lstouch の流れで確認すると効率的
  • 出力が異常だった場合、本文中の対応策を選んで修正すればほとんどのケースで解決できる
目次