我正在尝试为已安装的 Arch Linux 映像创建 Dockerfile iptables-nft
。如果我以交互方式运行Docker 映像,archlinux
然后pacman -Syu iptables-nft
,系统会询问我iptables-nft-1:1.8.10-2 and iptables-1:1.8.10-2 are in conflict. Remove iptables? [y/N]
。Proceed with installation? [Y/n]
对这两个问题都回答是,就可以满足我的要求。
当我尝试在 Dockerfile 中编写脚本时,问题就出现了,我无法以交互方式回答这些问题。我的第一次尝试是RUN pacman --noconfirm -Syu iptables-nft
,但这行不通,因为这--noconfirm
意味着要使用默认答案,而第一个问题的默认答案是否定的。然后我尝试iptables
在安装之前先删除iptables-nft
,但iproute2
依赖于iptables
或iptables-nft
,并且base
依赖于iproute2
。
这让我想到了一些在技术上可行的方法,但所有这些方法都让我感到担忧:
RUN yes | pacman -Syu iptables-nft
可以,但是y
如果 pacman 问的是非是非否的问题,则盲目地回答它会破坏它所问的任何问题,并且如果它问除了“删除 iptables?”之外的任何默认否的问题,那么盲目地回答它们是也可能是不好的。RUN pacman --noconfirm -Rdd iptables && pacman --noconfirm -Syu iptables-nft
可以工作,但如果iptables
得到任何iptables-nft
不满足的依赖关系,我的系统就会崩溃,而且如果安装任何软件包只是因为旧软件包iptables
需要它们,它们就会被无限期地遗留。RUN pacman --noconfirm -Rsdd iptables && pacman --noconfirm -Syu iptables-nft
可以工作,但是它具有与#2相同的系统损坏风险,并且它还会卸载一堆其他软件包然后立即重新安装它们。
有没有比上述任何一种更好的解决方案?理想情况下,我只想要一个 pacman 等价物dnf swap
,但我找不到任何这样的东西。