我有一个Dockerfile
来构建一个基于Alpine Linux的Docker镜像。现在我需要安装一个包作为Dockerfile
的一部分。
目前我有:
RUN apk update && \
apk upgrade && \
apk add git
显然这是一个坏主意,因为结果是不确定的。相反,它取决于我构建映像的时间点,git
的安装版本。
这样做的正确方法是什么?
我想我必须告诉updated
,upgrade
和add
使用哪些版本,但我该怎么做?
我已经看到apk
支持存储库的固定,但这不是我想要的(至少我是这么认为的),因为我不想固定存储库,而是一个包。
换句话说:如果git
可以通过npm
安装,我将能够运行:
npm install [email protected]
(或者我想要的任何版本)。对于Alpine Linux来说,这相当于什么?
你可以像这样设置“粘性”版本:
# 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
目前,无法从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
因为我使用的是testing
repo。我最终建立了自己的副本。脚步:
转到包装细节。例如:
https://pkgs.alpinelinux.org/package/Edge/testing/armhf/watchman
单击提交,单击APKBUILD文件链接和菜单上的“日志”以获取APKBUILD文件的提交日志。然后为您的APKBUILD文件选择一个提交并下载它。例如:
安装构建工具:
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
部分,但步骤对我有用。