进行多平台交叉编译Docker构建时安装正确的arm64包

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

我使用 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。

docker macos dockerfile x86-64 arm64
1个回答
0
投票

您需要在第一阶段使用

FROM --platform=$TARGETPLATFORM
来在其他平台上获得完全模拟的构建。请注意,构建可能会明显变慢。

FROM --platform=$BUILDPLATFORM
表示如果您在
linux/amd64
上构建,这些命令将为构建平台 (
linux/amd64
) 安装,并且不能在其他平台(例如 Apple 芯片)上运行,除非可以进行仿真并进行配置。

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