Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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

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 dyno上运行的Docker容器中。怎么用?_Docker_Heroku - Fatal编程技术网

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

将壳装入在Heroku dyno上运行的Docker容器中。怎么用?,docker,heroku,Docker,Heroku,给定一个运行容器的dyno,Heroku与docker exec-it blarg/bin/bash的等价物是什么?也就是说,如何将shell打开到已经运行的容器中 Dockerfile示例: FROM heroku/heroku:16 CMD while true; do sleep 1; done RUN rm /bin/sh && ln -s /bin/bash /bin/sh 运行示例: $ heroku container:push my_app <wait

给定一个运行容器的dyno,Heroku与docker exec-it blarg/bin/bash的等价物是什么?也就是说,如何将shell打开到已经运行的容器中

Dockerfile示例:

FROM heroku/heroku:16
CMD while true; do sleep 1; done
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
运行示例:

$ 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,它显示dyno仍在运行

是的,我已经做了Heroku建议的所有事情。根据文档,我尝试使用我选择的基本映像,同时确保存在
bash
curl
openssh
python
。我还尝试使用Heroku-16基本图像,如上面的示例所示

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

编辑的: 为了使用Docker在应用程序上运行heroku ps:exec并通过容器注册表部署,您必须启用
运行时heroku exec
。 您可以执行heroku功能:启用运行时heroku exec来启用它


您可以查看
exec
的文档以及启用docker支持的说明

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

FROM heroku/heroku:16
CMD while true; do sleep 1; done
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
解释

与人们所相信的相反,Heroku并没有开箱即用地支持已经在dyno中运行的Docker容器

引用我从Heroku团队收到的回复:

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

[T] 他违约了 Docker使用的shell为/bin/sh,与 Heroku执行脚本(它需要/bin/bash)

不过,您可以使用一种变通方法。将以下内容放入您的 Dockerfile:

FROM heroku/heroku:16
CMD while true; do sleep 1; done
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
运行rm/bin/sh&&ln-s/bin/bash/bin/sh

这绝对是一个差距 我们的产品,我们将努力使之更好

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


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

在我的情况下,为了让它与Ubuntu 20.04(focal)一起工作,我必须在docker映像中额外安装
python-is-python3
包,以使heroku exec工作


下面是一个基于ubuntu的dockerfile的工作示例(2020年10月),它与heroku exec一起工作:

FROM ubuntu:focal

# install required packages
RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python3 curl python-is-python3 openssh-server iproute2 nginx && apt-get clean

# simplfy nginx config to enable ENV variable substitution
RUN echo 'server { listen PORT_NUMBER; }' > /etc/nginx/sites-enabled/default

# add config required for HEROKU_EXEC
# ENV HEROKU_EXEC_DEBUG=1
RUN rm /bin/sh \
 && ln -s /bin/bash /bin/sh \
 && mkdir -p /app/.profile.d/ \
 && printf '#!/usr/bin/env bash\n\nset +o posix\n\n[ -z "$SSH_CLIENT" ] && source <(curl --fail --retry 7 -sSL "$HEROKU_EXEC_URL")\n' > /app/.profile.d/heroku-exec.sh \
 && chmod +x /app/.profile.d/heroku-exec.sh

# configure NGINX to listen on dynamic $PORT env variable supplied by Heroku.
CMD sed -i 's/PORT_NUMBER/'"$PORT"'/g' /etc/nginx/sites-enabled/default; nginx -g 'daemon off;'

来自ubuntu:focal的

#安装所需的软件包
运行export DEBIAN_FRONTEND=noninteractive&&apt get update&&apt get install-y python3 curl python-is-python3 openssh服务器iproute2 nginx&&apt get clean
#简化nginx配置以启用环境变量替换
运行echo'server{listen PORT_NUMBER;}'>/etc/nginx/sites enabled/default
#添加HEROKU_EXEC所需的配置
#ENV HEROKU_EXEC_DEBUG=1
运行rm/bin/sh\
&&ln-s/bin/bash/bin/sh\
&&mkdir-p/app/.profile.d/\

&&printf'#/usr/bin/env bash\n\nset+o posix\n\n[-z“$SSH_CLIENT”]”和&sourceheroku run/bin/bash和
heroku ps:exec在我的情况下都不起作用。前者打开了一个不同于实际运行的新容器!后者在我的alpine3容器中不起作用,尽管
heroku特性:enable runtime heroku exec
可以成功。我的解决方案是在容器中启动一个shell服务器和一个流量转发器。然后,在客户端上,使用由流量转发器创建的隧道连接到shell服务器

交通流量:

localhost:2023 -> chisel client -> ...tunnel... -> chisel server -> localhost:8182
在conainer中,使用socat启动shell服务器,使用凿子启动隧道服务器:

nohup socat tcp-l:8182,reuseaddr,fork exec:/bin/bash,pty,setsid,setpgid,stderr,ctty > /tmp/socat.log 2>&1 &

nohup ./chisel server --port $PORT --proxy http://httpbin.org > /tmp/chisel.log 2>&1 &
在客户端,启动一个凿子客户端,将本地主机8182的流量转发到服务器上的socat

chisel client http://yourapp.herokuapp.com/  0.0.0.0:2023:localhost:8182
在客户端,打开另一个终端窗口:

socat -,raw,echo=0 tcp:127.0.0.1:2023
如何在服务器上获取凿子?下载或直接从Dockerfile中的源代码编译


下载

所有这些我都试过了。没有骰子。请看我添加到问题中的示例。你从这个例子中得到了不同的结果吗?这个例子缺少什么吗?到目前为止,文档是误导性的。请看我的答案。这只是启用该功能,我使用的图像是heroku/heroku:16,它已经在那里了,错误是“heroku ps:exec”不会运行:(hm终于让它工作了,只在docker hub的容器图像“heroku/heroku:16”上使用
sh
的符号链接替换
bash
,我会感到惊讶。如果作为
sh
调用,
bash
进入posix兼容模式(),不支持
进程替换().heroku exec.sh
使用进程替换(
…在heroku exec脚本中添加
set+o posix
)可能会有所帮助。@wwerner您能否提供更多详细信息,说明如何将
set+o posix
添加到
heroku exec.sh
?我正在努力解决这个问题。如果您能在这里提供一些额外的建议:太棒了!我已经尝试了自己的docker图像heroku/heroku:16 image,ps:exec仍然不工作,我用“heroku ps:scale web=1”启动了容器,或者我应该从另一个命令开始吗?嗯,终于,在docker hub Only提供的容器映像“heroku/heroku:16”上运行了。正如您所提到的,在web控制台中尝试这一点最终对我有效。cli
的响应时间太长,所以不确定如果我再等一段时间,它是否会工作。不,'heroku run bash'是一次性的,不是吗如果是同一映像的单独新容器,则看不到正在运行的现有进程