Packer - 构建器的sudo/su条件

4

我刚开始使用 Packer,并希望构建 AMI 和 Docker 镜像。

问题是,Docker 的 Ubuntu 镜像没有 sudo 命令,因此会出现以下错误:

docker: /tmp/script_2085.sh: 3: /tmp/script_2085.sh: sudo: not found

是否有办法为 shell provisioner 添加一些“条件”,以便根据 builder 来运行具有或不具有 sudo 的命令?

目前,我的模板中有:

  ...
  "provisioners": [{
    "type": "shell",
    "inline": [
      "sleep 30",
      "sudo apt-get update",
      "sudo apt-get install -y nginx"
    ]
  }]
  ...

添加类似以下内容:

if which sudo; then sudo apt-get update && sudo apt-get install -y nginx; else apt-get update && apt-get install -y nginx; fi

看起来这是一个奇怪的解决方案... 我相信 - Packer有更好的方法来做到这一点。

1个回答

3

为什么不在Docker容器中安装sudo呢?有两种方法可以实现:


运行一个脚本,在你的Docker镜像上安装sudo

你可以在provisioner中使用only参数,来在一个镜像上安装sudo:

...
"provisioners": [{
  "type": "shell",
  "inline": [
    "apt-get install sudo"
  ],
  "only": ["docker"]
},
  ... other provisioners here ...
]
...

更多信息请参阅packer文档,此处的"Run On Specific Builds"部分。


在provision脚本开始时安装sudo

在您的第一个provision脚本的开头,如果尚未安装,则添加安装sudo的命令。使用以下命令(从这里获取):

dpkg -l | grep -qw sudo || apt-get install sudo

检查已安装软件包的列表,并在没有sudo的情况下安装。
个人而言,我倾向于选择第一种选项,因为它明确表示只应在某些盒子上执行某些操作。没有混淆的余地。 结束语
  • 请注意,你的实施程序将按照你在packer文件中定义的顺序运行。所以请确保在第一个实施程序中安装sudo。
  • 在进行安装之前,你可能还需要运行apt-get update。

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