【问题标题】:Exec format error while python installation in Docker container在 Docker 容器中安装 python 时执行格式错误
【发布时间】:2021-07-05 16:43:34
【问题描述】:

我正在尝试安装 cython:arm64,这是我的 Dockerfile:

FROM ubuntu:18.04
RUN apt-get update && \
apt-get -y upgrade && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic main restricted > /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic universe >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-updates universe >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic multiverse >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://security.ubuntu.com/ubuntu/ bionic-security main restricted >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://security.ubuntu.com/ubuntu/ bionic-security universe >> /etc/apt/sources.list && \
echo deb [arch=amd64] http://security.ubuntu.com/ubuntu/ bionic-security multiverse >> /etc/apt/sources.list && \
echo deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ bionic main >> /etc/apt/sources.list && \
echo deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ bionic universe >> /etc/apt/sources.list && \
echo deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main >> /etc/apt/sources.list && \
echo deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ bionic-security main >> /etc/apt/sources.list

RUN dpkg --add-architecture arm64 && \
    apt-get update && \
    apt-get install -y -f \
    cython:arm64

cython:arm64python2.7-minimal:arm64有依赖,所以这个包也在安装中,python安装时出现exec格式错误:

Setting up python2.7-minimal:arm64 (2.7.17-1~18.04ubuntu1.6) ...
/var/lib/dpkg/info/python2.7-minimal.postinst: 42: /var/lib/dpkg/info/python2.7-minimal.postinst: /usr/bin/python2.7: Exec format error
dpkg: error processing package python2.7-minimal:arm64 (--configure):
 installed python2.7-minimal:arm64 package post-installation script subprocess returned error exit status 2

如何避免这个问题并安装cython:arm64

【问题讨论】:

    标签: python docker cython arm64


    【解决方案1】:

    为了支持这一点,您需要在主机上安装 qemu 包,然后再构建您的 docker 映像:

    sudo apt-get install qemu binfmt-support qemu-user-static
    

    然后,使用 next 来注册 binfmt:

    docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    

    执行:

    $ docker build -t abc:2 .
    Step 1/3 : FROM ubuntu:18.04
    ......
    Step 2/3 : RUN apt-get update && apt-get -y upgrade && echo deb [arch=amd64] 
    ......
    Step 3/3 : RUN dpkg --add-architecture arm64 &&     apt-get update &&     apt-get install -y -f     cython:arm64
    ...
    Setting up libsqlite3-0:arm64 (3.22.0-1ubuntu0.4) ...
    Setting up libstdc++6:arm64 (8.4.0-1ubuntu1~18.04) ...
    Setting up libffi6:arm64 (3.2.1-8) ...
    Setting up libc-dev-bin (2.27-3ubuntu1.4) ...
    Setting up manpages-dev (4.15-1) ...
    Setting up libc6-dev:arm64 (2.27-3ubuntu1.4) ...
    Setting up libitm1:arm64 (8.4.0-1ubuntu1~18.04) ...
    Setting up libpython2.7-stdlib:arm64 (2.7.17-1~18.04ubuntu1.6) ...
    Setting up libisl19:arm64 (0.19-1) ...
    Setting up libcc1-0:arm64 (8.4.0-1ubuntu1~18.04) ...
    Setting up libasan4:arm64 (7.5.0-3ubuntu1~18.04) ...
    Setting up libbinutils:arm64 (2.30-21ubuntu1~18.04.5) ...
    Setting up libubsan0:arm64 (7.5.0-3ubuntu1~18.04) ...
    Setting up libmpfr6:arm64 (4.0.1-1) ...
    Setting up python2.7:arm64 (2.7.17-1~18.04ubuntu1.6) ...
    Setting up file (1:5.32-2ubuntu0.4) ...
    Setting up libgcc-7-dev:arm64 (7.5.0-3ubuntu1~18.04) ...
    Setting up libpython-stdlib:arm64 (2.7.15~rc1-1) ...
    Setting up libpython2.7:arm64 (2.7.17-1~18.04ubuntu1.6) ...
    Setting up libexpat1-dev:arm64 (2.2.5-3ubuntu0.2) ...
    Setting up libmpc3:arm64 (1.1.0-1) ...
    Setting up libpython2.7-dev:arm64 (2.7.17-1~18.04ubuntu1.6) ...
    Setting up binutils:arm64 (2.30-21ubuntu1~18.04.5) ...
    Setting up python2.7-dev:arm64 (2.7.17-1~18.04ubuntu1.6) ...
    Setting up python:arm64 (2.7.15~rc1-1) ...
    Setting up libpython-dev:arm64 (2.7.15~rc1-1) ...
    Setting up python-dev:arm64 (2.7.15~rc1-1) ...
    Setting up cython:arm64 (0.26.1-0.4) ...
    Setting up cpp-7:arm64 (7.5.0-3ubuntu1~18.04) ...
    Setting up cpp:arm64 (4:7.4.0-1ubuntu2.3) ...
    Setting up gcc-7:arm64 (7.5.0-3ubuntu1~18.04) ...
    Setting up gcc:arm64 (4:7.4.0-1ubuntu2.3) ...
    Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
    Removing intermediate container 995d04075a29
     ---> 555cac76aa77
    Successfully built 555cac76aa77
    Successfully tagged abc:2
    

    【讨论】:

    • 感谢您的回答。安装这些数据包后,我遇到了另一个错误:Setting up python2.7-minimal:arm64 (2.7.17-1~18.04ubuntu1.6) ... /var/lib/dpkg/info/python2.7-minimal.postinst: 42: /var/lib/dpkg/info/python2.7-minimal.postinst: /usr/bin/python2.7: not found 我尝试通过 apt-get 显式安装 python,但遇到了同样的错误。
    • 这很奇怪,因为它在我这边工作,你在 docker 主机上安装了sudo apt-get install qemu binfmt-support qemu-user-static 吗?还是直接写在 dockerfile 里?你的主机操作系统是什么?
    • 是的,我在 docker 主机上安装了这些包,dokerfile 保持不变。我在 Ubuntu 18.04.3 LTS 上安装后需要重启电脑吗?
    • @Alex 我想我错过了 qemu bin 格式寄存器,更新答案。在构建自己的 dockerfile 之前,您需要使用 docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    • 你是对的,你的 docker run 命令有帮助。 cpython 已安装。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2018-02-08
    • 2021-11-30
    • 2022-11-14
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多