Dockerfile - 使用requirements.txt中的额外包

问题描述 投票:0回答:1

我正在使用

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
docker pip debian
1个回答
0
投票

您显示的 Dockerfile 设置存在几个问题。看起来您正在混合操作系统包(由

dpkg
管理)和 Python 包(由
pip
管理),这会引起一些混乱。

在 Docker 之外,我首先使用您需要的

exact
Python 版本创建 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 的工作流程。

© www.soinside.com 2019 - 2024. All rights reserved.