我有一个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,这等效于什么?

#1 楼

您可以像这样设置“粘性”版本:
# 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

千万不要从高山软件包仓库的“ edge”分支中获取引脚软件包,因为这些软件包正在测试中,可能会被撤销。 (在pkgs.alpinelinux.org/packages中,单击“边缘”并将其更改为您使用的高山图像版本,然后再次单击“搜索”。)

cowlinator的其他信息
固定精确版本的软件包可能会导致该软件包将从回购中删除的风险,并且您的Dockerfile将来将无法构建。官方建议可在此处阅读,请参见以下引文。
或者,您可以直接设置最低软件包版本,而不是确切版本。

目前我们没有足够的资源来存储我们在下文中无限期地构建所有软件包。因此,我们目前只为每个稳定分支保留最新信息,并且一直都是这样。

讨论了将来将所有软件包标记为Alpine的问题。但是,这仍然是“进行中”。官方建议是保留您自己的镜像/存储库,其中包含您可能要使用的所有特定软件包及其版本。

-TimoTeräs,@ fabled(高山)

可以在此自托管的GitLab实例上找到完整的Alpine Linux组织存储库。

评论


您确定这可行吗?从这个线程看来,它实际上并没有执行任何操作:forum.alpinelinux.org/forum/general-discussion / ...

–特拉维斯·里德(Travis Reeder)
17年11月16日在18:23

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

– kaiser
17年11月18日在1:26

Semver波浪号范围也可以在APK中添加ansible〜= 2.4.1,即> = 2.4.1 <2.5.0。查看jubianchi.github.io/semver-check以测试您自己的范围。

– Mike D
18年5月13日在12:17



@WillVousden您在这里阅读此评论吗?他们不会删除软件包,但是您需要精心制作Docker映像。

– kaiser
19-10-18在21:22



@cowlinator尽管您的编辑被某些用户拒绝(它删除了其他相关信息),但我在问题的末尾添加了其他信息。恕我直言,很高兴知道信息。感谢您在这里的努力!

– kaiser
20年5月11日在21:07

#2 楼

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


评论


这显示了使用v3.3 Alpine Linux时如何从Alpine软件包仓库的v3.2分支中提取示例。请注意,正式不支持混合使用分支/版本。

–拨浪鼓
20-2-14在22:10



#3 楼

使用apk固定高山软件包的语法是apk add packageName=x.y.z
要设置最低版本,请使用apk add packageName>x.y.z
示例:
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

但是,官方的Alpine软件包回购可以删除任何软件包版本从任何分支。这意味着,如果将软件包固定到Dockerfile中的确切版本,则Dockerfile将来可能无法工作。
固定确切软件包版本的官方建议是保留所有特定软件包的镜像/存储库及其您可能要使用的版本。
或者,您可以使用最低软件包版本而不是确切的固定软件包版本。

#4 楼

弗拉德·弗罗洛夫(Vlad Frolov)已经给出了答案。我正在写Docker解决方案。我试图从v3.8存储库中添加一些软件包。


浏览旧档案http://dl-cdn.alpinelinux.org/alpine/并获取软件的特定存储库版本。
获取后存储库版本,在您的docker文件上添加版本

从存储库中指定软件包的确切版本

RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.8/main' >> /etc/apk/repositories
RUN apk update
RUN apk --no-cache add ca-certificates=20190108-r0 gettext=0.19.8.1-r2 postfix=3.3.0-r4 rsyslog=8.34.0-r1 libsasl=2.1.26-r15




#5 楼

因为我正在使用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


然后构建它与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零件,但是这些步骤对我有用。

评论


您可以删除--allow-untrusted部分,方法是将您之前将要添加的软件包添加到/ etc / apk / keys路径中的命令abuild-keygen -a -i复制到机器中,从而删除--allow-untrusted部分。 。 apk找到用于对“打包程序”用户的程序包进行签名的密钥,并能够对其进行验证。

– Francesco Colista
1月1日10:26