我正在尝试构建带有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的新手,所以也许问题出在哪里很明显,但对我而言却不是。
答案 0 :(得分:1)
您的打包程序输入似乎存在一些问题。由于您尚未包含完整的输入文件,因此很难说,但是请注意以下几点:
您可能需要在调用apt-get update
之前运行apt-get install sudo
。否则,即使映像已缓存程序包元数据,它也可能是过时的。如果我尝试使用您的输入来构建图像,则会失败,并显示以下信息:
E: Unable to locate package sudo
在这种情况下这不是问题,但是当您非交互式地运行-y
命令行时,最好在apt-get
命令行中显式包含apt-get
:
apt-get -y安装sudo
在RUN
连接到终端的情况下,这将阻止其提示确认。这不是对输入内容的必需的更改,但我认为明确表示好。
基于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测试)