【问题标题】:Python script compiled to C binary and execute in Docker containerPython 脚本编译为 C 二进制文件并在 Docker 容器中执行
【发布时间】:2022-01-05 13:07:31
【问题描述】:

我想将我的 python 脚本与一些变量编译成二进制文件并在 Docker 容器中执行它。 为了实现我正在使用 Cython 和 gcc 编译器。

我在运行二进制文件时遇到问题。我在容器日志中收到错误:
/bin/sh: 1: /app/script: Exec format error

在dockerfile下面:

FROM python:3.10

WORKDIR /app
COPY . /app

RUN apt-get update && apt-get install -y python3-dev \
                          gcc \
                          libc-dev \
                          libffi-dev

RUN apt-get install -y bash &&\
    pip install --upgrade pip &&\
    pip3 install cython


RUN cython /app/script.pyx --embed
RUN gcc -Os -I/app/env/include/python3.7m -L/app/env/include/python3.7m -o script script.c -c -lpython3.7m -lpthread -lm -lutil -ldl

ENV arg1=''
ENV arg2=''
ENV arg3=''
ENV arg4=''

RUN ["chmod", "+x", "/app/script"]

ENTRYPOINT ["/bin/sh", "-l", "-c", "/app/script"]   

在文件夹 /app/env 我有 Conda 环境。

有没有人和我一样的问题?
感谢您的回答和建议

【问题讨论】:

  • gcc -c option 不是将.c 源文件编译为.o 目标文件,而不是可执行文件吗?您可能会收到一堆警告,指出 -l 选项被忽略。删除-c 选项有帮助吗? (是否使用相同的命令运行相同的工作流程,在 Docker 之外工作?)
  • @DavidMaze 我认为 gcc 将文件编译为可执行文件。当我从 linux 控制台 gcc -Os -I /home/PycharmProjects/PythonToC/env/include/python3.7m -o script script.c -lpython3.7m -lpthread -lm -lutil -ldl 调用(不带标志 -c)时,我可以从控制台 ./script 运行并且它工作正常。
  • @DavidMaze 当我编译 dokerfile 时,我没有任何警告。但是如果我将命令更改为RUN gcc -Os -I/app/env/include/python3.7m -L/app/env/include/python3.7m -o script script.c -lpython3.7m -lpthread -lm -lutil -ldl(没有标志-c),我会在编译过程中出错/usr/bin/ld: cannot find -lpython3.7m collect2: error: ld returned 1 exit status
  • @DavidMaze 我用RUN gcc -Os -I/app/env/include/python3.7m -L/app/env/include/python3.7m -o script script.c -c -lpython3.7m -lpthread -lm -lutil -ldl 编译docerfile 并将入口点修改为ENTRYPOINT ["/bin/sh", "/app/script"],然后我进入容器日志/app/script: 1: Syntax error: ")" unexpected
  • 基于上述错误,我已将 dockerfile 中的入口点命令更改为 ENTRYPOINT ["./app/script"],并在 docker 日志中收到以下消息:standard_init_linux.go:228: exec user process caused: exec format error

标签: python docker binary executable


【解决方案1】:

我想分享我的解决方案。

Dockerfile

FROM python:alpine3.7

RUN apk update && \
    apk add python3-dev libc-dev libffi-dev gcc &&\
    pip install --upgrade pip

RUN adduser -D user
USER user
WORKDIR /home/user

COPY --chown=user:user requirements.txt requirements.txt
COPY --chown=user:user script.pyx script.pyx
COPY --chown=user:user invoke invoke
COPY --chown=user:user setup.py setup.py

ENV PATH="/home/user/.local/bin:${PATH}"

RUN pip install --user -r requirements.txt

RUN cython script.pyx --embed &&\ 
    gcc -Os -I /usr/local/include/python3.7m -o script script.c -lpython3.7m -lpthread -lm -lutil -ldl &&\
    rm -f script.pyx &&\
    rm -f script.c &&\
    rm -f requirements.txt

ENV arg1=''
ENV arg2=''
ENV arg3=''
ENV arg4='''

ENTRYPOINT ["/bin/sh", "invoke"]

Shell 脚本“调用”

#!/bin/bash
./script

感谢@David Maze 的建议。

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多