ディレクトリをファイルにマウントしようとしていますか(またはその逆)?


97

バージョンがバージョンのDockerを持ってい17.06.0-ceます。コマンドでdockerを使用してNGINXをインストールしようとすると:

docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest

それはそれを示しています

docker:デーモンからのエラー応答:ociランタイムエラー:container_linux.go:262:コンテナプロセスの開始により "process_linux.go:339:コンテナの初期化により\" rootfs_linux.go:57:マウント\ \ "/ appdata / nginx / conf / nginx.conf \\ "からrootfs \" / var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\ "at \\" / var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18fc8b574 \\ "原因\\"ディレクトリではありません\\ "\" ":ディレクトリをファイルにマウントしようとしていますか(またはその逆)?指定されたホストパスが存在し、予期されるタイプであるかどうかを確認してください。

nginx.confファイルをマウントしない場合は、すべて問題ありません。では、どうすれば設定ファイルをマウントできますか?


の出力はls -al .何ですか?あなたのpwdがどのように見えるかを見たいです。
Tri Nguyen

1
私の場合、誤ってディレクトリをホストからコンテナ内のファイルにマップしていました。コンテナの再起動は機能しなくなりました。コンテナ(docker rm …)を削除してから再作成する必要がありました。
slhck

回答:


27

dockerはファイルとしてではなく$PWD/conf/nginx.confフォルダーとして認識します。かどうかをチェックし$PWD/conf/たディレクトリが含まれているnginx.confとしてディレクトリ

でテストする

> cat $PWD/conf/nginx.conf 
cat: nginx.conf/: Is a directory

それ以外の場合は、Dockerの問題を開きます。
同じ構成で問題なく動作しています。


中級レベルのLinuxユーザーとして、私は興味がありますが、Linuxがそれをファイルではなくフォルダーとして認識する理由は何ですか?
J.スコットElblein

それは実際にはフォルダだからです。ファイルが存在しない場合、ボリューム引数のために-v
dockerが

わかりました。Linuxは、パスが以前に存在しなかったためにdockerが作成する必要がある場合にのみ、フォルダーとして認識します。しかしnginx.conf、そのパスに以前に存在していた場合、Linuxはそれをファイルとして認識しますよね?
J.スコットElblein

139

これは(v2.2.0.0以降)発生しないはずです。ここを参照してください


Docker for Windowsを使用している場合、最近パスワードを変更したときにこのエラーが発生する可能性があります。

直し方:

  1. まず、壊れたコンテナのボリュームを必ず削除してください。
    docker rm -v <container_name>
    更新:以下の手順は、最初にボリュームを削除しなくても機能する場合があります。
  2. Docker設定を開きます
  3. [共有ドライブ]タブに移動します
  4. ウィンドウの下部にある[資格情報をリセット...]リンクをクリックします
  5. 使用するドライブをDockerで再共有する
  • ユーザー名/パスワードの入力を求められるはずです
  1. 「適用」をクリックします
  2. [リセット]タブに移動します
  3. 「Dockerの再起動」をクリックします
  4. コンテナ/ボリュームを再作成します

解決策については、GitHubのBaranOrnarliにクレジットが割り当てられます。


2
ありがとう!それは私にとって2番目のステップから始めて最後のステップを避けて機能します。
Mateo Hermosilla 2018

1
手順2から始めて、最後の手順を省略することで、問題を修正することができました。再度マウントするためにコンテナー/ボリュームを破棄する必要はありませんでした。
クリスチャンエンゲル2018

@MateoHermosillaに同意します。コンテナを検出する必要はなく、「資格情報のリセット」のみです
sintetico82 2018

sandbox-proxy(hadoop)のインストール中にproxy-deploy.shを実行しようとすると、同じエラーが発生します。このソルンに続いて。それを修正しませんでした。
Vaibhav 2018

2
これが私にとっての問題でした。パスワードのリセットは数か月ごとなので、Dockerで共有ドライブの資格情報をリセットするのを忘れ続けています。
AndersTornblad19年

44

TL; DR:コンテナに関連付けられているボリュームを削除します。

を使用してコンテナ名を検索し、次を使用しdocker ps -aてそのコンテナを削除します。

docker rm -v <container_name>

問題:

直面しているエラーはdocker runファイルがホストディレクトリにあるはずの場所にファイルが存在しないときに以前にコマンドを実行しようとした場合に発生する可能性があります

この場合、dockerデーモンはその場所のコンテナ内にディレクトリを作成しますが、正しいファイルがホストディレクトリに配置され、dockerコマンドが再度実行されると、後で適切なファイルにマップできません。

解決:

コンテナに関連付けられているボリュームを削除します。他のコンテナボリュームを気にしない場合は、次を使用することもできます。

docker volume rm $(docker volume ls -q)

元の質問のコマンドには、使用されているホストボリュームのみがリストされていました。docker volumeコマンド/インターフェースは、匿名と元の質問の一部ではないという名前のボリュームです。
Programmerq

@programmerqエラーを見てください。私の推測でマウントしようとしたときにマウントが失敗したと/var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"表示されます。前回の実行のためにすでにフォルダーがあるため、ファイルをそのフォルダーにマップしようとすると失敗します。
アユシャ2017

ここでは、ホストに問題があるか、作成済みのボリュームに問題があるかの2つの問題が発生している可能性があります。ホストが正しいと仮定すると、既存のボリュームの問題を解決する方がよいと思いました。
アユシャ2017

1
これは、コンテナがすでにボリュームに関連付けられており、そのボリュームのタイプが次の実行で変更される場合の実際の有効な回答です。したがって、ボリュームを削除すると役立つ場合があります。
Yan Foto 2017

1
これは役に立ちました。私の場合の問題は、確かに古いコンテナがまだ定義されていることでした。docker rmを使用してそれらをザッピングしてから、docker-composeupを実行すると正しく機能しました。
Max Tardiveau 2018年

7

使用している人々のための答えドッカーツールボックスを

ここで問題に触れている少なくとも3つの答えがありますが、それを適切に説明しておらず、完全な解決策を提供していません。これは単なるフォルダマウントの問題です。

問題の説明:

Docker Toolboxは、仮想マシン(VirtualBoxにバンドルされています)を作成することにより、DockerのHyper-V要件をバイパスします。DockerはVM内にインストールされ、実行されます。Dockerが正しく機能するためには、ホストマシンからにアクセスできる必要があります。ここではそうではありません。

Docker Toolboxをインストールした後、VirtualBox VMを作成しC:\Users、としてマシンにのみマウントしました\c\Users\。私のプロジェクトはC:\projects、マウントされたボリュームのどこにもありませんでした。パスをVMに送信していたとき、C:\projectsマウントされていないため、パスは存在しませんでした。したがって、上記のエラー。

私のプロジェクトにngnix構成が含まれているとしましょう C:/projects/project_name/

それを修正する:

  1. VirtualBoxに移動し、[デフォルト](DockerのVM)> [設定]> [共有フォルダー]を右クリックします。 ここに画像の説明を入力してください

  2. 右側にプラス記号が付いた小さなアイコンをクリックして、新しい共有を追加します。次の設定を使用しました。

ここに画像の説明を入力してください

  1. 上記はVMの()にマップさC:\projectsれます。つまり、次のようなプロジェクトで任意のパスを参照できるようになります。- fromがマウントされたため。/projectsROOT/projects/projects/project_nameproject_nameC:\projects\project_name

相対パスを使用するには、パスに名前を付けc/projectsないことを検討してくださいprojects

  1. すべてを再起動すると、正しく機能するはずです。VirtualBoxで仮想マシンを手動で停止し、Docker ToolboxCLIを再起動しました。

私のdockerファイルでは、次のように参照していnginx.confます。

volumes:
    - /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf

nginx.confが実際に存在する場所 C:\projects\project_name\docker_config\nginx\nginx.conf


7

@Ayushyaによる説明は、私がこのやや紛らわしいエラーメッセージを表示した理由であり、必要なハウスキーピングは次のように簡単に実行できます。

$ docker container prune
$ docker volume prune

6

私も同じ問題を抱えていました。私はWindows1017.09でWSLでDockerデスクトップを使用していました。

問題の原因:

問題は、Docker for Windowsが、これに一致する形式でボリュームパスを提供することを想定していることです。

/c/Users/username/app

ただし、WSLは代わりに次の形式を使用します。

/mnt/c/Users/username/app

コンソールでファイルをチェックしたときにそれを見たので、これは混乱を招きます。私にとってはすべてが正しかったのです。ボリュームパスに関するDockerforWindowsの期待を認識していませんでした。

問題の解決策:

カスタムマウントポイントをバインドして、Docker forWindowsとWSLの違いを修正しました。

sudo mount --bind /mnt/c /c

このすばらしいガイドで提案されているように、Docker for WindowsとWSLを問題なく動作するように設定すると、すべてが完全に機能するようになります。

WSLを使い始める前は、Git Bashを使用していましたが、この問題も発生していました。



4

Docker ToolBox forWindowsを使用しています。デフォルトでは、Cドライブは自動的にマウントされるため、ファイルをマウントするには、ファイルとフォルダーがCドライブ内にあることを確認してください。

例: C:\Users\%USERNAME%\Desktop


1
私のマウントされたフォルダはC:\ x-suite \です。Cドライブを共有しましたが、まだ問題は解決していません
袁文涛

Docker ToolBoxを使用していますか?
AbhishekDK19年

minikube + virtualBox + docker ToolBox、localkubeは非推奨になりました。どのドライバーを使用すればよいですか?
袁文涛

Dockercomposeからマウントする場合は、$ {pwd} / <path>を使用します
AbhishekDK19年

1
Dockerfileで実行している場合は、VOLUME / c / x-suite
AbhishekDK19年

3

多分誰かがこれが役に立つと思うでしょう。私の作成ファイルには次のボリュームがマウントされていました

./file:/dir/file

./fileが存在しなかったため、ABCにマウントされました(デフォルトではフォルダーとして)。

私の場合、私はコンテナを持っていました

docker commit ABC cool_image

後で./fileを作成して実行するとdocker-compose up、次のエラーが発生しました。

[...]ディレクトリをファイルにマウントしようとしていますか(またはその逆)?指定されたホストパスが存在し、予期されるタイプであるかどうかを確認してください。

cool_image記憶から持ち上がったコンテナ/dir/fileはディレクトリであり、最近作成およびマウントされたものと競合していました./file

解決策は次のとおりです。

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image

非常に複雑なDockerセットアップがあるため、これも私の問題でした。
rmcsharry

1

Windows 10では、docker-compose.ymlファイルやDocker構成全般を変更せずに、このエラーが発生します。

私の場合、ポート445をブロックするファイアウォールポリシーを備えたVPNを使用していました。

VPNから切断すると、問題は解消されます。

そのため、Dockerデスクトップを実行するときは、ファイアウォールを確認し、プロキシやVPNを使用しないことをお勧めします。

詳細については、Docker for Windows-共有ドライブのファイアウォールルールを確認してください。

これが他の誰かの助けになることを願っています。


1

代わりに絶対パス/完全パスを使用していただけます$PWD/conf/nginx.confか?その後、それは動作します。

EX:docker run --name nginx-container5 --rm  -v /home/sree/html/nginx.conf:/etc/nginx/nginx.conf -d -p 90:80 nginx
b9ead15988a93bf8593c013b6c27294d38a2a40f4ac75b1c1ee362de4723765b

root@sree-VirtualBox:/home/sree/html# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b9ead15988a9        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:90->80/tcp   nginx-container5
e2b195a691a4        nginx               "/bin/bash"              16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   test-nginx

二重引用符でエスケープした場合:docker run -d --rm -v "$ PWD / nginx.conf:/etc/nginx/nginx.conf" nginxシェルが渡す前に変換するため、違いはありません。 docker runを実行しても、実際には、少なくとも私にとっては違いはありません
Manumie 2010年

1

このコマンドラインでWindows10のWSL1を介してDockerを使用すると、同じ問題が発生しました。

echo $PWD
/mnt/d/nginx

docker run --name nginx -d \
  -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

ホストシステム上のファイルのパスをUNIXスタイルの絶対パスに変更することで解決しました。

docker run --name nginx -d \
  -v /d/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

または、パス区切り文字としてでは/なく、Windowsスタイルの絶対パスを使用します\

docker run --name nginx -d \
  -v D:/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

WindowsスタイルのパスとUnixスタイルのパスを使用した場合のパフォーマンスの違いに気づきましたか?
J.スコットElblein

わからない。テスト/開発にDockerfor Windowsを使用しているだけで、パフォーマンスを監視したことはありません。
bwibo

0

Virtual Boxを6.0.10に更新すると、DockerToolboxのこの問題が修正されました

https://github.com/docker/toolbox/issues/844

私はこの種のエラーを経験していました:


mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ touch resolv.conf

mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv.conf ubuntu /bin/bash
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/c/Users/mlepisto/G/Projects/resolv.conf\\\" to rootfs \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged\\\" at \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged/etc/resolv.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

# mounting to some other file name inside the container did work just fine
mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects/
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv2.conf ubuntu /bin/bash
root@a5020b4d6cc2:/# exit
exit

VitualBoxを更新した後、すべてのコマンドは問題なく機能しました🎉


0

ローカルにファイルがなかったため、同じヘッドスクラッチがあり、フォルダーとして作成されました。

mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile
mimas@Anttis-MBP:~/random/dockerize/tube$ docker run --rm -v $(pwd)/logs.txt:/usr/app/logs.txt devopsdockeruh/first_volume_exercise
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/mimas/random/dockerize/tube/logs.txt\\\" to rootfs \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged\\\" at \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged/usr/app/logs.txt\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile  logs.txt/

0

不明:ディレクトリをファイルにマウントしようとしていますか(またはその逆)?指定されたホストパスが存在し、予期されるタイプであるかどうかを確認してください

Mac環境のniginxでも同様のエラーが発生しました。Dockerはdefault.confファイルを正しく認識しませんでした。相対パスを絶対パスに変更すると、エラーが修正されました。

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

0

私にとって、これはうまくいきませんでした:

volumes:
  - ./:/var/www/html
  - ./nginx.conf:/etc/nginx/conf.d/site.conf

しかし、これは正常に機能します(明らかに、構成ファイルも新しいディレクトリ内に移動しました:

volumes:
  - ./:/var/www/html
  - ./nginx/nginx.conf:/etc/nginx/conf.d/site.conf

0

これは将来誰かのために多くの時間を節約するかもしれないので、私はここで私のケースを共有します。

Gitlab CIでdocker-in-dockerを使い始めるまで、macosで完全に機能するdocker-composeを使用していました。リポジトリでマスターとして機能する権限のみが付与され、Gitlab CIは自己ホストされ、他の誰かによってセットアップされ、セットアップ方法などに関する他の情報は共有されませんでした。

次の原因で問題が発生しました。

volumes:
  - ./.docker/nginx/wordpress/wordpress.conf:/etc/nginx/conf.d/default.conf

これがウィンドウの下で実行されている可能性があることに気付いたとき(頭をかきむしる時間)にのみ、wodpress.confの名前をdefault.confに変更して、dirパス名を設定してみました。

volumes:
  - ./.docker/nginx/wordpress:/etc/nginx/conf.d

これで問題は解決しました!


0

dockerfileが別のドライブにあったため、Windows7でこの問題が発生しました。

問題を解決するために私がしたことは次のとおりです。

  1. VirtualBoxManagerを開く
  2. 「デフォルト」コンテナを選択し、設定を編集します。
  3. 共有フォルダを選択し、アイコンをクリックして新しい共有フォルダを追加します
  4. フォルダパス:x:\
  5. フォルダー名:/ x
  6. 自動マウントをチェックして永続的にする
  7. 仮想マシンを再起動します

この時点で、動作するdocker-compose upはずです。


0

Dockerのアップデート後、Windows10で同じエラーが発生しました:2.3.0.2(45183)。

...原因\\\"not a directory\\\"\"":不明:ディレクトリをファイルにマウントしようとしていますか(またはその逆)?指定されたホストパスが存在し、予期されるタイプであるかどうかを確認してください

私はこのような絶対パスを使用//C/workspace/nginx/nginx.confしていましたが、すべてが魅力のように機能しました。
更新によってdocker-composeが壊れ、ルートのパスを/C/workspace/nginx/nginx.conf1つに変更する必要があり/ました。


0

この状況は、Docker設定の[リソース]> [ファイル共有]セクションに追加されていないホストからボリュームをマウントしようとした場合にも発生することに注意してください。

ここに画像の説明を入力してください

ルートパスをファイル共有リソースとして追加すると、Dockerがリソースにアクセスしてコンテナにマウントできるようになります。ボリュームの再マウントを試みるには、Dockerコンテナの内容を消去する必要がある場合があることに注意してください。

たとえば、アプリケーションがにある場合、ファイル共有リソースの場所として/mysites/myapp追加/mysitesする必要があります。


0

同じ問題が発生しました。docker-composeはファイルではなくディレクトリを作成し、途中でクラッシュしていました。

私がしたこと:

  1. マッピングなしでコンテナを実行します。

  2. .confファイルをホストの場所にコピーします。

    docker cp containername:/etc/nginx/nginx.conf ./nginx.conf

  3. コンテナを削除します(docker-compose down)。

  4. マッピングを元に戻します。

  5. コンテナを再マウントします。

Docker Composeは、ディレクトリ作成しようとする代わりに、.confファイルを見つけてマップます


0

私の場合、Docker for Windowsの問題であり、Bitlockerで暗号化されたパーティションを使用していました。再起動してドライブのロックを解除した後、暗号化されたファイルにプロジェクトファイルがある場合、Dokcerはプロジェクトファイルを正しく認識しません。

あなたがする必要があるのはただDockerを再起動する必要があるだけです


-2

lマウントの問題を解決しました。Win 7環境を使用していますが、同じ問題が発生しました。

ディレクトリをファイルにマウントしようとしていますか?

コンテナのデフォルトの同期ディレクトリはC:\Users\にあるので、プロジェクトをに移動してからC:\Users\、プロジェクトを再作成しました。今では動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.