是否可以将docker容器内的用户映射到外部用户?

时间:2019-09-03 17:39:50

标签: linux docker

我知道人们可以在Docker上使用--user选项以某个用户身份运行容器,但是在我的情况下,我的Docker映像中包含一个用户,让我们称该用户{{1} }。现在可以将该用户映射到主机上的用户了吗?例如,如果主机上有一个用户manager,我们可以将john映射到john吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以从主机设置用户,但是您应该稍微修改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"

另一种方法是传递和映射主机用户,而不在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 earings above headhere中进一步了解有关用户的信息。

答案 1 :(得分:1)

另一种方式是通过 entrypoint

示例

此示例依赖于最近出现的 gosu,它出现在最近的 Debian derivated 中,尚未出现在 Alpine 3.13 中(但是 is in edge)。

您可以按如下方式运行此映像:

docker run --rm -it \
  --env UID=$(id -u) \
  --env GID=$(id -g) \
  -v "$(pwd):$(pwd)" -w "$(pwd)" \
  imagename
tree
.                          
├── Dockerfile
└── files/
    └── entrypoint

Dockerfile

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