【发布时间】: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 -coption 不是将.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