Docker如何将宿主机的UID/GID复制到容器中?

10
在创建 Docker 容器时,我经常遇到 UID/GID 在容器中无法反映的问题(我意识到这是设计上的)。我正在寻找一种方法来保持主机权限合理,并在 Docker 容器中复制主机用户/组帐户的 UID/GID。例如:
主机 -
woot4moo:x:504:504:woot4moo:/home/woot4moo:/bin/bash
我希望在 Docker 容器中也能实现这种行为。话虽如此,这是否是做这种事情的正确方式呢?我的想法是我可以简单地运行:
useradd -u 504 -g 504 woot4moo

我希望在我的Dockerfile中加入这部分内容,但我不确定是否有效。

2个回答

13

您不会希望将其作为图像构建过程的一部分(在Dockerfile中)运行,因为运行容器的主机通常不是构建镜像的主机。

解决这个问题的一种方法是通过环境变量传递UID / GID信息:

docker run -e APP_UID=100 -e APP_GID=100 ...

然后编写一个 ENTRYPOINT 脚本,在运行 CMD 前添加类似以下命令:

useradd -c 'container user' -u $APP_UID -g $APP_GID appuser
chown -R $APP_UID:$APP_GID /app/data

1
当组APP_GID不存在时,这个方法无法工作。可以使用groupadd --force --gid ${APP_GID} appuser - Steven Shaw

1

我曾经遇到过类似的问题,通常在每个镜像中都包含入口脚本(如已经提到的使用https://github.com/ncopa/su-exec来进行交互式终端程序)。然而,我在多个Dockerfiles中重复了相同的步骤。但是,当我使用Jenkins Pipeline的"docker.inside"时,它可以自动处理用户ID,因此我决定基于docker-py构建一个Python 3包,以类似的方式(带有一些扩展功能)来解决这个问题:

https://github.com/boon-code/docker-inside

我意识到这篇文章已经有些老了;也许对于遇到相同问题的人仍然有所帮助...

大约3年前,这只是一个相对边缘的用例。我不确定现在是否仍然有意义。 - Woot4Moo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接