带有容器堆栈和入口点指令的Heroku继续运行/垃圾箱/垃圾箱-c“;
我将首先介绍Heroku文档中有关Docker部署的容器注册和运行时的相关章节 该节指出:带有容器堆栈和入口点指令的Heroku继续运行/垃圾箱/垃圾箱-c“;,heroku,containers,docker-entrypoint,Heroku,Containers,Docker Entrypoint,我将首先介绍Heroku文档中有关Docker部署的容器注册和运行时的相关章节 该节指出: 入口点是可选的。如果未设置,将使用/bin/sh-c CMD将始终由shell执行,以便生成配置变量 可用于您的流程;执行单个二进制文件或使用图像 如果没有外壳,请使用ENTRYPOINT 我想强调最后一句话(加上强调): 要执行单个二进制文件或使用不带外壳的图像,请使用入口点 此外,在本节中 SHELL-Docker图像的默认SHELL为/bin/sh,您可以覆盖 如有必要,使用ENTRYPO
入口点是可选的。如果未设置,将使用
/bin/sh-c
将始终由shell执行,以便生成配置变量 可用于您的流程;执行单个二进制文件或使用图像 如果没有外壳,请使用CMD
ENTRYPOINT
入口点
此外,在本节中
-Docker图像的默认SHELL为SHELL
,您可以覆盖 如有必要,使用/bin/sh
ENTRYPOINT
入口点
指令,那么Heroku的容器堆栈将不使用/bin/sh
执行命令。但显然,我的理解是错误的,因为这似乎仍在发生
下面是我的Dockerfile的示例:
FROM golang:1.14 as build
# ... builds the binary
FROM scratch
# ... other irrelevant stuff
COPY --from=build /myprogram /myprogram
ENTRYPOINT ["/myprogram"]
最终图像包含位于/myprogram
的二进制文件,位于暂存
基本图像中。由于scratch
没有/bin/sh
,因此有必要覆盖此项。根据他们的文档,这是通过ENTRYPOINT
完成的
然而,当我将它部署到Heroku时,它似乎仍然使用shell执行。举例说明:
% heroku ps -a my-app-name
== web (Free): /bin/sh -c --myflag1 --myflag2 (1)
这意味着它最终将执行:
/myprogram /bin/sh -c --myflag1 --myflag2
这显然不是我想要的。但是文档的这一部分(我在前面强调)发生了什么
要执行单个二进制文件或使用没有外壳的图像,请使用ENTRYPOINT
heroku.yml文件如下所示:
---
建造:
码头工人:
网页:Dockerfile
运行:
网状物:
命令:
---myflag1
---myflag2
我仍然对shell表单和exec表单有相同的问题。也就是说,我还尝试使用heroku.yml文件,如下所示:
---
建造:
码头工人:
网页:Dockerfile
运行:
web:--myflag1--myflag2
现在,我知道通过将最终图像建立在具有/bin/sh
的图像上,并删除入口点
指令,使用/myprogram
指定命令,我可以让一切“正常工作”。我不需要使用scratch,但我想,而且应该能够使用scratch
,对吗?多年来,我一直使用它在容器中运行静态链接的二进制文件,在其他平台上部署时,我从未遇到过这样的问题
我是不是误解了他们的文件?我需要做什么才能摆脱这个
/bin/sh
shenanigan?heroku.yml运行的正在覆盖你的入口点。@TinNguyen我很确定情况并非如此,因为我程序的错误消息(我的帖子中没有包含)抱怨-c
(来自有问题的/bin/sh-c
)是一个无法识别的标志。这实际上是一个正确的行为。你能指出Heroku文档中说run
正在覆盖ENTRYPOINT
?我也遇到了这个问题,你找到了解决方案吗?@ileitch不幸的是,我还没有找到解决方案。我已经回到部署到一个经过验证的k8上了s cluster with Helm,在这里,像这样的琐碎事情不成问题。我会尝试两种不同的方法。首先,将--myflag1
和--myflag2
参数添加到Dockerfile的入口点。如果这不起作用,我觉得Heroku出于某种原因被迫添加/bin/sh
作为CMD指令.也许如果你自己指定一个CMD,它不会这样做?