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

0aydgbwb  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(396)

我需要创建一个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看起来像这样:

  1. COPY --from=python1 --chown=developer:developer /usr/local/bin/py* /usr/local/bin/
  2. COPY --from=python1 --chown=developer:developer /usr/local/bin/pip* /usr/local/bin/
  3. COPY --from=python1 --chown=developer:developer /usr/local/bin/wheel /usr/local/bin/
  4. COPY --from=python1 --chown=developer:developer /usr/local/lib/lib* /usr/local/lib/
  5. RUN for link in /usr/local/bin/py* /usr/local/bin/pip* /usr/local/bin/wheel /usr/local/lib/lib*; do \
  6. [ -e "$link" ] || ln -s "$link" /usr/local/bin/; \
  7. done
  8. # Copy Base Python Version
  9. COPY --from=python1 --chown=developer:developer /usr/local/lib/python3.9/ /usr/local/lib/python3.9/
  10. # Copy Alternative Python Version
  11. COPY --from=python2 --chown=developer:developer /usr/local/lib/python3.10/ /usr/local/lib/python3.10/
  12. # Copy the version-switching script
  13. COPY sagacity-cd/swap.sh /usr/local/bin/
  14. # Run the script to set the default version based on the build argument
  15. USER root
  16. RUN chmod +x /usr/local/bin/swap.sh && \
  17. /usr/local/bin/swap.sh ${DEFAULT_PYTHON_VERSION}
  18. USER developer
  19. # Copy the version-switching script
  20. COPY sagacity-cd/swap.sh /usr/local/bin/
  21. # Run the script to set the default version based on the build argument
  22. USER root
  23. RUN chmod +x /usr/local/bin/swap.sh && \
  24. /usr/local/bin/swap.sh ${DEFAULT_PYTHON_VERSION}
  25. USER developer

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

  1. #!/bin/bash
  2. if [ "$1" == "3.9" ]; then
  3. rm /usr/local/bin/python
  4. ln -s /usr/local/bin/python3.9 /usr/local/bin/python
  5. elif [ "$1" == "3.10" ]; then
  6. rm /usr/local/bin/python
  7. ln -s /usr/local/bin/python3.10 /usr/local/bin/python
  8. else
  9. echo "Invalid version specified. Usage: $0 [3.9|3.10]"
  10. exit 1
  11. fi

pcrecxhr

pcrecxhr1#

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

  1. ARG PY_VERSION
  2. FROM python:${PY_VERSION}-bookworm
  3. # then all your lambda stuff
  4. COPY . /app
  5. ENTRYPOINT /app/run.sh

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

  1. docker build --build-arg="PY_VERSION=3.10" .
  2. docker build --build-arg="PY_VERSION=3.9" .
  3. docker build --build-arg="PY_VERSION=3.8" .


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

展开查看全部

相关问题