web-dev-qa-db-ja.com

Dockerのディレクトリとしてマウントされた単一ファイルボリューム

Docker documentation は、単一のファイルをDockerコンテナーにマウントできることを示しています。

-vフラグを使用して、ホストマシンからディレクトリだけでなく単一のファイルをマウントすることもできます。

$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

これにより、新しいコンテナのbashシェルにドロップされます。ホストからbash履歴を取得し、コンテナを終了すると、ホストはコンテナ内で入力されたコマンドの履歴を保持します。

しかし、それを試してみると、ファイルはディレクトリとしてマウントされます:

tom@u ~/project $ docker run --rm -it -v file.json:/file.json test
total 80K
drwxr-xr-x  9 root root 4.0K Dec  7 12:58 .
drwxr-xr-x 63 root root 4.0K Dec  7 12:58 ..
drwxr-xr-x  2 root root 4.0K Dec  4 16:10 file.json

私のDockerfileは次のようになります。

FROM ubuntu:14.04
MAINTAINER Tom
CMD ["ls", "-lah", "/test"]

Dockerバージョンは1.9.1、ビルドa34a1d5です。

これはドキュメンテーションの問題ですか、私の側の誤解ですか、それとも他に何かが起こっていますか?

44
TTT

testは、docker build -t testフォルダーではなく、 '/test'で作成した画像の名前です。

Dockerfileを試してください:

CMD ["ls", "-lah", "/"]
or
CMD ["cat", "/file.json"]

そして:

docker run --rm -it -v $(pwd)/file.json:/file.json test

完全な絶対パスでファイルをマウントするには、$(pwd)の使用に注意してください(相対パスはサポートされていません)

34
VonC

たぶんそれは上記の答えで明らかです...しかし、私の場合それを理解するのに時間がかかりました。

-vで共有されているファイルがファイルではなくディレクトリとして表示される原因は、Dockerがホスト上でファイルを見つけられなかったためです。そのため、Dockerはユーザーが将来作成されるボリューム/ディレクトリを共有したいだけであると考えるので、Dockerはホスト上に存在しないファイルの名前をコンテナに新しいディレクトリを作成します。

したがって、上記で報告された問題で、-vコマンドで相対ディレクトリを使用し、dockerが相対ディレクトリを理解しない場合、つまり、ホストでファイルが見つからなかったため、dockerがディレクトリを作成したことを意味します。そして、$(pwd)を使用することを示唆する上記の答えは、問題が相対ディレクトリに起因する場合の正しい解決策になります。

しかし、相対ディレクトリを使用しておらず、同じ問題を抱えているこのページを読んでいる人のために...そして、ファイルがホスト上にない理由を理解してみてください。

バカなタイプミスかもしれません...

別のホストでdockerコンテナを生成するクライアントから「docker run」コマンドを実行していて、共有されているファイルがその異なるホストに存在しない可能性があります。 -vで共有されるファイルは、Dockerエージェントがコンテナを生成するホスト上に存在する必要があります...必ずしも「docker run -v ...」コマンドが実行されるクライアント上ではありません(ただし、多くの場合)。

MacおよびWindowsについては、上記の他の可能な説明があります...それも可能性があります。

ホストから欠落しているファイルが問題です...セットアップでの問題のトラブルシューティング... $(pwd)を使用することは解決策かもしれませんが、常にではありません。

47
Nikopol

私は、Windows上でdockerを実行することでこの問題と少し戦い、診断しました。これは、Mac OSXを実行しているユーザーにも影響する可能性があるため、検索でこの場所に移動したときにこれらの環境で問題が発生している可能性のあるユーザーに回答を追加し、Dockerで何が起こっているかの説明を追加します。

WindowsまたはMac OSXでは、Dockerは実際にboot2docker VMで実行されており、デフォルトではユーザーディレクトリのみが実際に共有されます。 Windowsでは、このユーザーディレクトリは/ c/Users /として共有されますが、Docker Machineに同梱されているMinGWシェルでは、ドライブに/ Cまたは/ cとしてアクセスできるため、dockerコマンドが実際にboot2docker VMに対して実行され、ファイルパスはboot2docker VM上に存在し、そこに存在する方法で指定されている必要があります。ディレクトリまたはファイルが存在しないという警告またはエラーを出すと、dockerは指定されたソースをboot2docker VMのディレクトリとしてサイレントに作成します。そのため、間違ったことを行っていることを示す出力はありません。

したがって、上記の答えのように、ファイルがディレクトリとしてマウントされている場合は、絶対パスを指定していることを確認してください。 WindowsおよびMac OSXの場合、マウントする絶対パスがboot2docker VMに存在することを確認してください。

20
JDL

Docker内でdockerを実行する場合(たとえば、/var/run/docker.sockをマウントする場合)、docker内でマウントする場合、使用されるファイルパスは常にホスト上のものであることに注意する必要があります。

ホストで次のマウントを行う場合:

-v /tmp/foobar.txt:/my/path/foobar.txt

not docker内で次のマウントを実行する必要があります。

-v /my/path/foobar.txt:/my/other/path.txt

ただし、代わりにホストファイルパスを使用します。例:

-v /tmp/foobar:txt:/my/other/path.txt
2
edi9999

VirtualBoxマシンを使用するユーザー向けの簡単なソリューションがあります。デフォルトでは、C:/ Userフォルダーが追加されます。プロジェクトがC:/ projectsにある場合は、このフォルダーを追加して、VB(自動マウント付き)で使用できるようにします。

1
starski