Docker:将外部用户映射到内部用户(如何应用“ --user”,如何执行.bashrc)?

时间:2018-07-24 08:51:38

标签: docker docker-volume linux-namespaces

使用命令行运行docker映像,例如:

> docker run -it -v $OutsideDir:$InsideDir -u $(id -u):$(id -g) c0ffeebaba bash

我可以从Docker容器内部以主机上的当前用户身份处理数据。但是,在容器“ whoami”中询问会给出以下响应:UID未知。

因此对没有主目录的用户执行外壳程序。怎么样 我可以为该用户完成一些初始化吗?有没有办法从内部将外部用户的用户ID和组ID映射到特定的用户名?可以动态地执行此操作,以便它可以通过上面显示的'--user'标志指定的任何用户使用吗?

我的第一种方法是在Dockerfile中使用“ CMD”,例如

CMD ["source", "/home/the_user/.bashrc" ]

但是,这不起作用。

1 个答案:

答案 0 :(得分:1)

一个相对简单的解决方案是将docker运行程序包装在脚本中,将主机中的/etc/passwd/etc/group文件映射到容器以及用户的主目录中,因此喜欢:

#!/bin/bash -p

# command starts with mapping passwd and group files
cmd=(docker run -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro)
# add home directory:
myhome=$(getent passwd $(id -nu) | awk -F: '{print $6}')
cmd+=(-v $myhome:$myhome)
# add userid and groupid mappings:
cmd+=(-u $(id -u):$(id -g))

# then pass through any other arguments:
cmd+=("$@")

"${cmd[@]}"

这可以运行为:

./runit.sh -it --rm alpine id

或者,对于外壳(默认情况下,高山没有bash):

./runit.sh -it --rm centos bash --login

您可以放入-w $HOME,使其开始在用户的主目录中,等等。