首页 > 解决方案 > 尽管存在 sudo,但 Packer 使我的 docker 构建失败并出现错误“sudo:未找到”

问题描述

我正在尝试在其上构建一个带有 docker 的打包程序映像,并且我希望 docker 使用自定义脚本创建一个 docker 映像。我的代码的相关部分是(请注意,顶级构建器会仔细检查 sudo 是否已安装):

{
  "type": "shell",
  "inline": [
    "apt-get install sudo"
  ]
},
{
  "type": "docker",
  "image": "python:3",
  "commit": true,
  "changes": [
    "RUN pip install Flask",
    "CMD [\"python\", \"echo.py\"]"
  ]
}

我的屏幕输出的相关部分是:

==> docker: provisioning with shell script: /var/folders/s8/g1_gobbldygook/T/packer-shell23453453245
    docker: /temp/script_1234.sh: 3: /tmp/script_1234.sh: sudo: not found
==> docker: killing the contaner: 34234hashvomit234234
Build 'docker' errored: Scipt exited with non-zero exit status: 127

有问题的脚本不是我的脚本之一。这是一些随机生成的脚本,每次构建时都有不同的四个数字系列。我对打包机和码头工人都是新手,所以问题出在哪里很明显,但对我来说不是。

标签: dockerpacker

解决方案


您的打包程序输入似乎存在一些问题。由于您没有包含完整的输入文件,因此很难判断,但请注意以下几点:

  1. 您可能需要apt-get update在调用apt-get install sudo. 没有它,即使图像缓存了包元数据,它也可能是陈旧的。如果我尝试使用您的输入构建图像,则会失败:

    E: Unable to locate package sudo
    
  2. 虽然在这种情况下不是问题,但当您以非交互方式运行它时,最好-y在命令行中显式包含:apt-get

    apt-get -y 安装 sudo

    apt-get连接到终端的情况下,这将阻止它提示确认。这不是对您的输入的必要更改,但我认为明确说明是件好事。

  3. 根据文档和我的测试,您不能在docker builderRUN的块中包含语句。changes那失败了:

    Stderr: Error response from daemon: run is not a valid change command
    

    幸运的是,我们可以将该pip install命令移动到shell配置器中。

通过这些更改,以下输入成功构建了图像:

{
    "builders": [{
        "type": "docker",
        "image": "python:3",
        "commit": true
    }],

    "provisioners": [{
        "type": "shell",
        "inline": [
          "apt-get update",
          "apt-get -y install sudo",
          "pip install Flask"
        ]
    }],

    "post-processors": [[ {
        "type": "docker-tag",
        "repository": "packer-test",
        "tag": "latest"
    } ]]
}

注意:使用 Packer v1.3.5 测试)


推荐阅读