我使用 Linux 构建了一个多平台 Docker 映像,并通过 pip requests.xt 文件安装了 numpy。图像构建良好,容器在 Windows/Linux 上运行良好,但在 M1 mac 笔记本电脑上运行时,出现以下错误:
File "/opt/venv/lib/python3.11/site-packages/streamlit/type_util.py", line 40, in <module>
import numpy as np
File "/opt/venv/lib/python3.11/site-packages/numpy/__init__.py", line 139, in <module>
from . import core
File "/opt/venv/lib/python3.11/site-packages/numpy/core/__init__.py", line 49, in <module>
raise ImportError(msg)
ImportError:
在向 numpy git 询问此事后(https://github.com/numpy/numpy/issues/24114),似乎arm64图像/Python没有正确拉动arm64 numpy包。
下面是我的 Dockerfile。我也在尝试多阶段构建。有人对修复导入错误有任何见解吗?
FROM --platform=$BUILDPLATFORM python:3.11-slim-bookworm AS build
ARG TARGETPLATFORM
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
FROM python:3.11-slim-bookworm AS runtime
# setup user and group ids
ARG USER_ID=1000
ENV USER_ID $USER_ID
ARG GROUP_ID=1000
ENV GROUP_ID $GROUP_ID
# add non-root user and give permissions to workdir
RUN groupadd --gid $GROUP_ID user && \
adduser user --ingroup user --gecos '' --disabled-password --uid $USER_ID && \
mkdir -p /usr/src/app_dir && \
chown -R user:user /usr/src/app_dir
# copy from build image
COPY --chown=user:user --from=build /opt/venv /opt/venv
RUN apt-get update && apt-get install --no-install-recommends -y tk \
&& rm -rf /var/lib/apt/lists/*
# set working directory
WORKDIR /app_dir
# switch to non-root user
USER user
# Path
ENV PATH="/opt/venv/bin:$PATH"
COPY ./app .
EXPOSE 8501
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
ENTRYPOINT ["streamlit", "run", "Home.py", "--server.fileWatcherType=none", "--server.port=8501", "--server.address=0.0.0.0", "--server.headless=true"]
我尝试切换到单阶段构建,但是当 mac 拉取 arm64 映像时,它仍然在 qemu 下运行(不确定为什么)。将第二阶段更改为
FROM --platform=$TARGETPLATFORM python:3.11-slim-bookworm AS runtime
会导致相同的初始 ImportError。
您需要在第一阶段使用
FROM --platform=$TARGETPLATFORM
来在其他平台上获得完全模拟的构建。请注意,构建可能会明显变慢。
FROM --platform=$BUILDPLATFORM
表示如果您在 linux/amd64
上构建,这些命令将为构建平台 (linux/amd64
) 安装,并且不能在其他平台(例如 Apple 芯片)上运行,除非可以进行仿真并进行配置。