【问题标题】:Packer - sudo/su condition for buildersPacker - 建造者的 sudo/su 条件
【发布时间】:2016-10-19 13:15:09
【问题描述】:

我刚开始使用 Packer,想构建 AMI 和 Docker 映像。

问题是 - Docker 的 Ubuntu 映像没有 sudo,因此 - 构建失败并出现错误:

docker: /tmp/script_2085.sh: 3: /tmp/script_2085.sh: sudo: 未找到

是否有任何方法可以为shell 配置程序添加一些“条件”以在有或没有sudo 的情况下运行cmds,具体取决于builder

目前 - 我的模板有:

  ...
  "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 有能力以更好的方式做到这一点。

【问题讨论】:

    标签: packer


    【解决方案1】:

    为什么不直接在 docker 框中安装 sudo。 您可以通过以下两种方式之一执行此操作:


    运行脚本以在您的 docker 映像上安装 sudoonly

    您可以使用配置器中的only 参数在图像上安装sudo

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

    更多信息请参见打包程序文档here,位于“在特定版本上运行”下。


    在配置脚本的开头安装 sudo

    在您的第一个配置脚本的开头,添加命令以安装sudo(如果尚未安装)。使用以下内容(取自here):

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

    检查已安装包的列表,如果 sudo 不存在则安装。


    就个人而言,我倾向于选择第一个选项,因为它明确指出应该在某些盒子上做某事。没有混淆的余地。

    离别笔记

    • 请记住,您的供应商将按照您在打包程序文件中定义的顺序运行。所以请确保在第一个中安装sudo
    • 您可能还需要在安装之前运行apt-get update

    【讨论】:

      猜你喜欢
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2022-08-18
      • 2013-09-21
      • 1970-01-01
      相关资源
      最近更新 更多