linux 是否可以将Docker容器内部的用户Map到外部用户?

6ljaweal  于 2022-11-28  发布在  Linux
关注(0)|答案(3)|浏览(249)

我知道可以在Docker中使用--user选项以某个用户的身份运行容器,但在我的例子中,我的Docker映像中有一个用户,我们将其命名为manager。现在是否可以将该用户Map到主机上的用户?例如,如果主机上有一个用户john,我们是否可以将johnMap到manager

7ajki6be

7ajki6be1#

是的,您可以从主机设置用户,但是您应该修改您的Dockerfile以处理运行时用户。

FROM alpine:latest

# Overide user name at build, if buil-arg no passed, will create user named `default` user
ARG DOCKER_USER=default_user

# Create a group and user
RUN addgroup -S $DOCKER_USER && adduser -S $DOCKER_USER -G $DOCKER_USER

# Tell docker that all future commands should run as the appuser user
USER $DOCKER_USER

现在,构建到Docker
docker build --build-arg DOCKER_USER=$(whoami) -t docker_user .
Docker中的新用户将成为主机用户。
docker run --rm docker_user ash -c "whoami"
另一种方法只是传递并Map主机用户,而不在Dockerfile中创建用户。

export UID=$(id -u)
export GID=$(id -g)
docker run -it \
    --user $UID:$GID \
    --workdir="/home/$USER" \
    --volume="/etc/group:/etc/group:ro" \
    --volume="/etc/passwd:/etc/passwd:ro" \
    --volume="/etc/shadow:/etc/shadow:ro" \
    alpine ash -c "whoami"

您可以在docker herehere中进一步阅读有关用户的更多信息。

dgtucam1

dgtucam12#

另一种方法是通过入口点。

示例

这个例子依赖于gosu,它出现在最近的Debian derivatives中,还没有出现在Alpine 3.13中(而是is in edge)。
您可以按如下方式运行此映像:
第一个

停靠文件

FROM ...

# [...]

ARG DOCKER_USER=default_user

RUN addgroup "$DOCKER_USER" \
 && adduser "$DOCKER_USER" -G "$DOCKER_USER"

RUN wget -O- https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64 |\
    install /dev/stdin /usr/local/bin/gosu

COPY files /

RUN chmod 0755 /entrypoint \
 && sed "s/\$DOCKER_USER/$DOCKER_USER/g" -i /entrypoint

ENTRYPOINT ["/entrypoint"]

个文件/入口点

#!/bin/sh
  
set -e
set -u

: "${UID:=0}"
: "${GID:=${UID}}"

if [ "$#" = 0 ]
then set -- "$(command -v bash 2>/dev/null || command -v sh)" -l
fi

if [ "$UID" != 0 ]
then
        usermod -u "$UID" "$DOCKER_USER" 2>/dev/null && {
                groupmod -g "$GID" "$DOCKER_USER" 2>/dev/null ||
                usermod -a -G "$GID" "$DOCKER_USER"
        }
        set -- gosu "${UID}:${GID}" "${@}"
fi

exec "$@"

备注

  • UID通常是bash中的只读变量,但如果由docker --env标志设置,它将按预期工作
  • 我选择gosu是因为它很简单,但是您 * 可以 * 让它与susudo一起工作;但需要更多配置
  • 如果您不想指定两个--env开关,可以执行如下操作:--env user="$(id -u):$(id -g)"和在entrypointuid=${user%:*} gid=${user#*:};请注意,此时UID变量在bash中是只读的,这就是我切换为小写的原因......其余的修改留给读者
p8ekf7hl

p8ekf7hl3#

没有一个简单的解决方案可以处理所有的用例,解决这些问题是一项持续的工作,是集装箱化世界生活的一部分。
没有什么神奇的参数可以添加到docker execdocker run调用中,并可靠地使容器化软件在主机Map卷上操作时不再遇到权限问题。(不要),您遇到权限问题,您解决这些问题,这是您应该尝试提高效率的任务,而不是试图找到一个永远不会存在的奇迹般的解决办法。

相关问题