我正在使用
Docker
并构建自定义图像。我的图像基于 Debian
发行版,并添加一些带有 requirements.txt
文件的包。当我构建 Docker
映像时,我可以在日志中看到软件包安装,但是当我运行它时,我无法使用 requirements.txt
中的其他软件包,因为它们尚未安装。
它与
--break-system-packages
选项链接吗?
因为如果我不精确,我就有
error: externally-managed-environment
Dockerfile
FROM debian:latest
# Setting code directory
WORKDIR /code
# Install pip
RUN set -xe \
&& apt-get update -y \
&& apt-get install -y pip
RUN pip install --upgrade pip --break-system-packages
# Install requirements
COPY requirements.txt .
RUN pip install -r requirements.txt --break-system-packages
需求.txt
nano
psycopg2-binary
pandas
构建形象
docker build --network=host -t "debian:latest" .
运行它
docker run -it --entrypoint /bin/sh debian
搜索套餐(无结果)
dpkg --list | grep -i -e nano -e pandas -e psycopg
您显示的 Dockerfile 设置存在几个问题。看起来您正在混合操作系统包(由
dpkg
管理)和 Python 包(由 pip
管理),这会引起一些混乱。
在 Docker 之外,我首先使用您需要的
exactPython 版本创建
requirements.lock
文件。 Python 打包用户指南 描述了一些有关工具的选项。出于示例目的,我将使用普通的 Python 虚拟环境:
python -m venv ./venv
. ./venv/bin/activate
pip install psycopg2-binary pandas
pip freeze > requirements.txt
在您的 Docker 设置中,我建议从
python
基础镜像开始。这使您可以更好地控制正在使用的 Python 的确切版本,并附带一些预安装的工具,例如 pip
。 (您的本地组织可能有从已知起点构建映像的特定要求,在这种情况下,您应该获得有关如何获取此类公共语言运行时的指导。)
安装应用程序的 Python 级依赖项后,不要忘记复制代码,并为要运行的容器设置默认值
CMD
。
放在一起,可能看起来像这样
FROM python:3.11
WORKDIR /code
# Copy the frozen requirements file in and install those packages.
# Use the "system" Python inside the isolated images.
# Do this separately to improve performance on rebuild.
COPY requirements.txt ./
RUN pip install -r requirements.txt
# Copy the rest of the application in.
COPY ./ ./
# Set the default command to run when you launch the container.
CMD ["./myapp.py"]
您的 Python 代码应该能够从您使用
import
安装的软件包中获取 pip install
模块。
默认的
python
镜像恰好是基于 Debian 的,但 Debian 包管理系统(dpkg
工具和更高级别的 APT 包装器)与 Python 打包系统是分开的。您 pip install
的东西将不会通过 dpkg --list
可见。如果 Python 库有 Debian 包,那么原则上您可以 apt-get install libpython-...
,但这不是典型的基于 Docker 的工作流程。