本記事は OpenAI ChatGPT を活用して構成・執筆されています.
免責事項
本記事は筆者の実体験に基づいて作成した技術的検討メモである.
使用している OS, WSL, Docker Desktop のバージョンや構成により挙動が異なる可能性がある.
本記事を参考にして発生したいかなる損害・トラブルに対しても, 筆者は一切の責任を負わない.
各自の責任において適用されたい.
アブストラクト
WSL2 環境において, Docker コンテナからネットワークドライブ上のディレクトリをマウントしたところ, ls
で total 0
と表示され, ファイルにアクセスできない問題が発生した.
本稿ではその原因が, ネットワークドライブをマウントする前に docker run -v
を実行したことによって, WSL 側に空のディレクトリが生成されてしまった点にあることを明らかにし, Docker コンテナからのファイルアクセスを正常化するための具体的な解決手順と再発防止策を提示する.
対象読者
- WSL2 上でネットワークドライブを活用している技術者
- Docker と WSL を組み合わせたデータ処理環境を構築している者
- Docker コンテナでマウントしたはずのフォルダにファイルが見えない問題に遭遇している者
内容
1. 問題の発生状況
WSL2 上で, Windows 側のネットワークドライブ V: を /mnt/v
にマウントし, その配下の KITTI
ディレクトリを Docker コンテナにマウントしようとした.
docker run -v /mnt/v/KITTI:/dataset/KITTI ...
このとき, コンテナ内で /dataset/KITTI
を ls
しても total 0
と表示され, ファイルにアクセスできなかった.
一見するとファイルが存在していないように見えるが, 実際には Windows 側では問題なくファイルが存在していることを確認していた.
補足として, ホスト側(WSL)から /mnt/v/KITTI
を ls
した場合も total 0
が表示されるが, ファイル名自体は見えるという不整合な状態となっていた.
2. 原因
原因は, ネットワークドライブ V: を /mnt/v
にマウントする前に, 上記の docker run -v
コマンドを実行してしまったことである.
このコマンドの実行により, WSL 上に /mnt/v/KITTI
という空のディレクトリが作成された.
その状態でネットワークドライブ V: を /mnt/v
にマウントすると, 既に存在していた空のディレクトリ /mnt/v/KITTI
が干渉し, ファイルシステムの不整合が生じた.
特に注意すべきは, ネットワークドライブのマウント操作自体ではエラーが発生しない点である.
mount -t drvfs V: /mnt/v
は正常に完了し, 表面的には /mnt/v
が正しくマウントされているように見える.
しかし内部的には /mnt/v/KITTI
が既に存在する空のディレクトリと競合しており, Docker コンテナからのファイルアクセスができなくなっていた.
3. 解決方法
以下の手順により, Docker コンテナからのマウント不整合を解消することができた.
-
ネットワークドライブ V: が既に
/mnt/v
にマウントされている場合は, 先にアンマウントする.sudo umount /mnt/v
-
/mnt/v
の中身を削除する.sudo rm -rf /mnt/v/KITTI
これはマウント前に自動生成されていた空のディレクトリであり, ネットワークドライブ上の実体と競合する原因となっていた.
-
改めてネットワークドライブ V: を
/mnt/v
にマウントする.sudo mount -t drvfs V: /mnt/v
-
Docker コンテナを実行し, 正しくマウントされたことを確認する.
docker run -v /mnt/v/KITTI:/dataset/KITTI ...
この操作により, /mnt/v/KITTI
は空のディレクトリではなく, ネットワークドライブ上の実体として認識されるようになり, Docker コンテナからもファイルが正しく認識されるようになった.
4. 再発防止策
以下に再発防止のための要点を列挙する.
- WSL の
/mnt/<ドライブレター>/*
以下に対して, マウント前に手動でディレクトリを作成しないこと. - ネットワークドライブは, 必要なすべての Docker 操作よりも前にマウントしておくこと.
docker run -v /mnt/...
を行う際には, ホスト側ディレクトリが実体として存在しており, 内容が確認できることを事前に検証すること.
今後の展望:マウント処理の安定化に向けて
本問題は, 操作順序の不整合に起因しており, 特に「ネットワークドライブのマウントが先」であるべきという点が重要であった.
今後の運用を安定させる上では, マウント操作のタイミングを確実に管理できる仕組みの導入が有効と考えられる.
たとえば, 起動時にマウント状態を確認して未マウントであれば通知や自動処理を行うような手段について, 今後調査・検討する価値がある.
確実な再現性と信頼性を担保するための構成については, 引き続き検討を進めたい.
まとめ
Docker コンテナにおいて, WSL2 経由でマウントしたネットワークドライブのディレクトリが total 0
と表示され, ファイルにアクセスできないという問題は, WSL 側に事前に生成された空のディレクトリとの競合によって引き起こされることがある.
このような問題は, Docker 側でファイルが正しく見えていないにもかかわらず, ホスト側では部分的に見えるという状況のため発見が遅れがちである.
解決のためには, 不要な空のディレクトリを削除し, マウントの順序と状態を明確に管理することが重要である.
本稿で示した手順を参考に, Docker コンテナからの安定したファイルアクセスを確保していただきたい.