我正在尝试设置 Jenkins 实例以无根运行 docker 容器。
当 jenkins 启动容器时,
-u
is 标志与 jenkins 运行器的 id 一起传递。
跑步者被命名为“runner”并且具有UID3217,因此Jenkins执行:
docker run -u 3217:100 -v /opt/build/agent/job/:/opt/build/agent/job:rw,z image
jenkins 从容器内部做的第一件事:
touch /opt/build/agent/job/jenkins.log
但是这会导致提示 Permission denied
。
当我猛击容器并运行时
id
:
uid=3217 gid=100(用户) 组=100(用户)
被返回(这是预期的)。此外,当我运行
ls -la /opt/build/agent/job
时,所有文件和目录都归 root 所有:
这与我退出容器并作为
runner
用户针对安装点运行 ls -la
形成鲜明对比,其中每个文件都归 runner:users
所有,因此可以轻松地从外部进行操作容器,由同一用户使用。
我无法消除 Jenkins 的
-u
论点,而且我不知道如何缓解这个问题。
docker 有没有办法挂载与
-u
参数指定的相同权限的目录?
docker 有没有办法挂载与 -u 参数指定的权限相同的目录?
不。 Docker 不会更改任何权限。
该目录具有它所拥有的权限。如果该目录不存在,它将由以root身份运行的dockerd进程创建,因此该目录将归root所有。
如果您希望目录具有不同的权限,请自行创建目录,或者
chmod
它。
如果你不想让目录自动创建为root,你可以使用
--mount type=bind,source=/opt/build/agent/job/,target=/opt/build/agent/job,bind-propagation=shared,rw
,但那时我对selinux一无所知。