一尘不染

装入运行在Heroku dyno上的Docker容器中。怎么样?

docker

给定一个在其中运行容器的dyno,Heroku等价于docker exec -it blarg /bin/bash什么?就是说,一个人怎么能在已经运行的容器中打开一个外壳?

Dockerfile示例:

FROM heroku/heroku:16
CMD while true; do sleep 1; done

示例运行:

$ heroku container:push my_app
<wait a minute>
$ heroku ps
=== my_app (Free): /bin/sh -c while\ true\;\ do\ sleep\ 1\;\ done (1) 
my_app.1: up 2017/10/09 12:13:07 -0600 (~ 4m ago)

到目前为止,一切都很好。

但现在…

$ heroku ps:exec --dyno=my_app.1
Establishing credentials... error
 ▸    Could not connect to dyno!
 ▸    Check if the dyno is running with `heroku ps'

从好的方面来说,我检查heroku ps了这一点,它表明测功机仍在运行。

是的,我已经完成了Heroku建议的所有支持Docker支持的工作。每文档,我已经用我选择的基本图像,同时确保试过bashcurlopenssh,和python是存在的。我还尝试使用Heroku-16基本图像,如上面的示例所示。

(链接的文档还引用了私有空间所需的步骤。由于我没有使用私有空间,因此我没有应用这些步骤。)


阅读 397

收藏
2020-06-17

共1个答案

一尘不染

TL; DR确保bash已安装在映像中,并将其添加到您的Dockerfile中:

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

说明

文档令人信服的相反,Heroku不支持现成heroku ps:exec在dyno中运行的Docker容器。

引用我从Heroku小组收到的回复:

我们的ps:exec功能…通过将bash文件注入dynos,在后台打开另一个端口,并允许您连接到它,从而起作用。

Docker使用的默认shell是/ bin / sh,它与Heroku Exec脚本不兼容(需要/ bin / bash)。

您可以使用一种解决方法。将以下内容放入您的Dockerfile中:

RUN rm /bin/sh && ln -s /bin/bash /bin/sh

这绝对是我们产品中的一个空白,我们将努力使它变得更好。

2020-06-17