我有一个 OpenSuse 42.3 docker 映像,已将其配置为运行代码。该映像有一个名为“myuser”的用户(root 除外),该用户是我在初始映像生成过程中通过 Dockerfile 创建的。我有三个脚本文件,它们根据用户所在的操作系统从图像生成容器。
Question: 容器中的用户名“myuser”可以设置为执行容器生成脚本的用户的用户名吗?
我的目标是让用户以交互方式弹出到容器中,并能够从容器内运行代码。该代码只是一个执行并具有一些 IO 的二进制文件,因此我希望可以从容器内访问用户的目录,以便他们可以导航到其计算机上的文件夹并运行代码以在其文件系统中生成输出。
以下是我迄今为止构建的内容。我尝试在 linux 脚本调用期间设置 USER 环境变量docker run
,但这并没有将用户从“myuser”更改为“bob”(启动容器的主机上的用户名)。目录的安装似乎工作正常。我不确定是否有可能实现我的目标。
Linux 容器脚本:
username="$USER"
userID="$(id -u)"
groupID="$(id -g)"
home="${1:-$HOME}"
imageName="myImage:ImageTag"
containerName="version1Image"
docker run -it -d --name ${containerName} -u $userID:$groupID \
-e USER=${username} --workdir="/home/myuser" \
--volume="${home}:/home/myuser" ${imageName} /bin/bash \
Mac 容器脚本:
username="$USER"
userID="$(id -u)"
groupID="$(id -g)"
home="${1:-$HOME}"
imageName="myImage:ImageTag"
containerName="version1Image"
docker run -it -d --name ${containerName} \
--workdir="/home/myuser" \
--v="${home}:/home/myuser" ${imageName} /bin/bash \
Windows 容器脚本:
ECHO OFF
SET imageName="myImage:ImageTag"
SET containerName="version1Image"
docker run -it -d --name %containerName% --workdir="/home/myuser" -v="%USERPROFILE%:/home/myuser" %imageName% /bin/bash
echo "Container %containerName% was created."
echo "Run the ./startWindowsLociStream script to launch container"
以下代码已被签入https://github.com/bmitch3020/run-as-user https://github.com/bmitch3020/run-as-user.
我会在一个entrypoint.sh
检查所有权/home/myuser
并更新容器内用户的 uid/gid。它可能看起来像:
#!/bin/sh
set -x
# get uid/gid
USER_UID=`ls -nd /home/myuser | cut -f3 -d' '`
USER_GID=`ls -nd /home/myuser | cut -f4 -d' '`
# get the current uid/gid of myuser
CUR_UID=`getent passwd myuser | cut -f3 -d: || true`
CUR_GID=`getent group myuser | cut -f3 -d: || true`
# if they don't match, adjust
if [ ! -z "$USER_GID" -a "$USER_GID" != "$CUR_GID" ]; then
groupmod -g ${USER_GID} myuser
fi
if [ ! -z "$USER_UID" -a "$USER_UID" != "$CUR_UID" ]; then
usermod -u ${USER_UID} myuser
# fix other permissions
find / -uid ${CUR_UID} -mount -exec chown ${USER_UID}.${USER_GID} {} \;
fi
# drop access to myuser and run cmd
exec gosu myuser "$@"
以下是相关 Dockerfile 中的一些行:
FROM debian:9
ARG GOSU_VERSION=1.10
# run as root, let the entrypoint drop back to myuser
USER root
# install prereq debian packages
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
apt-transport-https \
ca-certificates \
curl \
vim \
wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install gosu
RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
&& chmod 755 /usr/local/bin/gosu \
&& gosu nobody true
RUN useradd -d /home/myuser -m myuser
WORKDIR /home/myuser
# entrypoint is used to update uid/gid and then run the users command
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD /bin/sh
然后要运行它,您只需将 /home/myuser 作为卷挂载,它将调整入口点中的权限。例如。:
$ docker build -t run-as-user .
$ docker run -it --rm -v $(pwd):/home/myuser run-as-user /bin/bash
在该容器内你可以运行id
and ls -l
查看您是否有权访问 /home/myuser 文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)