2016-03-20 08:45:08 +0000 2016-03-20 08:45:08 +0000
102
102

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

我有一个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来说,相当于什么?

答案 (5)

89
89
89
2016-03-29 14:25:32 +0000

你可以这样设置 “粘性 "版本。

# 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 包,请更新你的源代码/软件包数据库。

apk update

软件包库可以在这里找到。

https://pkgs.alpinelinux.org/packages

千万不要从alpine软件包仓库的 "edge "分支中引脚软件包,因为这些软件包还在测试中,可能会被撤销。(在 pkgs.alpinelinux.org/packages ,点击 "edge "并将其改为你使用的 alpine 映像版本,然后再点击 "搜索”)。

17
17
17
2016-03-25 08:30:23 +0000

目前,在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
1
1
2020-02-14 21:42:45 +0000

用apk钉住高山包的语法是apk add packageName==x.y.z

然而,当在docker镜像中钉入高山包时,你必须小心使用与你的镜像相匹配的特定版本,并避免使用edge分支

你可以在 https://pkgs.alpinelinux.org/packages 查看 alpine 包。不幸的是,这默认为edge分支,其中包含可能被撤销的包

https://pkgs.alpinelinux.org/packages ,键入你想要的包的名称,edge更改分支以匹配你正在使用的高山映像版本 ,并设置Arch(架构),然后点击search。(如果你不知道架构,运行容器并输入 uname -m。)

这将向你显示你可以安全地将软件包钉到的**唯一稳定版本。将软件包钉入不同的版本可能会导致你的Dockerfile停止工作,因为有一天软件包会从alpine软件包库中被撤销。

示例:

FROM alpine:3.3
RUN apk update && apk upgrade
RUN apk add --no-cache \
  git==2.8.6-r0 \
  bash==4.3.42-r6 \
  python3==3.5.1-r0
```。
1
1
1
2020-02-26 16:02:56 +0000

Vlad Frolov已经给出了答案。我正在编写docker解决方案。我试图从v3.8仓库中添加一些包。

  • 浏览旧的存档 http://dl-cdn.alpinelinux.org/alpine/ 并获取你的软件的具体版本。
  • 得到软件库版本后,将版本添加到你的docker文件中
  • 从软件库中指定你的软件包的确切版本。
1
1
1
2018-08-21 17:55:01 +0000

因为我使用的是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

然后以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部分,但这些步骤对我来说是有效的。