我知道人们可以在Docker上使用--user
选项以某个用户身份运行容器,但是在我的情况下,我的Docker映像中包含一个用户,让我们称该用户{{1} }。现在可以将该用户映射到主机上的用户了吗?例如,如果主机上有一个用户manager
,我们可以将john
映射到john
吗?
答案 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 和here中进一步了解有关用户的信息。
答案 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
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
是因为它很简单,但你可以让它与 su
或 sudo
一起工作;但是它需要更多配置--env
开关,您可以执行以下操作:--env user="$(id -u):$(id -g)"
并在 entrypoint
中:uid=${user%:*} gid=${user#*:}
;请注意,此时 UID
变量在 bash 中将是只读的,这就是我切换到小写的原因……其余的改编留给读者