Requirement:以能够安装rpy2库,因为要与Airflow协调的代码广泛使用它

Current Dockerfile

FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends build-essential r-base r-base-core r-cran-randomforest python3.6 python3-pip python3-setuptools python3-dev&& \
   rm -r /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt /app/requirements.txt

RUN pip3 install --upgrade pip==20.0.2 wheel==0.34.2 setuptools==49.6.0

RUN python3 -m pip install rpy2

RUN Rscript -e "install.packages('data.table')"

COPY . /app

Issue:我遇到了围绕必需的库的问题,这些库没有出现在代码本身中.

The Error:

[6/8] RUN python3 -m pip install rpy2:
1.176 Collecting rpy2
1.304   Downloading rpy2-3.5.14.tar.gz (219 kB)
1.422   Installing build dependencies: started
4.186   Installing build dependencies: finished with status 'done'
4.187   Getting requirements to build wheel: started
4.225   Getting requirements to build wheel: finished with status 'error'
4.225   ERROR: Command errored out with exit status 1:
4.225    command: /usr/bin/python3 /usr/local/lib/python3.10/dist-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /tmp/tmpff4u1mul
4.225        cwd: /tmp/pip-install-12iwr626/rpy2
4.225   Complete output (31 lines):
4.225   Traceback (most recent call last):
4.225     File "/usr/local/lib/python3.10/dist-packages/pip/_vendor/pep517/_in_process.py", line 257, in <module>
4.225       main()
4.225     File "/usr/local/lib/python3.10/dist-packages/pip/_vendor/pep517/_in_process.py", line 240, in main
4.225       json_out['return_val'] = hook(**hook_input['kwargs'])
4.225     File "/usr/local/lib/python3.10/dist-packages/pip/_vendor/pep517/_in_process.py", line 85, in get_requires_for_build_wheel
4.225       backend = _build_backend()
4.225     File "/usr/local/lib/python3.10/dist-packages/pip/_vendor/pep517/_in_process.py", line 63, in _build_backend
4.225       obj = import_module(mod_path)
4.225     File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
4.225       return _bootstrap._gcd_import(name[level:], package, level)
4.225     File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
4.225     File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
4.225     File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
4.225     File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
4.225     File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
4.225     File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
4.225     File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
4.225     File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
4.225     File "<frozen importlib._bootstrap_external>", line 883, in exec_module
4.225     File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
4.225     File "/usr/local/lib/python3.10/dist-packages/setuptools/__init__.py", line 10, in <module>
4.225       import distutils.core
4.225     File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
4.225     File "<frozen importlib._bootstrap>", line 1002, in _find_and_load_unlocked
4.225     File "<frozen importlib._bootstrap>", line 945, in _find_spec
4.225     File "/usr/local/lib/python3.10/dist-packages/_distutils_hack/__init__.py", line 72, in find_spec
4.225       return self.get_distutils_spec()
4.225     File "/usr/local/lib/python3.10/dist-packages/_distutils_hack/__init__.py", line 77, in get_distutils_spec
4.225       class DistutilsLoader(importlib.util.abc.Loader):
4.225   AttributeError: module 'importlib.util' has no attribute 'abc'

推荐答案

所有这些错误往往是不同包版本相互竞争的问题.例如:一个包在它的最新版本中删除了一个方法或移动了一些函数,而另一个依赖于前者的包还没有意识到这些变化.

如下所示:包A使用包B的.do_something方法,但包B的开发人员将其重命名为.do_something_better.如果您有B的最新版本,但A的旧版本还不知道重命名...嗯...它会崩溃(如你所见)

这似乎就是在Python3.10和setupTools中正在发生的事情.

TL;DR:您看到了一个非常常见(且令人讨厌的)版本控制问题.

这就是说,这个Dockerfile正在成功构建:

FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends build-essential \
    r-base r-base-core r-cran-randomforest \
    libinput-dev libgbm-dev liblzma-dev libbz2-dev libicu-dev libblas-dev liblapack-dev \
    python3.6 python3-pip python3-setuptools python3-dev&& \
   rm -r /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt /app/requirements.txt

RUN pip3 install --upgrade pip wheel setuptools>51

RUN python3 -m pip install rpy2

RUN Rscript -e "install.packages('data.table')"

COPY . /app

请注意,需要-dev个包,并且我允许pip、heel和setupTools在版本方面稍微宽松一些.另外,因为我没有你的requirements.txt档案,所以我把它留空了.

HOWEVER:您正在获取:latest Ubuntu映像.从2023年10月起,这意味着要安装Ubuntu 22.04(代号为"Jammy jellyfish").该映像中的默认Python3应该是3.10,但您似乎正在安装Python3.6.这可能会导致潜在的问题,因为如果您执行大约apt-get install some_python_package,您的系统中可能会有potentially最终使用的是Python3.6,而some_python_package的版本是为Python3.10设计的,这并不是很好.

如果您更喜欢使用Python3.6,我建议您将Docker文件建立在其中一个Python Docker映像的基础上?

例如,python:3.6.14-bullseye,它是基于Debian(不是Ubuntu)的,但包含一些调整和环境变量,旨在为Python3.6提供安全的环境(或"生态系统"

FROM python:3.6.14-bullseye

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends build-essential \
    r-base r-base-core r-cran-randomforest \
    libinput-dev libgbm-dev liblzma-dev libbz2-dev libicu-dev libblas-dev liblapack-dev \
   && rm -r /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt /app/requirements.txt

RUN pip3 install --upgrade pip wheel setuptools

RUN python3 -m pip install rpy2

RUN Rscript -e "install.packages('data.table')"

COPY . /app

还有更多的Python Docker镜像,它们的功能和内容略有不同.你可能想看看at this article个,看看哪一个最适合你的需要.

将镜像绑定到特定版本而不是:latest还有一个好处,那就是如果(例如)Ubuntu Docker镜像维护人员决定将"latest"的含义从当前的22.04升级到24.04,你就不会被意想不到的全面操作系统升级所困扰.

Python相关问答推荐

如何销毁框架并使其在tkinter中看起来像以前的样子?

如何让我的Tkinter应用程序适合整个窗口,无论大小如何?

从DataFrame.apply创建DataFrame

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

使用LineConnection动画1D数据

提取两行之间的标题的常规表达

Python 3.12中的通用[T]类方法隐式类型检索

在内部列表上滚动窗口

如何将双框框列中的成对变成两个新列

如何删除索引过go 的lexsort深度可能会影响性能?' &>

将输入管道传输到正在运行的Python脚本中

在线条上绘制表面

如何在WSL2中更新Python到最新版本(3.12.2)?

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何在BeautifulSoup/CSS Select 器中处理regex?

基于Scipy插值法的三次样条系数

从旋转的DF查询非NaN值

使用python playwright从 Select 子菜单中 Select 值

修改.pdb文件中的值并另存为新的

有了Gekko,可以创建子模型或将模型合并在一起吗?