首页 > 解决方案 > 如何配置Shebang行内部Python工具

问题描述

我正在尝试构建一个最小的 docker 映像,除了运行 Python 解释器之外别无他法。在开发过程中,我从 alpine 开始,最终的图像将是 build FROM scratch。我正在使用 Linux Mint 机器。

我能够编译 Python 编译器并将其安装到我当前的工作目录中,如下所示:

cd Python-3.8.7
./configure --prefix=$PWD/../python
make install

但是,我没有找到如何--prefix正确调整设置,以便创建的 shebang 稍后在 docker 容器中工作。

第一行./python/pip3包含我的主机的绝对路径并读取

#!/home/orion/minimal_py_image/Python-3.8.7/../python/bin/python3.8

但它应该读

#!/python/bin/python3.8

因为/python是在 docker 镜像中找到 Python 解释器的位置。

我怎样才能欺骗make install脚本以便最终目的地是/python/bin

我想将构建保留在当前目录中,即使用/python我进行编译的主机上的文件夹。

附加信息

可能与这个问题没有直接关系,但作为参考:这是我正在尝试工作的 Dockerfile:

FROM alpine

COPY python /python

COPY lib64/* /lib64/

ENV LD_LIBRARY_PATH=/usr/lib64/:/lib64/:/python/lib
ENV PATH="${PATH}:/python/bin"

我已经能够运行 Python,docker run -it mini python3 -c "print('hello from python')"但由于错误的 shebang,pip 还没有工作。

标签: pythondockermakefileconfigure

解决方案


基于 Autoconf 的构建系统中的一个常见约定是支持 Make 变量DESTDIR。运行时make install,如果DESTDIR设置了,它实际上会安装到配置的目录下DESTDIR,但仍然使用原始路径构建。然后,您可以创建目标目录的存档,或者在 Docker 上下文中,使用该目录作为构建上下文。

cd Python-3.8.7
# Use the final install target as the --prefix
./configure --prefix=/python
# Installs into e.g. ../python/python/bin/python3.8
make install DESTDIR=../python

cd ../python
tar cvzf ../python.tar.gz .

您可以在很多地方看到Python Makefile 中引用的这个变量。


推荐阅读