【发布时间】:2020-12-22 19:00:58
【问题描述】:
为什么简单的命令 ruby my app.rb 不能从 Docker 容器中启动我的 Sinatra 应用程序?
我有一个非常简单的 Sinatra 应用程序:
# myapp.rb
require 'sinatra'
get '/' do
'Hello world!'
end
我使用 ruby myapp.rb 在本地运行它,我得到以下输出
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Puma version: 5.1.1 (ruby 2.7.0-p0) ("At Your Service")
* Min threads: 0
* Max threads: 5
* Environment: development
* PID: 49242
* Listening on http://127.0.0.1:4567
* Listening on http://[::1]:4567
Use Ctrl-C to stop
在http://127.0.0.1:4567 上打开没有问题。在迁移到 Dockerize 应用程序时,我使用 Sinatra 和以下 Dockerfile 创建了一个 Gemfile。
FROM ruby:2.7.0
WORKDIR /code
COPY . /code
RUN bundle install
CMD ["ruby", "myapp.rb"]
站起来容器,看起来成功了(Docker Desktop 是绿色的,没有终端错误),但是点击建议的链接 http://localhost:4567/ 没有加载(悲伤的 Chrome 脸)。容器内的日志看起来像这样
[2020-12-27 18:04:52] INFO WEBrick 1.6.0
[2020-12-27 18:04:52] INFO ruby 2.7.0 (2019-12-25) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-12-27 18:04:52] INFO WEBrick::HTTPServer#start: pid=1 port=4567
但是,当我添加下面的 config.ru 文件并将 Dockerfile 的最后一行更改为 CMD ["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "4567"] 时,http://localhost:4567/ 将毫无问题地打开。
# config.ru
require './myapp'
run Sinatra::Application
为什么需要进行这些调整才能使应用正常运行?来自容器的日志看起来几乎相同。
[2020-12-27 18:01:49] INFO WEBrick 1.6.0
[2020-12-27 18:01:49] INFO ruby 2.7.0 (2019-12-25) [x86_64-linux]
[2020-12-27 18:01:49] INFO WEBrick::HTTPServer#start: pid=1 port=4567
172.17.0.1 - - [27/Dec/2020:18:02:44 +0000] "GET / HTTP/1.1" 200 12 0.0420
我不一定想知道这里的“最佳实践”(这是一个附带项目)。我更多地只是想了解我可能遗漏的关于 Dockerizing 应用程序的工作原理。
两种情况下的 Docker 命令(我在运行之间清除图像/容器):
docker build --tag sinatra-img .
docker run --name sinatra-app -dp 4567:4567 sinatra-img
【问题讨论】:
-
您确定您的代码正在运行吗?您是否将 Sinatra 和依赖项安装到您的容器中?如果你这样做了,可能 Ruby 不在容器的 PATH 中,你的容器没有 Web 服务器,或者正在使用的 Web 服务器绑定到不同的端口。也许检查容器的进程列表并打开端口。
-
Sinatra 应该通过 Gemfile 安装(为了清楚起见,在上面添加了它)。我在构建时没有看到任何错误,所以我假设应该安装它可能具有的任何依赖项。
-
我相信代码应该正在运行。容器日志显示
[2020-12-22 21:45:21] INFO ruby 2.7.0 (2019-12-25) [x86_64-linux] == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick [2020-12-22 21:45:21] INFO WEBrick::HTTPServer#start: pid=8 port=4567 -
奇怪的是,当我从 CLI 运行 ps 时,我没有看到 pid=8。我只看到一个“sh”和我自己的 ps 搜索。
-
您是否尝试过访问“http://localhost:4567”?
标签: ruby docker containers sinatra rack