把Shell放到一个运行在Heroku dyno上的Docker容器中。 怎么样?
给定一个容器运行的测功机, docker exec -it blarg /bin/bash
的Heroku是什么? 也就是说,如何将一个shell打开到已经运行的容器中呢?
示例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
,它表明,测功机仍在运行。
是的,我已经完成了Herokubuild议启用Docker支持的所有事情。 根据文档,我已经尝试使用我select的基本映像,同时确保bash
, curl
, openssh
和python
存在。 我也尝试过使用Heroku-16基本镜像,如上例所示。
(链接的文档也引用了Private Spaces所需的步骤,因为我没有使用Private Spaces,所以我没有应用这些步骤。)
编辑 :为了在Docker上运行heroku ps:exec,并通过Container Registry进行部署,您必须启用runtime-heroku-exec
。 你可以做heroku features:enable runtime-heroku-exec
来启用它
在这里你可以看到exec
的文档和说明来启用docker的支持
TL; DR确保在映像中安装了bash
并将其添加到Dockerfile中:
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
说明
与文档会导致人们相信的相反,Heroku并不支持将Heroku heroku ps:exec
支持到已经运行在testing版中的Docker容器中。
从Heroku团队收到的回复中引用:
我们的ps:execfunction…通过向dynos注入一个bash文件,在后台打开一个额外的端口,并允许您连接到它。
Docker使用的默认shell是/ bin / sh,与Heroku Exec脚本不兼容(需要/ bin / bash)。
有一个解决方法,你可以使用。 把下面的代码放到你的Dockerfile中:
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
这绝对是我们产品的一个缺口,我们会努力做到这一点。