docker - 尽管存在 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
有问题的脚本不是我的脚本之一。这是一些随机生成的脚本,每次构建时都有不同的四个数字系列。我对打包机和码头工人都是新手,所以问题出在哪里很明显,但对我来说不是。
解决方案
您的打包程序输入似乎存在一些问题。由于您没有包含完整的输入文件,因此很难判断,但请注意以下几点:
您可能需要
apt-get update
在调用apt-get install sudo
. 没有它,即使图像缓存了包元数据,它也可能是陈旧的。如果我尝试使用您的输入构建图像,则会失败:E: Unable to locate package sudo
虽然在这种情况下不是问题,但当您以非交互方式运行它时,最好
-y
在命令行中显式包含:apt-get
apt-get -y 安装 sudo
在
apt-get
连接到终端的情况下,这将阻止它提示确认。这不是对您的输入的必要更改,但我认为明确说明是件好事。根据文档和我的测试,您不能在docker builder
RUN
的块中包含语句。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 测试)
推荐阅读
- swagger - 如何组合多个招摇的文件?
- c++ - 从 C++ 中的三元素映射中提取第二个元素
- javascript - AngularJS:跨多个 div 的 ng-repeat
- c++ - boost::spirit::x3 解析比 strsep 解析慢
- node.js - MAC:NPM 全局安装模块但找不到命令
- web - 谷歌索引错误的网页
- ruby-on-rails - Rails5、Webpacker 和 webpacker 开发服务器
- python - KeyError: 'col' 'occured at index col' 在应用函数期间
- javascript - Bootstrap3,具有透明覆盖的模态,但也可以通过在模态外部单击来关闭它
- angular - Click 事件不适用于 Angular 5 中动态生成的元素