wake-up-neo.com

如何在Alpine中安装特定的软件包版本?

我有一个Dockerfile来构建一个基于Alpine Linux的Docker镜像。现在我需要安装一个包作为Dockerfile的一部分。

目前我有:

RUN apk update && \
    apk upgrade && \
    apk add git

显然这是一个坏主意,因为结果是不确定的。相反,它取决于我构建映像的时间点,git的安装版本。

这样做的正确方法是什么?

我想我必须告诉updatedupgradeadd使用哪些版本,但我该怎么做?

我已经看到apk支持存储库的固定,但这不是我想要的(至少我是这么认为的),因为我不想固定存储库,而是一个包。

换句话说:如果git可以通过npm安装,我将能够运行:

npm install [email protected]

(或者我想要的任何版本)。对于Alpine Linux来说,这相当于什么?

77
Golo Roden

你可以像这样设置“粘性”版本:

# Both are equal
apk add packagename=1.2.3-suffix
apk add 'packagename<1.2.3-suffix'

这将仅将包升级到指定版本。然后你可以安全地使用......

apk upgrade

升级所有软件包,而带有版本的软件包将保留其版本。设置最小版本只需使用...

apk add "packagename>1.2.3-suffix"

如果您无法找到包,而您可以在用于Alpine包的UI中看到它,请更新您的sources/package数据库:

apk update

可以找到包存储库这里

https://pkgs.alpinelinux.org/packages
66
kaiser

目前,无法从Alpine Linux中的官方存储库安装任意旧版本的软件包。您可以实现的最好的事情是使用早期版本的存储库:

# cat /etc/Alpine-release
3.3.3

# echo 'http://dl-cdn.alpinelinux.org/Alpine/v3.2/main' >> /etc/apk/repositories

# apk update
fetch http://dl-cdn.alpinelinux.org/Alpine/v3.3/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/Alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/Alpine/v3.2/main/x86_64/APKINDEX.tar.gz

# apk add bash==4.3.33-r0
(1/1) Updating pinning bash (4.3.33-r0)
OK: 13 MiB in 17 packages

# apk add bash==4.3.42-r3
(1/2) Upgrading bash (4.3.33-r0 -> 4.3.42-r3)
Executing bash-4.3.42-r3.post-upgrade
(2/2) Purging ncurses5-libs (5.9-r1)
Executing busybox-1.24.1-r7.trigger
OK: 13 MiB in 16 packages
13
Vlad Frolov

因为我使用的是testing repo。我最终建立了自己的副本。脚步:

转到包装细节。例如:

https://pkgs.alpinelinux.org/package/Edge/testing/armhf/watchman

单击提交,单击APKBUILD文件链接和菜单上的“日志”以获取APKBUILD文件的提交日志。然后为您的APKBUILD文件选择一个提交并下载它。例如:

https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

安装构建工具:

apk -U add Alpine-sdk

您需要不是root用户,因此使用密码创建packager用户:

adduser -D packager && addgroup packager abuild
passwd packager

然后在与APKBUILD文件相同的目录中将其构建为packager

su - packager
abuild-keygen -a -i
abuild -r

您可能需要弄清楚错误并安装依赖项。在我的示例中,我需要在现有的Docker镜像上执行此操作root

apk add python-dev

成功构建为packager后,将其安装为root

apk add /home/packager/packages/<something...>/watchman-4.7.0-r0.apk --allow-untrusted

不知道如何删除--allow-untrusted部分,但步骤对我有用。

1
s12chung