我需要创建一个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
型
1条答案
按热度按时间pcrecxhr1#
一个通用的镜像,我们希望在构建Lambda时,通过Terraform传入构建参数,
如果你已经打算通过Terraform构建Lambda,为什么不用正确版本的Python构建Lambda呢?
假设Lambda的Dockerfile是这样的:
字符串
现在你可以为不同的版本构建lambda了:
型
这在docs中有提到。
如果你真的想要一个不同版本的基础镜像,你可以使用相同的东西,并将不同版本预先构建到你自己的容器仓库中,然后使用相同的机制来构建下一层(但这对我来说似乎有点过头了)。