将壳装入在Heroku dyno上运行的Docker容器中。怎么用?
给定一个运行容器的dyno,Heroku与docker exec-it blarg/bin/bash的等价物是什么?也就是说,如何将shell打开到已经运行的容器中 Dockerfile示例:将壳装入在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
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'是一次性的,不是吗如果是同一映像的单独新容器,则看不到正在运行的现有进程