如何使用通过 `apk` `--force-broken-world` 标志安装的二进制文件

Zak*_*Zak 8 ash docker alpine-linux alpine-package-keeper

我一直在阅读 的man页面apk add,但我不完全理解如何使用该--force-broken-world标志。

我试图将 Python 2.7.6 安装到 Alpine 映像中,但出现以下错误。

$ docker run --rm -it alpine:latest apk add --no-cache python=2.7.6
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
ERROR: unsatisfiable constraints:
  python2-2.7.14-r2:
    breaks: world[python=2.7.6]
Run Code Online (Sandbox Code Playgroud)

但是,我可以强制安装它,但我不确定它在做什么(如果有的话)。

$ docker run --rm -it alpine:latest apk add --force-broken-world --no-cache python=2.7.6
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
OK: 4 MiB in 11 packages
Run Code Online (Sandbox Code Playgroud)

从命令行来看,一切看起来都很好。但是,当您在容器内执行此操作时,python似乎并未安装。

$ docker run --rm -it alpine:latest /bin/ash
# apk add --force-broken-world --no-cache python=2.7.6
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
OK: 4 MiB in 11 packages
# python --version
/bin/ash: python: not found
# find / -name ash
/bin/ash
# find / -name python
#
Run Code Online (Sandbox Code Playgroud)

所以问题是,这面--force-broken-world旗帜到底有什么作用,我还需要采取哪些其他步骤来修复我破碎的世界?

Ric*_*kow 0

世界文件保存了您想要添加的所有包。因此,如果您通过添加新包,apk add它将被添加到世界文件中:

世界档案:

# cat /etc/apk/world
alpine-baselayout
alpine-keys
apk-tools
busybox
libc-utils
Run Code Online (Sandbox Code Playgroud)

现在添加一个包并查看世界文件中的差异:

/ # apk add binutils
(1/5) Installing libgcc (13.2.1_git20231014-r0)
(2/5) Installing jansson (2.14-r4)
(3/5) Installing libstdc++ (13.2.1_git20231014-r0)
(4/5) Installing zstd-libs (1.5.5-r8)
(5/5) Installing binutils (2.41-r0)
Executing busybox-1.36.1-r15.trigger
OK: 24 MiB in 20 packages
/ # cat /etc/apk/world
alpine-baselayout
alpine-keys
apk-tools
binutils
busybox
libc-utils
Run Code Online (Sandbox Code Playgroud)

如果您正在安装一个不可用的软件包,就像python在这种情况下一样,它不会被添加到世界文件中:

/ # apk add python=2.7.6
ERROR: unable to select packages:
  python (no such package):
    required by: world[python=2.7.6]
/ # cat /etc/apk/world
alpine-baselayout
alpine-keys
apk-tools
binutils
busybox
libc-utils
Run Code Online (Sandbox Code Playgroud)

但是,如果您force-broken-world添加它,无论它是否可用:

/ # apk add --force-broken-world python=2.7.6
OK: 24 MiB in 20 packages
/ # cat /etc/apk/world
alpine-baselayout
alpine-keys
apk-tools
binutils
busybox
libc-utils
python=2.7.6
Run Code Online (Sandbox Code Playgroud)

现在这不会改变包的可用性,这意味着你仍然不会从中获得 python,只是当你apk add下次运行时没有任何其他参数时,它会再次尝试安装它,但仍然发现它不存在:

/ # apk add
ERROR: unable to select packages:
  python (no such package):
    required by: world[python=2.7.6]
Run Code Online (Sandbox Code Playgroud)

有各种用例,例如,如果您构建了需要安装的软件包列表,这些软件包可能在您构建的机器上不可用,因为您无法连接到存储库,但稍后将可用。

如果你想“修复”你破碎的世界,你可以使用任何选择的文本编辑器从世界文件中删除包。

进一步阅读:https ://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html#_world