最近(9月5日),Alpine Linux软件包仓库已更新为postgresql-client 12.4
在我的Dockerfile中,我引用的是版本12.3 (apk add postgresql-client=~12.3
)。现在还能安装那个版本吗?
我想根据我的时间和条件进行更新,为什么现在要强制更新?有没有其他仓库可以添加以使用旧版本?
谢谢
最近(9月5日),Alpine Linux软件包仓库已更新为postgresql-client 12.4
在我的Dockerfile中,我引用的是版本12.3 (apk add postgresql-client=~12.3
)。现在还能安装那个版本吗?
我想根据我的时间和条件进行更新,为什么现在要强制更新?有没有其他仓库可以添加以使用旧版本?
谢谢
很遗憾,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
来获取所需版本。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
以下是基于@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 .
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-r0
和postgresql15-dev-15.1-r0:
包等)。