Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有容器堆栈和入口点指令的Heroku继续运行/垃圾箱/垃圾箱-c“;_Heroku_Containers_Docker Entrypoint - Fatal编程技术网

带有容器堆栈和入口点指令的Heroku继续运行/垃圾箱/垃圾箱-c“;

带有容器堆栈和入口点指令的Heroku继续运行/垃圾箱/垃圾箱-c“;,heroku,containers,docker-entrypoint,Heroku,Containers,Docker Entrypoint,我将首先介绍Heroku文档中有关Docker部署的容器注册和运行时的相关章节 该节指出: 入口点是可选的。如果未设置,将使用/bin/sh-c CMD将始终由shell执行,以便生成配置变量 可用于您的流程;执行单个二进制文件或使用图像 如果没有外壳,请使用ENTRYPOINT 我想强调最后一句话(加上强调): 要执行单个二进制文件或使用不带外壳的图像,请使用入口点 此外,在本节中 SHELL-Docker图像的默认SHELL为/bin/sh,您可以覆盖 如有必要,使用ENTRYPO

我将首先介绍Heroku文档中有关Docker部署的容器注册和运行时的相关章节

该节指出:

  • 入口点是可选的。如果未设置,将使用
    /bin/sh-c
    • CMD
      将始终由shell执行,以便生成配置变量 可用于您的流程;执行单个二进制文件或使用图像 如果没有外壳,请使用
      ENTRYPOINT
我想强调最后一句话(加上强调):

要执行单个二进制文件或使用不带外壳的图像,请使用
入口点

此外,在本节中

  • SHELL
    -Docker图像的默认SHELL为
    /bin/sh
    ,您可以覆盖 如有必要,使用
    ENTRYPOINT
我的理解是,如果我的Dockerfile中存在
入口点
指令,那么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,它不会这样做?