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
这绝对是我们产品中的一个空白,我们将努力使它变得更好。
解决方法给定一个在其中运行容器的dyno,Heroku等价于docker exec -it blarg/bin/bash什么?就是说,一个人怎么能在已经运行的容器中打开一个外壳?
Dockerfile示例:
FROM heroku/heroku:16CMD 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.1Establishing credentials... error ▸ Could not connect to dyno! ▸ Check if the dyno is running with `heroku ps’
从好的方面来说,我检查heroku ps了这一点,它表明测功机仍在运行。
是的,我已经完成了Heroku建议的所有支持Docker支持的工作。每文档,我已经用我选择的基本图像,同时确保试过bash,curl,openssh,和python是存在的。我还尝试使用Heroku-16基本图像,如上面的示例所示。
(链接的文档还引用了私有空间所需的步骤。由于我没有使用私有空间,因此我没有应用这些步骤。)