在使用Heroku CLI进行部署的Ruby应用程序上工作时,我偶然发现了一个问题,试图将整个内容集成到Docker Compose工作流程和微服务架构中。
长话短说,我正在运行一个运行命令的容器:heroku local:start -p 5000
(启动一个本地Heroku服务器并公开端口5000,因此可以在http://localhost:5000访问Heroku应用程序)。
我将容器的端口5000绑定到主机上的端口5000。当我在主机上访问http://localhost:5000时,我无法访问Heroku应用程序。如果我在非Docker环境中运行命令,那么同样的工作也很完美。
我对Docker和端口转发很有经验,所以我几乎可以肯定问题不在于撰写文件或端口如何转发。问题似乎在于Heroku CLI以及它如何将端口暴露给它正在运行的环境。
要重现此问题,只需签出此提交并运行docker-compose up
:https://github.com/Dzhuneyt/12factor/commit/5bdfc417ce57eb916c42fdc76bae51e4df30549c
我相信如果你绑定到0.0.0.0
,这将有效
# Procfile
web: bundle exec ruby web.rb -p $PORT -o 0.0.0.0
另外,为方便起见,为了避免在每个调试周期重建,我会添加一个卷装:
# docker-compose.yml
version: '3'
services:
web:
build: ./
volumes:
- .:/usr/src/app
ports:
- "5000:5000"
只是为了检查基础知识;一旦你启动服务并等待几秒钟'docker ps'显示服务正在运行吗?如果没有'docker logs {service_name}'提供任何输出?听起来你的网络/端口配置是正确的;这就是为什么我专注于服务输出。但是,如果服务IS正在运行,您可以'telnet localhost 5000'并获得成功连接吗?