2017-10-06 31 views
0

どのユーザーがコンテナにコピーしたりコピーしたりするファイルを所有しているかを制御するにはどうすればよいですか?dockerの後のファイルの所有権cp

docker cp commandは、ファイルの所有権についてはこれを言う:

そのディレクトリ内のUNIX cp -aコマンドが可能な場合は、保存権限で再帰的にコピーされるようcpコマンドが動作します。所有権は、宛先のユーザーおよびプライマリグループに設定されます。たとえば、コンテナにコピーされたファイルは、ルートユーザーのUID:GIDで作成されます。ローカルマシンにコピーされたファイルは、docker cpコマンドを呼び出したユーザーのUID:GIDで作成されます。ただし、-aオプションを指定すると、docker cpは、所有者をソースのユーザーおよびプライマリグループに設定します。

コンテナにコピーされたファイルはルートユーザーとして作成されますが、それは私が見るものではありません。ユーザーID 1005と1006が所有する2つのファイルを作成します。これらの所有者はコンテナのユーザー名前空間に変換されます。 -aオプションは、ファイルをコンテナにコピーするときに違いはないようです。

$ sudo chown 1005:1005 test.txt 
$ ls -l test.txt 
-rw-r--r-- 1 1005 1005 29 Oct 6 12:43 test.txt 
$ docker volume create sandbox1 
sandbox1 
$ docker run --name run1 -vsandbox1:/data alpine echo OK 
OK 
$ docker cp test.txt run1:/data/test1005.txt 
$ docker cp -a test.txt run1:/data/test1005a.txt 
$ sudo chown 1006:1006 test.txt 
$ docker cp test.txt run1:/data/test1006.txt 
$ docker cp -a test.txt run1:/data/test1006a.txt 
$ docker run --rm -vsandbox1:/data alpine ls -l /data 
total 16 
-rw-r--r-- 1 1005  1005   29 Oct 6 19:43 test1005.txt 
-rw-r--r-- 1 1005  1005   29 Oct 6 19:43 test1005a.txt 
-rw-r--r-- 1 1006  1006   29 Oct 6 19:43 test1006.txt 
-rw-r--r-- 1 1006  1006   29 Oct 6 19:43 test1006a.txt 

ファイルをコンテナからコピーすると、それらは常に私の所有になります。再び、-aオプションは何もしないようです。

$ docker run --rm -vsandbox1:/data alpine cp /data/test1006.txt /data/test1007.txt 
$ docker run --rm -vsandbox1:/data alpine chown 1007:1007 /data/test1007.txt 
$ docker cp run1:/data/test1006.txt . 
$ docker cp run1:/data/test1007.txt . 
$ docker cp -a run1:/data/test1006.txt test1006a.txt 
$ docker cp -a run1:/data/test1007.txt test1007a.txt 
$ ls -l test*.txt 
-rw-r--r-- 1 don don 29 Oct 6 12:43 test1006a.txt 
-rw-r--r-- 1 don don 29 Oct 6 12:43 test1006.txt 
-rw-r--r-- 1 don don 29 Oct 6 12:47 test1007a.txt 
-rw-r--r-- 1 don don 29 Oct 6 12:47 test1007.txt 
-rw-r--r-- 1 1006 1006 29 Oct 6 12:43 test.txt 
$ 

答えて

0

ファイルの所有権の完全な制御を得るために、私はdocker cptar stream機能を使用:

-SRC_PATHまたはDEST_PATHのいずれかに指定されている場合は、あなたもからtarアーカイブをストリーミングすることができますSTDINまたはSTDOUT

私はdocker cpプロセスを起動し、プロセスとの間でtarファイルをストリーミングします。 tarエントリが過去になるので、私は所有権とアクセス権を調整できますが、私は好きです。

sandbox1コンテナ内のすべてのファイルを現在のディレクトリにコピーし、現在のディレクトリを除外してそのパーミッションが変更されないようにするすべてのファイルをPythonの単純な例で示し、すべてのファイルに強制的に読み込み/ユーザーのために。

from subprocess import Popen, PIPE, CalledProcessError 
import tarfile 

def main(): 
    export_args = ['sudo', 'docker', 'cp', 'sandbox1:/outputs/.', '-'] 
    exporter = Popen(export_args, stdout=PIPE) 
    tar_file = tarfile.open(fileobj=exporter.stdout, mode='r|') 
    tar_file.extractall('.', members=exclude_root(tar_file)) 
    exporter.wait() 
    if exporter.returncode: 
     raise CalledProcessError(exporter.returncode, export_args) 

def exclude_root(tarinfos): 
    print('\nOutputs:') 
    for tarinfo in tarinfos: 
     if tarinfo.name != '.': 
      assert tarinfo.name.startswith('./'), tarinfo.name 
      print(tarinfo.name[2:]) 
      tarinfo.mode |= 0o600 
      yield tarinfo 

main() 
関連する問題