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

6

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

在我的Dockerfile中,我引用的是版本12.3 (apk add postgresql-client=~12.3)。现在还能安装那个版本吗?

我想根据我的时间和条件进行更新,为什么现在要强制更新?有没有其他仓库可以添加以使用旧版本?

谢谢

4个回答

10

很遗憾,Alpine软件包总是更新到最新版本,并且旧版本会被丢弃。这可能会很痛苦...

通常情况下,当一个软件包被更新时,它会与所有兼容的Alpine发行版一起更新。例如,postgresql-client在edge、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 官方镜像具有版本标签,您可以找到所需的 Alpine 镜像版本 12.3:

$ 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 包版本已更新且无法在其他镜像中找到,唯一的选择可能是从源代码构建。

3
例如:最新的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上搜索旧版本,将在https://pkgs.alpinelinux.org/packages?name=dnsmasq&branch=v3.12中找到2.83-r0版本。因此,请添加旧的存储库。

$ 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

2

以下是基于@valiano的答案的另一种解决方案。

升级postgresql到更高版本时,建议使用更高版本的pg_dump二进制文件。但是如何将它们添加到您的镜像中呢? 以下方法适合我:

Dockerfile:

ARG VERSION=10
ARG UPGRADE_VERSION=11
ARG TYPE
###############################################################
# Normal server
###############################################################
FROM postgres:${VERSION}-alpine AS server

RUN apk update \
 && apk add --upgrade apk-tools \
 && apk upgrade --available

COPY /rootfs/ /

###############################################################
# Upgrade version with upgrade executables
###############################################################
FROM postgres:${UPGRADE_VERSION}-alpine AS upgrade_version
RUN apk update \
 && apk add --upgrade apk-tools \
 && apk upgrade --available

###############################################################
# Add postgresql upgrade client executables to upgrade_server_layer
###############################################################
FROM server AS upgrade_server

RUN mkdir -p /usr/local/postgresql/upgrade
COPY --from=upgrade_version /usr/local/bin/pg* /usr/local/postgresql/upgrade/

###############################################################
# Final version
###############################################################
FROM ${TYPE}server AS final

然后按照以下方式构建您的普通服务器:

docker build --build-arg TYPE= --build-arg VERSION=11 --build-arg UPGRADE_VERSION=12 -t my_normal_server:11 .

需要一个带有升级二进制文件的服务器,以生成转储文件:

docker build --build-arg TYPE=upgrade_ --build-arg VERSION=10 --build-arg UPGRADE_VERSION=11 -t my_upgrade_server:10 .

如果当前版本为PostgreSQL 10,您想要升级到11,请参考以下步骤:
  1. 构建一个升级版本和一个正常版本。
  2. 停止PostgreSQL 10容器,并将其替换为my_upgrade_version:10。
  3. 使用 /usr/local/postgresql/upgrade/pg_dump 创建一个转储文件。
  4. 创建一个新的PostgreSQL 11容器,使用my_normal_version:11访问转储文件,并使用pg_restore还原创建的转储文件。

注意:请保留HTML标签,但不要写解释。

0
关于创建固定程序包版本的干净单一入口:
我使用以下方法,我有一个.env文件,其中存储了PG主要和次要版本。我只需要更新.env文件条目以及重建我的镜像,即可升级Postgres。 只要程序包与dockerhub中对应版本的PG版本存在,并且PG版本本身没有被alpine存储库或其他因素弃用:
第一步:在.env文件中指定PG版本作为唯一入口点:
PG_MAJOR_VERSION=14
PG_MINOR_VERSION=5

步骤2:在docker-compose中引用db-package:

services:
  db:
    image: postgres:${PG_MAJOR_VERSION}.${PG_MINOR_VERSION}-alpine

第三步:如果需要,在 Dockerfile 中使用变量本身:

ARG RUBY_VERSION
ARG DISTRO_NAME

FROM ruby:${RUBY_VERSION}-${DISTRO_NAME}

# Need to define the args again:
ARG DISTRO_NAME
ARG PG_MAJOR_VERSION

RUN apk add --update build-base bash bash-completion libffi-dev tzdata postgresql$PG_MAJOR_VERSION-client postgresql$PG_MAJOR_VERSION-dev nodejs npm yarn

NB!FROM子句将丢失其前定义的ARG变量。因此,如果您后续需要它们,则需要在FROM子句之后重新定义它们。更多详细信息请参见Github问题

根据您希望安装的软件包,您可以指定所需的小版本或其他后缀(例如对于postgresql15-client-15.1-r0postgresql15-dev-15.1-r0:包等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接