在容器创建时设置docker映像用户名?

我有一个OpenSuse 42.3 docker映像,我已将其配置为运行代码。该映像有一个名为“myuser”的单一用户(root用户除外),我在初始映像生成期间通过Dockerfile创建了该用户。我有三个脚本文件,它们根据用户所在的操作系统从映像生成容器

问题:能否将容器中的用户名“myuser”设置为执行容器生成脚本的用户的用户名

我的目标是让用户以交互方式跳入容器,并能够从容器中运行代码。代码只是一个执行的二进制文件,并且有一些IO,因此我希望用户的目录可以从容器中访问,这样他们就可以导航到机器上的文件夹并运行代码以在文件系统中生成输出

下面是我到目前为止构建的内容。在linux脚本调用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容器脚本:

回显关闭
SET imageName=“myImage:ImageTag”
SET containerName=“version1Image”
docker run-it-d--name%containerName%--workdir=“/home/myuser”-v=“%USERPROFILE%:/home/myuser”%imageName%/bin/bash
echo“已创建容器%containerName%”
echo“运行./startWindowsLociStream脚本以启动容器”

以下代码已签入https://github.com/bmitch3020/run-as-user.

我将在entrypoint.sh中处理这个问题,它检查/home/myuser的所有权,并更新容器中用户的uid/gid。它可以看起来像:

#/垃圾箱/垃圾箱
集合x
#获取uid/gid
USER_UID=`ls-nd/home/myuser | cut-f3-d''`
USER_GID=`ls-nd/home/myuser | cut-f4-d''`
#获取myuser的当前uid/gid
CUR_UID=`getent passwd myuser | cut-f3-d:| | true`
CUR|u GID=`getent group myuser | cut-f3-d:| | true`
#如果它们不匹配,请进行调整
如果[!-z“$USER\u GID”-a“$USER\u GID”!=“$CUR\u GID”];然后
groupmod-g${USER_GID}myuser
fi
如果[!-z“$USER\u UID”-a“$USER\u UID”!=“$CUR\u UID”];然后
usermod-u${USER\u UID}myuser
#修复其他权限
find/-uid${CUR\u uid}-mount-exec chown${USER\u uid}.${USER\u GID}{};
fi
#放弃对myuser的访问并运行cmd
exec gosu myuser“[email protected]

下面是相关Dockerfile中的一些行:

来自debian的

:9
ARG GOSU_版本=1.10
#以root用户身份运行,将入口点放回myuser
用户根
#安装prereq debian软件包
运行apt获取更新\
&amp&DEBIAN_FRONTEND=非交互式apt get安装-y--不建议安装\
apt传输https\
ca证书\
卷曲\
维姆\
wget\
&amp&易于清洗\
&amp&rm-rf/var/lib/apt/lists/*
#安装gosu
运行dpkgArch=“$(dpkg——打印体系结构| awk-F-{print$NF}”)”\
&amp&工作组-O/usr/local/bin/gosu”https://github.com/tianon/gosu/releases/download/$GOSU_版本/GOSU-$dpkgArch“\
&amp&chmod 755/usr/local/bin/gosu\
&amp&没有人是真的
运行useradd-d/home/myuser-m myuser
WORKDIR/home/myuser
#entrypoint用于更新uid/gid,然后运行users命令
复制entrypoint.sh/entrypoint.sh
入口点[“/ENTRYPOINT.sh”]
CMD/bin/sh

然后要运行它,只需将/home/myuser作为卷装载,它将调整入口点中的权限。e、 g:

$docker build-t以用户身份运行。
$docker run-it--rm-v$(pwd):/home/myuser以用户身份运行/bin/bash

在该容器中,您可以运行idls-l以查看您是否有权访问/home/myuser文件

发表评论