Shell进入一个在Heroku dyno上运行的Docker容器.怎么样?

kku*_*ian 7 heroku docker

给定一个容器运行的dyno,Heroku相当于docker exec -it blarg /bin/bash什么?也就是说,如何在已经运行的容器中打开shell?

示例Dockerfile:

FROM heroku/heroku:16
CMD while true; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)

示例运行:

$ 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)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

但现在...

$ heroku ps:exec --dyno=my_app.1
Establishing credentials... error
 ?    Could not connect to dyno!
 ?    Check if the dyno is running with `heroku ps'
Run Code Online (Sandbox Code Playgroud)

为了更好的衡量,我heroku ps在这一点检查,它表明dyno仍然在运行.

是的,我已经完成了Heroku建议启用Docker支持的所有功能.每文档,我已经用我选择的基本图像,同时确保试过bash,curl,openssh,和python是存在的.我也尝试过使用Heroku-16基本图像,如上例所示.

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

kku*_*ian 8

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

RUN rm /bin/sh && ln -s /bin/bash /bin/sh
Run Code Online (Sandbox Code Playgroud)

说明

文档引导人们相信的相反,Heroku没有开箱即用支持heroku ps:exec已经在dyno中运行的Docker容器.

引自Heroku团队的回复:

我们的ps:exec功能...有效...通过将一个bash文件注入dynos,在后台打开一个额外的端口,并允许你连接到它.

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

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

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

这绝对是我们产品的一个缺口,我们将努力做到更好.


nic*_*res 5

编辑:为了在使用 Docker 的应用程序上运行 heroku ps:exec 并通过容器注册表部署,您必须启用runtime-heroku-exec. 您可以执行heroku features:enable runtime-heroku-exec以下操作来启用它

在这里您可以查看exec有关启用 docker 支持的说明的文档


Cas*_*per 5

如果安装了 bash,请运行heroku run bash. 这将使您从命令行进入 shell。

您还可以使用 GUI 并在您的 heroku 应用程序上转到“更多”->“运行控制台”,然后输入“bash”以将其调出。

  • 不,“heroku run bash”是一次性的,它是同一映像的一个单独的新容器,您看不到正在运行的现有进程 (2认同)