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


89

Dockerfile要构建一个基于Alpine Linux的Docker映像。现在,我需要为此安装一个软件包Dockerfile

目前我有:

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

显然这是一个坏主意,因为结果是不确定的。取而代之的是,它取决于构建映像的时间点以及git要安装的版本。

正确的做法是什么?

我想,我必须告诉updatedupgradeadd使用哪个版本,但我怎么做到这一点?

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

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

npm install git@1.9.2

(或我想要的任何版本)。对于Alpine Linux,这等效于什么?

Answers:


78

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

# 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中看到它,请更新源/包数据库:

apk update

软件包存储库可以在这里找到

https://pkgs.alpinelinux.org/packages

您确定这可行吗?从这个线程,似乎它实际上并没有做任何事情:forum.alpinelinux.org/forum/general-discussion/...
特拉维斯里德

2
@TravisR在这里查看Alpine APK文档。
kaiser

就我而言,它帮助将阿尔卑斯山3.7降级为阿尔卑斯山3.6!
DUzun

Semver tilde范围也按其apk add ansible~=2.4.1含义工作>=2.4.1 <2.5.0。查看jubianchi.github.io/semver-check以测试您自己的范围。
Mike D

包含可用软件包pkgs.alpinelinux.org/packages列表的回购对我来说最有帮助。
Egel

16

当前,无法在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

1

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

转到包装详细信息。例如:

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

然后packager在与APKBUILD文件相同的目录中进行构建:

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零件,但是这些步骤对我有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.