webdevqa.jp.net

Dockerコンテナー内でSMB / CIFS共有をマウントする

DockerコンテナでWebアプリケーションを実行しています。このアプリケーションは、企業のファイルサーバー(Active Directoryドメインコントローラーを備えたWindows Server)上のいくつかのファイルにアクセスする必要があります。アクセスしようとしているファイルは、クライアント用に作成された画像ファイルであり、Webアプリケーションはそれらをクライアントのポートフォリオの一部として表示します。

開発マシンでは、_/etc/fstab_のエントリを介して適切なフォルダーがマウントされ、_--volume_引数を介してホストマウントポイントがDockerコンテナーにマウントされます。これは完全に機能します。

現在、別のサーバーで実行され、ホストにマウントされているCIFS共有に依存しない運用コンテナーを作成しようとしています。そこで、コンテナ内の_/etc/fstab_ファイルに適切なエントリを追加し、_mount -a_でマウントしようとしました。 mount error(13): Permission deniedを取得します。

オンラインで少し調べたところ、 Dockerセキュリティに関するこの記事 に導かれました。これを正しく読んでいると、Dockerがコンテナ内のファイルシステムをマウントする機能を明示的に拒否しているように見えます。共有を読み取り専用でマウントしようとしましたが、これも(当然のことながら)失敗しました。

したがって、2つの質問があります。

  1. Dockerはコンテナ内でmountの使用を禁止していることを理解していますか?

  2. 誰もこれを達成する別の方法を考えることができますかwithoutホストにCIFS共有をマウントし、Dockerコンテナにホストフォルダをマウントしますか?

31
Kryten

はい、Dockerはセキュリティ対策としてコンテナ内にリモートボリュームをマウントすることを禁止しています。画像とそれらを実行する人を信頼する場合は、--privilegedフラグとdocker runこれらのセキュリティ対策を無効にします。

さらに、--cap-addおよび--cap-dropは、コンテナに実際に必要な機能のみを提供します。 (ドキュメントを参照)SYS_ADMIN機能は、マウント特権を付与する機能です。

31
  1. はい
  2. クローズド問題mount.cifsがコンテナー内にあります

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>

コンテナ内で動作します

13
Wolfgang Fahl

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ステップで実行できるかどうかはわかりません。

3
Malvineous

リモートCIFS/Sambaをボリュームとしてマウント を許可するNetshareドッカーボリュームプラグインを使用できます。

0
andrey

共有をマウントするためだけに多くのポートを公開して、コンテナのセキュリティを低下させないでください。または、_--privileged_として実行することにより

この問題の解決方法は次のとおりです。

  • 最初に、Dockerを実行するサーバーにボリュームをマウントします。

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_が表示されるはずです。

0
nPcomp