在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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

以root身份运行docker容器

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Composer 在 docker 中以 root 身份运行,即使指定了用户

来自分类Dev

访问在远程主机上运行的Docker容器中运行的Web UI

来自分类Dev

Docker:默认情况下其他用户以我的用户身份运行其容器

来自分类Dev

使用主机用户运行 docker - 密码错误?

来自分类Dev

通过主机ubuntu主机中的浏览器访问vagrant vm上在coreos中运行的docker容器

来自分类Dev

通过主机ubuntu主机中的浏览器访问vagrant vm上在coreos中运行的docker容器

来自分类Dev

我的网站运行在Docker容器中,如何实现虚拟主机?

来自分类Dev

从Docker容器中的主机运行可执行文件

来自分类Dev

运行容器时docker工件是否存储在主机fs或内存中?

来自分类Dev

在主机浏览器中访问在 docker 容器内运行的 Web 应用程序?

来自分类Dev

泊坞窗容器的用户权限会影响主机对docker-compose.yml中已装载卷的主机权限吗?

来自分类Dev

将主机目录安装为网络共享时,babel-watch无法从Windows主机上的docker容器中运行

来自分类Dev

如何在docker中以非root用户身份写入卷容器?

来自分类Dev

以root用户身份登录的Docker容器中的“不允许操作”

来自分类Dev

Docker-修改容器中主机的IPTABLES

来自分类Dev

Docker容器中与主机同步的时间

来自分类Dev

在Docker容器中获取主机IP

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

    以root身份运行docker容器

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

    Composer 在 docker 中以 root 身份运行,即使指定了用户

  14. 14

    访问在远程主机上运行的Docker容器中运行的Web UI

  15. 15

    Docker:默认情况下其他用户以我的用户身份运行其容器

  16. 16

    使用主机用户运行 docker - 密码错误?

  17. 17

    通过主机ubuntu主机中的浏览器访问vagrant vm上在coreos中运行的docker容器

  18. 18

    通过主机ubuntu主机中的浏览器访问vagrant vm上在coreos中运行的docker容器

  19. 19

    我的网站运行在Docker容器中,如何实现虚拟主机?

  20. 20

    从Docker容器中的主机运行可执行文件

  21. 21

    运行容器时docker工件是否存储在主机fs或内存中?

  22. 22

    在主机浏览器中访问在 docker 容器内运行的 Web 应用程序?

  23. 23

    泊坞窗容器的用户权限会影响主机对docker-compose.yml中已装载卷的主机权限吗?

  24. 24

    将主机目录安装为网络共享时,babel-watch无法从Windows主机上的docker容器中运行

  25. 25

    如何在docker中以非root用户身份写入卷容器?

  26. 26

    以root用户身份登录的Docker容器中的“不允许操作”

  27. 27

    Docker-修改容器中主机的IPTABLES

  28. 28

    Docker容器中与主机同步的时间

  29. 29

    在Docker容器中获取主机IP

热门标签

归档