如果我使用--user
的参数docker run
,更改(例如简单的更改mkdir
)将显示为由该(非 root)用户执行。但是,我将无法像apt
在容器内那样运行命令,因为它们需要 root 权限。默认情况下,没有预安装sudo
Dockerdebian
镜像ubuntu
。
解决这个问题的优雅方法是什么?
答案1
如果你知道的话什么时候和在哪里更改将被写入,chown
之后您可以在这些文件上使用:
- 使用参数将主机(非 root)用户的用户和组 ID (
id -u
, ) 传递到 Docker 容器id -g
--env
- 以 root 身份运行命令/脚本(在容器内)
- 最后,运行
chown
(仍在容器内)以使更改看起来像是由主机用户执行的
答案2
我不认为这是一个特别优雅的解决方案,但可以在容器内创建一个虚拟用户,其用户和组 ID 与(非 root)主机用户的用户和组 ID 匹配:
- 使用参数将主机(非 root)用户的用户和组 ID (
id -u
, ) 传递到 Docker 容器id -g
--env
创建与主机(非 root)用户的组 ID 匹配的新组
addgroup --gid $DUMMY_GID dummy
创建与主机(非 root)用户的用户 ID 匹配的新用户
adduser --uid $DUMMY_UID --gid $DUMMY_GID --disabled-password --gecos "" dummy
需要root权限的命令才可以工作
运行其他命令/脚本
runuser
runuser -u dummy -- command