如何在Docker镜像上安装两个版本的Python并在构建时切换它们?

0aydgbwb  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(118)

我需要创建一个Docker镜像,它包含两个版本的Python,比如3.9和3.10。
我们的想法是安装两个版本的Python,然后安装Python 3.9的pip/wheel/lib目录,因为它是我们想要使用的默认版本。然后我创建了指向pip/wheel/lib目录的sys链接。
然后使用.sh脚本,我们将通过build参数传递Python版本,并使用该ARG,我们将选择Python的替代版本,本例为10,这将使3.10版本成为构建使用的版本。
但我不确定最好的方法是什么,dockerfile。
我的Dockerfile看起来像这样:

COPY --from=python1 --chown=developer:developer /usr/local/bin/py* /usr/local/bin/
COPY --from=python1 --chown=developer:developer /usr/local/bin/pip* /usr/local/bin/
COPY --from=python1 --chown=developer:developer /usr/local/bin/wheel /usr/local/bin/
COPY --from=python1 --chown=developer:developer /usr/local/lib/lib* /usr/local/lib/

RUN for link in /usr/local/bin/py* /usr/local/bin/pip* /usr/local/bin/wheel /usr/local/lib/lib*; do \
        [ -e "$link" ] || ln -s "$link" /usr/local/bin/; \
    done

# Copy Base Python Version
COPY --from=python1 --chown=developer:developer /usr/local/lib/python3.9/ /usr/local/lib/python3.9/

# Copy Alternative Python Version
COPY --from=python2 --chown=developer:developer /usr/local/lib/python3.10/ /usr/local/lib/python3.10/

# Copy the version-switching script
COPY sagacity-cd/swap.sh /usr/local/bin/

# Run the script to set the default version based on the build argument
USER root
RUN chmod +x /usr/local/bin/swap.sh && \
    /usr/local/bin/swap.sh ${DEFAULT_PYTHON_VERSION}
USER developer

# Copy the version-switching script
COPY sagacity-cd/swap.sh /usr/local/bin/

# Run the script to set the default version based on the build argument
USER root
RUN chmod +x /usr/local/bin/swap.sh && \
    /usr/local/bin/swap.sh ${DEFAULT_PYTHON_VERSION}
USER developer

字符串
我的swap.sh看起来像这样:

#!/bin/bash

if [ "$1" == "3.9" ]; then
    rm /usr/local/bin/python
    ln -s /usr/local/bin/python3.9 /usr/local/bin/python
elif [ "$1" == "3.10" ]; then
    rm /usr/local/bin/python
    ln -s /usr/local/bin/python3.10 /usr/local/bin/python
else
    echo "Invalid version specified. Usage: $0 [3.9|3.10]"
    exit 1
fi

pcrecxhr

pcrecxhr1#

一个通用的镜像,我们希望在构建Lambda时,通过Terraform传入构建参数,
如果你已经打算通过Terraform构建Lambda,为什么不用正确版本的Python构建Lambda呢?
假设Lambda的Dockerfile是这样的:

ARG PY_VERSION
FROM python:${PY_VERSION}-bookworm

# then all your lambda stuff

COPY . /app

ENTRYPOINT /app/run.sh

字符串
现在你可以为不同的版本构建lambda了:

docker build --build-arg="PY_VERSION=3.10" .
docker build --build-arg="PY_VERSION=3.9" .
docker build --build-arg="PY_VERSION=3.8" .


这在docs中有提到。
如果你真的想要一个不同版本的基础镜像,你可以使用相同的东西,并将不同版本预先构建到你自己的容器仓库中,然后使用相同的机制来构建下一层(但这对我来说似乎有点过头了)。

相关问题