如果没有 sudo 权限,我无法在容器中(通过 ssh)写入已安装的卷。挂载的文件夹是主机用户在主机上的主文件夹。我正在运行一个无根的 docker 守护进程。
我执行了以下步骤来启动容器:
我已经按照https://docs.docker.com/engine/security/rootless/上的说明设置了一个无根 docker
使用以下命令构建 Dockerfile(如下):
docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) --build-arg USER_NAME=user--build-arg USER_PASS=user -t test 。
使用以下命令启动容器:
docker run -d --name test_container -p 50000:22 -v /home/$(id -u -n):/mnt/home 测试
通过 SSH 连接到我的容器
ssh 用户@localhost -p 50000
当我在主目录中创建文件时,权限被拒绝。当我在主机中创建一个新文件夹并将其 chmod 为 777 时;然后我可以创建文件,但它们不会以正确的用户/组出现在我的原始主机中,而是得到类似以下内容的信息:
drwxrwxrwx 6 gdekkers gdekkers 4096 May 25 21:10 .
drwxr-xr-x 14 gdekkers gdekkers 4096 May 25 21:10 ..
drwxrwxrwx 3 gdekkers gdekkers 4096 Apr 30 13:01 SomeFolder
drwxr-xr-x 2 …Run Code Online (Sandbox Code Playgroud) 全部:尝试使绑定安装权限正常运行。
我的目标是在容器中绑定装入卷,以便:
从安全角度来看,我们要避免容器在主机上具有根目录(这很容易理解),这是要求(b)。需求a,c和d来自将容器日志发送到文件系统上绑定安装的目录的需求,因此它们可以被splunk消化。这种配置是/将是在kubernetes上进行日志记录的首选方法(有关此内容的更多信息,请参见 此处)。
有没有人能满足上述所有4个要求?
这是解决问题的最简单方法。使用--userns-remap运行Docker:
DOCKER_OPTS="--userns-remap=1000:1000"
Run Code Online (Sandbox Code Playgroud)
启动容器高山,以根用户身份运行它。观察foo.txt的权限是没有人。我认为它们是root或1000:1000,因为那就是文件系统上的内容:
dcowden@ubuntu:~/gitwork/file-perm-stuff$ docker run --rm -it -v /home/dcowden/gitwork/file-perm-stuff/testlogs:/logs alpine /bin/sh
/ # ls -ln /logs
total 0
-rw-rw-r-- 1 65534 65534 0 Aug 20 19:08 foo.txt
/ # exit
Run Code Online (Sandbox Code Playgroud)
退出容器,然后查看文件。观察它们是1000:1000拥有的,因此userns remap将它们搞砸了:
dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln testlogs
total 0
-rw-rw-r-- 1 1000 1000 0 Aug 20 15:08 foo.txt
dcowden@ubuntu:~/gitwork/file-perm-stuff$ ls -ln .
total 8
-rw-rw-r-- 1 1000 1000 248 Aug 20 16:07 Dockerfile
drwxrwxr-x 2 1000 1000 …Run Code Online (Sandbox Code Playgroud) 我正在尝试Docker 的userns-remap功能,以root用户身份在容器内创建一个文件,并test以主机上的用户身份拥有此文件的所有者。
我已将以下内容添加到 /etc/docker/daemon.json
{
"userns-remap": "test:test"
}
Run Code Online (Sandbox Code Playgroud)
重新映射似乎是根据守护程序日志进行的
User namespaces: ID ranges will be mapped to subuid/subgid ranges of: test:test
Run Code Online (Sandbox Code Playgroud)
和条目test:100000:65536,并test:100000:65536已被添加到/etc/subuid和/etc/subgid/分别文件。
但是当我启动一个容器并尝试在工作目录中创建文件时,它失败了
test@box:~$ docker run -v /home/test/tmp:/somedir -w /somedir -it ubuntu:16.04 /bin/bash
root@11ff6c42ffe1:/somedir# touch file.txt
touch: cannot touch 'file.txt': Permission denied
root@11ff6c42ffe1:/somedir# ls -l
total 0
-rw-rw-r-- 1 nobody nogroup 0 Mar 23 21:39 already_existing_file.txt
root@11ff6c42ffe1:/somedir# id root
uid=0(root) gid=0(root) groups=0(root)
root@11ff6c42ffe1:/somedir# touch /file.txt
Run Code Online (Sandbox Code Playgroud)
可以按预期在未从主机挂载的其他目录中创建文件。 …