我应该以非root用户的身份安装Python软件包,还是在Docker容器中设置一个虚拟环境来安装它们?

2024-05-29 05:51:02 发布

您现在位置:Python中文网/ 问答频道 /正文

通过Dockerfile中的pip安装Python包时,例如:

pip install --trusted-host pypi.python.org -r requirements.txt

使用requirements.txt,例如:

python-dotenv>=0.15.0
psycopg2>=2.8.6
sqlalchemy>=1.3.22
numpy>=1.19.0
rasterio>=1.1.8
pandas>=1.1.5
geopandas>=0.8.1
matplotlib>=3.3.0
seaborn>=0.11.0

我最近看到这样的警告:

WARNING: Running pip as the 'root' user can result in broken permissions
and conflicting behavior with the system package manager.
It is recommended to use a virtual environment
instead: https://pip.pypa.io/warnings/venv

因此,我提出了一个“天真”的问题:
设置虚拟环境/或以非root用户(Docker中的默认用户)身份安装Python包是否有意义,就像在本地计算机上通常所做的那样?
就目前而言,我从来都不关心这个问题,因为我在一个Docker容器中,根据定义,它承载一个应用程序,所以我认为这些包在全球范围内安装是完全可以的。希望我不能在本地机器上破坏任何东西


Tags: installpipthedocker用户orgdockerfiletxt
3条回答

以root用户身份运行pip或全局安装软件包不是最佳做法。最佳实践是在项目中创建虚拟环境,并在其中安装每个软件包

如果全局安装,它实际上会影响其他项目,因为您可能不需要为即将启动的项目B中的项目A安装的包,并且如果删除所有包,项目A将中断,因为它无法再次访问这些包

为您的所有项目提供虚拟环境,这样,您就可以放心,所有项目都不会相互影响

老实说?没什么大不了的

在容器的构建过程中使用root用户通常是必要的,也是预期的。来自pip的警告是“以root用户身份运行pip可能会破坏您的操作系统程序所依赖的包”——但您的容器中没有操作系统

如果您在构建结束时或docker运行期间遇到权限较低的用户,则以root用户身份安装包不会对您造成任何伤害。实际上,容器是一个进程(您的python应用程序),它的文件系统视图与根系统不同——非常像virtualenv试图实现的

正如@paulbecotte在his answer中所说的,在容器中全局安装包是没有风险的,但是您看到了这个警告,因为pip并不关心您是否在容器中运行

python的一般良好实践是以非特权用户身份创建虚拟环境:$ python -m venv .venv

然后激活它:$ source .venv/bin/activate

然后使用$ pip install -r requirements.txt命令安装软件包

您可以完全根据docker构建语法进行调整:

RUN python -m venv /abolute/path/to/venv
RUN source /absolute/path/to/venv/bin/activate && pip install -r requirements.txt
CMD source /absolute/path/to/venv/bin/activate && python /path/to/your/app.py

但是,docker的一般良好实践是与非特权用户一起运行。所以你在这里有多项选择:

  • 接受警告,在没有venv的情况下全局安装python包,放弃特权,并与普通用户一起运行容器
  • 创建venv以消除警告,在其中安装软件包,以root用户身份运行容器(这不是一个好做法,但可能是remapping root user can be ok
  • 创建一个venv,安装软件包,以普通用户的身份运行容器,如果应用程序不需要在容器中以root用户的身份运行,这可能是最好的选择

相关问题 更多 >

    热门问题