在Docker容器中以主机用户身份运行

罗宾·温斯洛

在我的团队中,我们在使用Docker容器进行开发时使用Docker容器在本地运行我们的网站应用程序。

假设我app.py使用的依赖项正在Flask应用程序上requirements.txt工作,工作流程大致如下所示:

# I am "robin" and I am in the docker group
$ whoami
robin
$ groups
robin docker

# Install dependencies into a docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local python:3-slim pip install -r requirements.txt
Collecting Flask==0.12.2 (from -r requirements.txt (line 1))
# ... etc.

# Run the app using the same docker volume
$ docker run -ti -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 251-131-649

现在,我们有一个运行应用程序的本地服务器,我们可以对本地文件进行更改,并且服务器将根据需要刷新。

在上面的示例中,该应用程序最终以root用户身份运行除非应用程序将文件写回到工作目录中,否则这不是问题。如果这样做的话,我们最终可以在拥有的工作目录中找到文件(例如cache.sqlitedebug.logroot这给我们团队中的用户带来了许多问题。

对于其他应用程序,我们通过使用主机用户的UID和GID运行该应用程序来解决此问题-例如,对于Django应用程序:

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

在这种情况下,应用程序将以不存在的用户身份运行,该用户1000在容器内的ID为ID ,但是写入主机目录的所有文件最终都归该robin用户所有。这在Django中工作正常。

但是,Flask拒绝以不存在的用户身份运行(在调试模式下):

$ docker run -ti -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -e FLASK_APP=app.py -e FLASK_DEBUG=true -p 5000:5000 python:3-slim flask run -h 0.0.0.0
 * Serving Flask app "app"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
Traceback (most recent call last):
...
  File "/usr/local/lib/python3.6/getpass.py", line 169, in getuser
    return pwd.getpwuid(os.getuid())[0]
KeyError: 'getpwuid(): uid not found: 1000'

有谁知道我有什么办法可以:

  • 让Flask不必担心未分配的用户ID,或者
  • 在运行时以某种方式将用户ID动态分配给用户名,或者
  • 否则,允许Docker应用程序以主机用户身份在主机上创建文件吗?

我现在唯一能想到的解决方案(超级hacky)是/etc/passwd将docker映像中的权限更改为可全局写入,然后在运行时向该文件添加新行,以将新的UID / GID对分配给用户名。

罗宾·温斯洛

这个答案Robert发表在StackOverflow上


您可以共享主机的passwd文件:

docker run -ti -v /etc/passwd:/etc/passwd -u `id -u`:`id -g` -v `pwd`:`pwd` -w `pwd` -v pydeps:/usr/local -p 8000:8000 python:3-slim ./manage.py runserver

或者,使用,将用户添加到图像中useradd/etc作为卷),方法与您使用的方法相同/usr/local

docker run -v etcvol:/etc python..... useradd -u `id -u` $USER

id -u和$ USER都在主机外壳中解析,在docker接收命令之前)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Docker容器中运行的进程的主机中的PID是什么?

在Docker容器中以主机用户身份运行

在Docker容器中以非root用户身份运行Nginx会导致权限被拒绝错误

从主机连接到在Docker容器中运行的Redis

Docker主机与容器中的Ulimits

如何在Docker容器中运行Docker主机?

以非root用户身份在Docker容器中运行不受信任的代码有哪些潜在的安全问题?

权限被拒绝错误以非root用户身份从Docker Ubuntu容器内部调用Mac主机上的Docker

从主机Powershell脚本运行Docker容器中的Powershell脚本

如何使用Jenkins在远程Docker主机中运行容器

如何从主机访问在docker容器中运行的mysql?

在Docker容器中运行时找不到Sendmail主机

我可以在Docker容器环境中运行主机命令吗?

将主机目录挂载到从Docker容器中运行的Docker容器中

Jar在主机上运行,但在Docker容器中失败

在Docker容器中运行systemd会导致主机崩溃

用户定义的Docker网络中的Docker容器-仅从主机访问

从主机连接到运行MongoDB的Docker容器

在运行的Docker容器中读取主机的ifconfig

为什么我不能以非root用户身份在Docker容器中运行IPU程序?

如何以随机用户的身份在容器中运行github cli

在Docker容器中以非root用户运行sudo命令

以root身份运行docker容器

Docker:将数据从主机复制到已挂载的主机目录,以从运行中的容器访问数据

Docker如何将卷从Docker Client挂载到在Docker主机上运行的Docker容器中?

如何从 docker 容器在主机中运行 bash 脚本并获取结果

以非 root 用户身份运行 docker 容器进程

如何在 Fargate 上的 Amazon ECS 中以非 root 用户身份运行 docker 容器

当 docker 主机是 windows 时,在 docker 容器中运行 puppeteer headful