python - 有没有办法将 Python 程序编译为二进制文件并将其与 Scratch Dockerfile 一起使用?
问题描述
我最近一直在玩 docker images。我在使用FROM scratch
. 我想看看我能走多远只是为了好玩。我用python编程。该文档说要将示例 C 程序编译为二进制文件,将其复制到容器中,然后运行它。在容器中,我无法运行python <program_file>.
我看到了这篇关于将 python 文件编译为二进制文件的堆栈交换帖子,它符合我们这里的测试用例。它提到使用pyinstaller
. 所以我在一个hello.py
打印 Hello 的测试文件上运行它pyinstaller hello.py
我收到一堆关于构建项目的消息。好的。我可以通过运行“dist/hello”在我的本地机器上运行二进制文件(这是帖子中提到的二进制程序。所以我写了我的 Dockerfile 来复制这个程序并运行它。我的 Dockerfile 是
FROM scratch
ADD dist/hello /
CMD ["./hello"]
我运行docker build . -t "hello:1.0"
然后docker run hello:1.0
......我收到一条错误消息:
standard_init_linux.go:211: exec user process caused "no such file or directory"
是什么赋予了?我做错了什么?是否可以让 pyinstaller 编译一个二进制 python 项目(多个文件,而不仅仅是这个),然后使用临时图像来运行它。如果可能,是否有任何警告?
解决方案
所以答案是使用 Google 的 distroless 镜像。他们在他们的 github 上有一个示例,我稍作编辑如下:
# Build a virtualenv using the appropriate Debian release
# * Install python3-venv for the built-in Python3 venv module (not installed by default)
# * Install gcc libpython3-dev to compile C Python modules
# * Update pip to support bdist_wheel
FROM debian:buster-slim AS build
RUN apt-get update && \
apt-get install --no-install-suggests --no-install-recommends --yes python3-venv gcc libpython3-dev && \
python3 -m venv /venv && \
/venv/bin/pip install --upgrade pip
# Build the virtualenv as a separate step: Only re-execute this step when requirements.txt changes
FROM build AS build-venv
COPY requirements.txt /requirements.txt
RUN /venv/bin/pip install --disable-pip-version-check -r /requirements.txt
# Copy the virtualenv into a distroless image
FROM gcr.io/distroless/python3-debian10
COPY --from=build-venv /venv /venv
COPY . /app
WORKDIR /app
ENTRYPOINT ["/venv/bin/python3", "hello.py"]
只是发布这个以防有人想知道。绝对是一件很酷的事情。
推荐阅读
- java - 使用 JPA 查询 postgres 复制状态
- ios - Firebase :- 待处理的深层链接不起作用
- php - 从谷歌电子表格复制时,wordpress 编辑器删除表格的样式
- java - 如何分析本机帧的堆栈跟踪(致命错误日志)
- c++ - 如何增加场景中矩形形状之间的距离?
- testing - 在 DDD(域层)中使用测试驱动
- java - 很少有 Ignite 客户端节点缓存调用无限期卡住,而不是在服务器节点重新启动时抛出 ClientDisconnected/CacheStopped
- android - Windows中的亚马逊alexa auto sdk集成
- postgresql - postgresql服务器如何同步?
- tizen - 我如何使用服务杀死应用计步器?