在我的团队中,我们在使用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.sqlite
或debug.log
)root
。这给我们团队中的用户带来了许多问题。
对于其他应用程序,我们通过使用主机用户的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'
有谁知道我有什么办法可以:
我现在唯一能想到的解决方案(超级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] 删除。
我来说两句