![官方 Ubuntu AWS AMI 上的 `apt-get update` 行为不一致](https://linux22.com/image/719333/%E5%AE%98%E6%96%B9%20Ubuntu%20AWS%20AMI%20%E4%B8%8A%E7%9A%84%20%60apt-get%20update%60%20%E8%A1%8C%E4%B8%BA%E4%B8%8D%E4%B8%80%E8%87%B4.png)
apt
我在官方 Ubuntu 镜像 ( ) 上遇到各种不一致的错误ami-83e769fb
。我使用 Packer 构建我的 AMI,大约 40% 的时间会失败。重新运行脚本即可成功。
我的脚本运行:
sudo apt-get clean all
sudo apt-get update
在安装任何软件包之前。
有时我会收到此错误:
amazon-ebs: W: GPG error: http://archive.ubuntu.com/ubuntu artful InRelease: Splitting up /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_artful_InRelease into data and signature failed
amazon-ebs: E: The repository 'http://archive.ubuntu.com/ubuntu artful InRelease' is not signed.
有时候apt-get update
会命中http://us-west-2.ec2.archive.ubuntu.com/ubuntu
,有时候则不会。
其他时候包裹丢失(如apache2
或python3
)。
我不明白为什么这种行为不一致。
如何才能使apt-get update
官方的 Ubuntu AMI 持续工作?
答案1
如果您正在使用,cloud-init
您可以等待它完成。
while [ ! -f /var/lib/cloud/instance/boot-finished ]; do
echo 'Waiting for cloud-init...'
sleep 1
done
例如打包程序 json:
{
"type": "shell",
"inline": [
"while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done"
]
}
参考:
答案2
提供之前的 packer.json:
"provisioners": [
{
"type": "shell",
"inline": ["/usr/bin/cloud-init status --wait"]
},
答案3
我自己也遇到了这个问题,我认为发生这种情况的原因是 cloud-init 在apt-get
运行时仍在配置 EC2 实例。我通过在实例启动后立即运行的脚本中插入 30 秒延迟来解决这个问题。我认为更好的方法是要求 cloud-init 运行任何脚本,User Data
甚至让它为您处理软件包安装和更新 [1]。对于我的用例,我不想确认 cloud-init,添加延迟是一个可接受的解决方案。