Alpine Docker image FROM python:3.x-alpine3.x 使用与说明不同的 Python 包版本

Alpine Docker image FROM python:3.x-alpine3.x uses different package version for Python than stated

如果我基于 Alpine 构建最简单的 docker 图像,其中包括 Python:

FROM python:3.7-alpine3.9

能成功进入,验证安装的版本是3.7:

/ # python --version
Python 3.7.3
/ # python3 --version
Python 3.7.3

但是,如果我安装一些需要 Python3 的包,例如 python3-dev(其他包需要)或 Python3 本身,Alpine 不使用 3.7 版但出于某种我不明白的原因使用 3.6:

/ # apk add python3-dev
(1/3) Installing pkgconf (1.6.0-r0)
(2/3) Installing python3 (3.6.8-r2)
(3/3) Installing python3-dev (3.6.8-r2)
Executing busybox-1.29.3-r10.trigger
OK: 108 MiB in 38 packages

printenv 还显示(在 docker 图像构建期间)版本 3.7.x 被使用,但包系统没有反映这一点。摘录:

PYTHON_VERSION=3.7.3

我看到 here 有 Python 3.6 作为所有 Alpine 3.9 版本的默认版本。 Python 3.7 仅适用于 "edge"。

我还找到了 的答案,但它也不起作用:

# apk add python3 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
(1/1) Installing python3 (3.6.8-r2)

Python 3.6 已安装。但是,如果我使用没有 Python FROM alpine:3.9 的最简单的 Alpine 并使用相同的命令,则会安装 Python 3.7:

# apk add python3 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main
<TRIMMED_TEXT>
(11/11) Installing python3 (3.7.3-r0)

如何告诉 python:3.7-alpine3.9 中的包管理器使用 Python 3.7 而不是 Python 3.6?

您需要 python 3.7 版吗?您可以使用 3.6 版,它存在:https://hub.docker.com/_/python/?tab=tags&page=3

FROM python:3.6-alpine3.9

FROM python:3.6.8-alpine
FROM python:3.6-alpine
FROM python:3.6.8-alpine3.9

如果您事先删除 (virtual) .python-rundeps 软件包,安装将按您的预期进行。

FROM python:3.7-alpine3.9

RUN \
    apk update \
    && apk del .python-rundeps \
    && apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main \
        python3-dev=3.7.3-r0

构建此映像会导致:

...
(12/13) Installing python3 (3.7.3-r0)
...