在Alpine中安装较旧的软件包版本

问题描述

最近(9月5日),Alpine Linux软件包回购已更新为postgresql-client 12.4

我在Dockerfile(apk add postgresql-client=~12.3)中引用版本12.3。现在无法安装该版本吗?

我想更新我的时间和条款,为什么我现在必须被迫更新?我可以添加使用旧版本的另一个存储库吗?

谢谢

解决方法

不幸的是,Alpine软件包总是在适当的地方更新为最新版本,而旧版本则被丢弃。这确实很痛苦……

通常,在更新软件包时,它会使用与其兼容的所有Alpine发行版进行更新。例如,postgresql-client在边缘v3.12和v3.11上被撞到12.4-r0,但是在Alpine v3.10仓库中,您仍然会找到11.9-r0。如果足够的话,可以使用以下方法从所需的存储库中安装旧版本,只要它可以持续使用即可:

apk add postgresql-client=11.9-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.10/main

但是,由于12.3不再存在于Alpine官方存储库中,因此您可以依靠外部Docker映像。

幸运的是,postgres官方图像带有版本标签,您可以找到所需的用于12.3的Alpine图像:

$ wget -q https://registry.hub.docker.com/v1/repositories/postgres/tags -O - | jq -r '.[].name' | grep 12.3
12.3  
12.3-alpine

因此,您可以使用FROM:postgres:12.3-alpine从中获取所需版本。

在更困难的情况下,Alpine软件包版本已更新,而在其他映像中找不到,唯一的办法可能是从源代码构建。

,

例如;目前最新的 dnsmasq 版本在 2.84-r0 中,如果您安装 2.83-r0,将:

$ docker run --rm -ti alpine:3.13
$ apk add 'dnsmasq-dnssec==2.83-r0'
fetch https://mirrors.aliyun.com/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.aliyun.com/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
ERROR: unable to select packages:
  dnsmasq-dnssec-2.84-r0:
    breaks: world[dnsmasq-dnssec=2.83-r0]

最好的方法是使用早期版本的存储库,在网站 https://pkgs.alpinelinux.org/packages 上搜索旧版本,会在 2.83-r0 中找到 https://pkgs.alpinelinux.org/packages?name=dnsmasq&branch=v3.12。 所以添加旧仓库

$ echo 'http://dl-cdn.alpinelinux.org/alpine/v3.12/main' >> /etc/apk/repositories
$ apk add 'dnsmasq-dnssec==2.83-r0'
fetch http://mirrors.aliyun.com/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/3) Installing gmp (6.2.0-r0)
(2/3) Installing nettle (3.5.1-r1)
(3/3) Installing dnsmasq-dnssec (2.83-r0)
Executing dnsmasq-dnssec-2.83-r0.pre-install
Executing busybox-1.31.1-r16.trigger
OK: 7 MiB in 17 packages