DockerコンテナでWebアプリケーションを実行しています。このアプリケーションは、企業のファイルサーバー(Active Directoryドメインコントローラーを備えたWindows Server)上のいくつかのファイルにアクセスする必要があります。アクセスしようとしているファイルは、クライアント用に作成された画像ファイルであり、Webアプリケーションはそれらをクライアントのポートフォリオの一部として表示します。
開発マシンでは、_/etc/fstab
_のエントリを介して適切なフォルダーがマウントされ、_--volume
_引数を介してホストマウントポイントがDockerコンテナーにマウントされます。これは完全に機能します。
現在、別のサーバーで実行され、ホストにマウントされているCIFS共有に依存しない運用コンテナーを作成しようとしています。そこで、コンテナ内の_/etc/fstab
_ファイルに適切なエントリを追加し、_mount -a
_でマウントしようとしました。 mount error(13): Permission denied
を取得します。
オンラインで少し調べたところ、 Dockerセキュリティに関するこの記事 に導かれました。これを正しく読んでいると、Dockerがコンテナ内のファイルシステムをマウントする機能を明示的に拒否しているように見えます。共有を読み取り専用でマウントしようとしましたが、これも(当然のことながら)失敗しました。
したがって、2つの質問があります。
Dockerはコンテナ内でmount
の使用を禁止していることを理解していますか?
誰もこれを達成する別の方法を考えることができますかwithoutホストにCIFS共有をマウントし、Dockerコンテナにホストフォルダをマウントしますか?
はい、Dockerはセキュリティ対策としてコンテナ内にリモートボリュームをマウントすることを禁止しています。画像とそれらを実行する人を信頼する場合は、--privileged
フラグとdocker run
これらのセキュリティ対策を無効にします。
さらに、--cap-add
および--cap-drop
は、コンテナに実際に必要な機能のみを提供します。 (ドキュメントを参照)SYS_ADMIN
機能は、マウント特権を付与する機能です。
https://github.com/docker/docker/issues/22197
に応じて追加
--cap-add SYS_ADMIN --cap-add DAC_READ_SEARCH
実行オプションを指定すると、mount -t cifsが動作可能になります。
私はそれを試してみました:
mount -t cifs //<Host>/<path> /<localpath> -o user=<user>,password=<user>
コンテナ内で動作します
smbclient
コマンド(Sambaパッケージの一部)を使用して、curl
を使用してダウンロードするのと同じ方法で、Dockerコンテナー内からSMB/CIFSサーバーにマウントせずにアクセスできます。またはファイルをアップロードします。
StackExchange Unix にはこれを扱う質問がありますが、要するに:
smbclient //server/share -c 'cd /path/to/file; put myfile'
複数のファイルの場合、-T
作成または抽出できるオプション.tar
アーカイブ、ただし、これは2段階のプロセス(1つは.tar
その後、ローカルで抽出するためにもう1つ)。パイプを使用して1ステップで実行できるかどうかはわかりません。
リモートCIFS/Sambaをボリュームとしてマウント を許可するNetshareドッカーボリュームプラグインを使用できます。
共有をマウントするためだけに多くのポートを公開して、コンテナのセキュリティを低下させないでください。または、_--privileged
_として実行することにより
この問題の解決方法は次のとおりです。
Sudo mount -t cifs -o username=YourUserName,uid=$(id -u),gid=$(id -g) //SERVER/share ~/WinShare
ここでユーザー名、SERVER、WinShareを変更します。これにより、Sudoパスワードが要求され、次にリモート共有のパスワードが要求されます。
ホームフォルダー内にWinShare
フォルダーを作成したと仮定します。このコマンドを実行すると、WinShare
フォルダー内のすべての共有フォルダーとファイルを表示できるはずです。それに加えて、uid
およびgid
タグを使用するため、常にSudoを使用せずに書き込みアクセスができます。
-v
_タグを使用してコンテナを実行し、サーバーとコンテナ間でボリュームを共有できます。次のように実行したとしましょう。
_docker run -d --name mycontainer -v /home/WinShare:/home 2d244422164
_
これで、Windows共有にアクセスして、コンテナーから変更できるようになります。
それをテストするには、次のようにします。
_docker exec -it yourRunningContainer /bin/bash
_
_cd /Home
_
_touch testdocfromcontainer.txt
_
Windows共有に_testdocfromcontainer.txt
_が表示されるはずです。