【问题标题】:docker: set running user while launch containerdocker:在启​​动容器时设置运行用户
【发布时间】:2018-05-22 04:58:50
【问题描述】:

我使用官方的 golang docker 镜像来编译我的 go 程序并将生成的可执行文件放在映射到我的主机目录的卷上。

问题是docker生成的文件属于root:root,这很烦人,因为我不想通过sudo运行我的脚本。

我搜索了使docker容器以非root身份运行的解决方案,但我发现的方法需要更改Dockerfile并将用户添加到图像中,例如

http://gbraad.nl/blog/non-root-user-inside-a-docker-container.html

有没有办法让docker容器在主机上以CURRENT用户身份运行,即用户A运行这个镜像会生成属于A:A的文件,用户B生成属于B:B的文件,而A和B 都是在宿主机上定义的用户(即卷所在的位置),不需要通过 Dockerfile 将 A 和 B 添加到镜像中?

【问题讨论】:

  • 只需将-u 标志用于docker run。例如,docker run -u $UID.
  • @larsks 这行得通。谢谢!
  • @larsks 有时它不起作用。相同的 docker 镜像(我由基础 alphine-golang 加上 git 工具制作),在我的笔记本电脑上运行 -u arg,但如果我在 debian 虚拟机上运行它,它告诉我没有用户存在 uid 1001跨度>

标签: docker


【解决方案1】:

我能够为这个问题制造一个“解决方案”。这有点粗糙,但据我目前所知,它无需将用户安装到图像中即可完成工作。
从本质上讲,我将libnss-wrapper 与定制的run_as_user 脚本结合使用,而我又使用该脚本为那些因未知UID(例如ssh)而导致麻烦的命令设置别名。

Dockerfile

FROM whatever
RUN apt-get update && apt-get install -y libnss-wrapper
COPY run_as_user /usr/local/bin/
RUN chmod a+x /usr/local/bin/run_as_user

# copy some command aliases that need to be early on the path
COPY ssh /usr/local/sbin
RUN chmod a+x /usr/local/sbin/ssh

run_as_user脚本

此脚本根据当前用户的 UID 和 GID 创建一个 passwdgroup 文件,然后使用它来参数化 libnss-wrapper

#!/bin/sh
# run a command as (non-existent) user, using libnss-wrapper

U=`id -u`
G=`id -g`

HOME_DIR=/tmp/user
PASSWD=/var/tmp/passwd
GROUP=/var/tmp/group

if [ ! -d "$HOME_DIR" ]; then
  mkdir "$HOME_DIR"
fi
if [ ! -f "$PASSWD" ]; then
  echo "user::$U:$G::$HOME_DIR:" > "$PASSWD"
fi
if [ ! -f "$GROUP" ]; then
  echo "user::$G:" > "$GROUP"
fi

LD_PRELOAD=libnss_wrapper.so NSS_WRAPPER_PASSWD="$PASSWD" NSS_WRAPPER_GROUP="$GROUP" "$@"

ssh别名脚本

#!/bin/sh
SSH=/usr/bin/ssh
/usr/local/bin/run_as_user "$SSH" "$@"

同样,这是因为/usr/local/sbin 在我的路径上排在第一位。

到目前为止,这一直对我有用。如果有(严重)问题,我很乐意让他们向我指出。

【讨论】:

  • 这对我有用。谢谢!
【解决方案2】:

我由基础 alphine-golang 加上 git 工具制作),在我的笔记本电脑上使用 -u arg 运行,但如果我在 debian 虚拟机上运行它,它会告诉我 uid 1001 不存在用户

理想情况下,您应该使用正确的预期 ID 制作自己的图像(基于现有图像):

RUN useradd -r -u 1001 -g appuser appuser
USER appuser

参见“Understanding how uid and gid work in Docker containers”,来自Marc Campbell


OP 补充说:

我理解原因,因为这正是我试图避免的:将用户添加到图像中。
如果我的问题没有解决,我会尝试直接修改容器。

其实还有另外一种选择,可以修改图片,添加用户:userns or user remap(@ 987654325@)。但是,正如我mention here,您需要 docker 17.06 以避免一些错误。

【讨论】:

  • 很抱歉,这不是我想要的。 @larsks 的回答符合我的预期。
  • @xrfang 这个答案解决了您的第二条评论,并解释了主机和 docker 容器之间的所有用户 id 匹配如何运行。
  • 谢谢我理解原因,因为这是我试图避免的完全:将用户添加到图像中。如果我的问题没有解决,我会尝试直接修改容器。幸运的是,现在不需要这样做。
  • @xrfang 好的。我已经相应地编辑了我的答案,我提出了一个替代方案(避免任何用户创建)
猜你喜欢
  • 2019-01-15
  • 2023-03-09
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多