从Docker容器使用系统安装的Python库[duplicate]

brqmpdu1  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(172)

此问题在此处已有答案

How to share python libraries from host to multiple docker containers?(1个答案)
16小时前关门了。
我有几个项目使用非常大的Python包。我想把每个项目放在不同的docker容器中。为了保存磁盘空间,我想把大的Python包安装在底层服务器上,这样每个docker容器就可以使用它们,而不需要分别安装在每个容器中。每个项目可能还有一些其他的Python包,可以本地安装在项目的容器上。
是否可以让Docker容器使用底层服务器中的一些Python库,而使用容器本身中的其他库?

c3frrgcw

c3frrgcw1#

在容器和主机之间共享文件的方法是通过卷或绑定挂载,将python库挂载到容器中似乎很方便。
为了避免在主机的库可能发生更改时容器出现其他问题,我建议在主机上设置一个虚拟环境并挂载生成的目录。
此外,由于库将在多个容器之间共享,并且应该安装 * 额外的、单独的库 *,因此我们希望确保没有任何更改反映到主机,即以只读方式装载共享库。
确保在主机上使用 * 相同的python版本(请阅读:在虚拟环境中)和容器中 *。在下面的最小示例中,主机运行python 3.8,因此为容器选择了相同的版本。

示例:

创建一个虚拟环境,cd到根目录并激活它。

python3 -m venv sharedwithdocker
cd sharedwithdocker
source bin/activate

安装要与容器共享的包,然后离开虚拟环境。

pip install requests
deactivate

创建一个可以访问我们的venv的容器。整个venv文件夹sharedwithdocker被挂载到/from-host。注意ro(只读),它确保容器内的任何更改都不会写入主机。这意味着pip会将新的包安装到用户目录。(如果您在构建映像时安装了包,这可能不相关。)
环境变量告诉python和pip在哪里查找库。根据您选择的基础映像,默认路径可能会略有不同。* 注意:这假设您仍然在venv目录($(pwd))* 中。

docker run -it --rm \
  --mount type=bind,src=$(pwd),dst=/from-host,ro \
  -e PYTHONHOME=/from-host \
  -e PYTHONPATH=/usr/local/lib/python3.8:/usr/local/lib/python3.8/lib-dynload:/from-host/lib/python3.8/site-packages \
  python:3.8-slim /bin/bash
  • 在容器中 *,让我们安装另一个包:
pip install pytz

正如预期的那样,我们将看到:* 默认为用户安装,因为常规站点包不可写 *。
列出已安装的软件包以验证是否一切正常:

pip list

Package            Version  
------------------ ---------
certifi            2022.12.7
charset-normalizer 3.1.0    
idna               3.4      
pip                20.0.2   
pkg-resources      0.0.0    
pytz               2022.7.1 
requests           2.28.2   
setuptools         44.0.0   
urllib3            1.26.15

而且python也能和它一起工作:

python -c "import pytz; import requests; print('Imports working :-)')"

相关问题