ドッカーでは、コンテナ内で作成されたファイルは、ホストから検証するときに予測できない所有権を持つ傾向があります。ボリューム上のファイルの所有者は、デフォルトではroot(uid 0)ですが、root以外のユーザーアカウントがコンテナに関与してファイルシステムに書き込むとすぐに、所有者はホストの観点から多かれ少なかれランダムになります。Dockerと--userns-remap、ボリュームのパーミッションを管理してホストとコンテナ間でデータを共有する方法は?
dockerコマンドを呼び出すのと同じユーザーアカウントを使用してホストからボリュームデータにアクセスする必要がある場合は、問題です。
典型的な回避策が
- (非ポータブル)Dockerfilesに作成時にユーザーのUIDを強制されている環境変数として
docker run
コマンドにホストユーザーのUIDを渡し、その後にいくつかのchown
のコマンドを実行している - エントリポイントスクリプト内のボリューム。
これらのソリューションの両方を使用すると、コンテナの外にある実際のアクセス許可をいくらか制御できます。
私はこの問題の最終解決策としてユーザーネームスペースが必要であると予想していました。最近リリースされたバージョン1.10でいくつかのテストを実行し、デスクトップアカウントに--userns-remapを設定しました。しかし、マウントされたボリュームのファイル所有権を扱い易くすることができるとは確信していませんが、実際には反対になる可能性があります。
は、私は、この基本的なコンテナ
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
を開始し、ホストからのコンテンツを調べるとします
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
この番号「100000」は、私のホストユーザーのサブUIDですが、以来、私のユーザのUIDには対応していませんが、特権なしでtest.txtを編集することはできません。このサブユーザーは、ドッカー以外の私の実際の正規ユーザーとの親和性を持たないようです。マップされていません。
この記事の前半で説明した、ホストとコンテナ間のUIDの整列からなる回避策は、ネームスペースで発生するUID->sub-UID
マッピングのためにはもう機能しません。
次に、ドッカーを実行しているホストユーザーがボリュームで生成されたファイルを所有することを可能にする一方で、ユーザーネームスペースを有効にして(セキュリティを強化するために)ドッカーを実行する方法はありますか?
私はあなたがホストネームスペースとコンテナの間でボリュームを共有しようとしているのであれば、ソリューションの一部にはならないと思います。 2番目のオプション(「ホストユーザーのUIDをdocker runコマンドに環境変数として渡し、エントリポイントスクリプト内のボリュームに対していくつかのchownコマンドを実行する」)がおそらく最適な解決策です。 – larsks
Docker自体は、ホストマウントの書き込み可能なボリュームの使用を推奨していないようです。私はクラウドサービスを実行しておらず、自分自身の信頼できる画像のみを使用しているので、今やユーザNSのセキュリティ上の利点があまりにも多くの利便性を犠牲にする価値があるのか疑問に思っています。 –
@StéphaneC。あなたはおそらくより良いアプローチを見つけましたか? – EightyEight