Packer尽管存在sudo,但我的docker构建失败并显示错误“ sudo:未找到”

时间:2019-04-12 02:27:48

标签: docker packer

我正在尝试构建带有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

有问题的脚本不是我的脚本之一。这是一些随机生成的脚本,每次构建时,该脚本都有一系列不同的四个数字。我是Packer和Docker的新手,所以也许问题出在哪里很明显,但对我而言却不是。

1 个答案:

答案 0 :(得分:1)

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

  1. 您可能需要在调用apt-get update之前运行apt-get install sudo。否则,即使映像已缓存程序包元数据,它也可能是过时的。如果我尝试使用您的输入来构建图像,则会失败,并显示以下信息:

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

    apt-get -y安装sudo

    RUN连接到终端的情况下,这将阻止其提示确认。这不是对输入内容的必需的更改,但我认为明确表示好。

  3. 基于the docs和我的测试,您不能在docker builder的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" } ]] } 预配器中。

进行这些更改后,以下输入将成功构建映像:

{{1}}

NB :已通过Packer v1.3.5测试)