Docker:将外部映射到内部用户(如何应用'--user',如何执行.bashrc)?
Docker: Map external to internal user (howto apply '--user', howte execute .bashrc)?
运行 带有命令行的 docker 图像,例如:
> docker run -it -v $OutsideDir:$InsideDir -u $(id -u):$(id -g) c0ffeebaba bash
我能够在 docker 容器内以主机上的当前用户身份处理我的数据。但是,在容器 'whoami' 内部询问会给出 UID 未知的响应。
因此 shell 是在没有主目录的用户上执行的。如何
我可以为该用户做一些初始化吗?有没有办法从内部将外部用户的用户标识和组标识映射到特定用户名?这是否可以动态完成,以便它适用于任何用户,如上所示通过“--user”标志指定?
我的第一个方法是在 Dockerfile 中使用 'CMD',例如
CMD ["source", "/home/the_user/.bashrc" ]
但是,那是行不通的。
一个相对简单的解决方案是将 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 }')
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
或者,对于 shell(alpine 默认没有 bash):
./runit.sh -it --rm centos bash --login
你可以输入一个 -w $HOME
让它在用户的主目录等中启动
运行 带有命令行的 docker 图像,例如:
> docker run -it -v $OutsideDir:$InsideDir -u $(id -u):$(id -g) c0ffeebaba bash
我能够在 docker 容器内以主机上的当前用户身份处理我的数据。但是,在容器 'whoami' 内部询问会给出 UID 未知的响应。
因此 shell 是在没有主目录的用户上执行的。如何 我可以为该用户做一些初始化吗?有没有办法从内部将外部用户的用户标识和组标识映射到特定用户名?这是否可以动态完成,以便它适用于任何用户,如上所示通过“--user”标志指定?
我的第一个方法是在 Dockerfile 中使用 'CMD',例如
CMD ["source", "/home/the_user/.bashrc" ]
但是,那是行不通的。
一个相对简单的解决方案是将 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 }')
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
或者,对于 shell(alpine 默认没有 bash):
./runit.sh -it --rm centos bash --login
你可以输入一个 -w $HOME
让它在用户的主目录等中启动