Vagrant抑制shell provisioner的非零退出状态

6

我正在vagrant中使用脚本配置,我的虚拟机是64位的ubuntu Precise版本。相关的脚本行看起来像这样:

sudo bash -c 'echo "deb https://oss.oracle.com/debian/ unstable main non-free" >/etc/apt/sources.list.d/oracle.list'
wget -q https://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -

sudo apt-get update -qq

错误代码为:
W: GPG error: https://oss.oracle.com unstable Release: The following signatures were invalid: KEYEXPIRED 1378511808 KEYEXPIRED 1378511808 KEYEXPIRED 1378511808
W: Failed to fetch https://oss.oracle.com/debian/dists/unstable/main/binary-amd64/Packages  The requested URL returned error: 404

W: Failed to fetch https://oss.oracle.com/debian/dists/unstable/non-free/binary-amd64/Packages  The requested URL returned error: 404

E: Some index files failed to download. They have been ignored, or old ones used instead.
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

问题在于,尽管我知道该存储库存在过期的密钥并且不支持64位架构(仅支持32位),但我仍然想从中安装相关软件包(使用:<package_name>:i386)。然而,在更新过程中,由于非退出状态,vagrant停止执行并不再继续我的脚本。
是否有一种方法(无论是通过vagrant还是通过apt-get)可以使vagrant保持愉快并继续执行我的脚本?
2个回答

16

您可以使用 true 来强制将错误状态设置为

sudo sh -c "apt-get update -qq ; true"

1
感谢您的建议。仍需使用 | 而不是 ; 。请查看更新后的答案。 - Peter Butkovic
因为使用 ;,Vagrant 会检测到非零状态并再次失败。但是,使用 | 时,Vagrant 必须一次性执行所有命令 => 没有机会检测链中不在末尾的命令的退出状态。这就是原因。请注意,如果您将答案保留为现在的样子,它是不正确的。 - Peter Butkovic
@PeterButkovic:你能否检查一下这个命令:sudo sh -c 'apt-get update -qq ; true'?问题在于你用shell覆盖了带有非零退出代码的命令;vargrant看不出任何可疑之处。而且加上 | true 是错误的,因为你会在管道之前失去命令的stdout。 - Igor Chubin
@PeterButkovic:谢谢你,Peter! - Igor Chubin
我很想知道在Windows主机上如何完成这个操作。 - Ben Johnson
1
@BenJohnson:有几种方法可以尝试:ver > nulcmd /c "exit /b 0" 或者 set "errorlevel="。请尝试使用它们。 - Igor Chubin

4
一种比Igor建议更简单的方法是将其作为布尔语句处理:
apt-get update -qq || true

这样可以避免调用不必要的子shell。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接