Ruby 如何连接到停靠的Sinatra应用程序

Ruby 如何连接到停靠的Sinatra应用程序,ruby,docker,dockerfile,sinatra,Ruby,Docker,Dockerfile,Sinatra,我正在尝试将一个简单的Sinatra应用程序Docker化,但是当Docker启动时,我无法通过公开的端口4567访问API 这是我的Dockerfile: FROM ruby:2.7 RUN apt-get update -qq && apt-get install -y build-essential RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.loc

我正在尝试将一个简单的Sinatra应用程序Docker化,但是当Docker启动时,我无法通过公开的端口4567访问API

这是我的Dockerfile:

FROM ruby:2.7
RUN apt-get update -qq && apt-get install -y build-essential
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

EXPOSE 4567

CMD [ "bundle", "exec", "ruby", "main.rb", "-p", "4567" ]
FROM dannyben/alpine-ruby
WORKDIR /app
COPY . .
RUN gem install puma sinatra
EXPOSE 3000
CMD ruby server.rb
然后:

当我访问
localhost:4567
时:

但是,如果我访问容器并发出
curl
请求,它会工作:

docker exec -it bdcbfcaa57aa bash


我看不出我做错了什么。

您的Sinatra应用程序很可能在
127.0.0.1
上侦听。您需要将其绑定到
0.0.0.0

在经典的Sinatra中,它是通过以下方式完成的:

require 'sinatra'

set :port, 4567
set :bind, '0.0.0.0'

# ... rest of the app
我不确定您的
main.rb
中有什么内容,但您可能希望添加对
--主机0.0.0
--绑定0.0.0
的支持

以下是一个功能完整的示例:

Dockerfile:

FROM ruby:2.7
RUN apt-get update -qq && apt-get install -y build-essential
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

EXPOSE 4567

CMD [ "bundle", "exec", "ruby", "main.rb", "-p", "4567" ]
FROM dannyben/alpine-ruby
WORKDIR /app
COPY . .
RUN gem install puma sinatra
EXPOSE 3000
CMD ruby server.rb
server.rb:

require 'sinatra'

set :port, 3000
set :bind, '0.0.0.0'

get '/' do
  "we are the champions"
end
然后运行:

$ docker build -t temp .
$ docker run --rm -it -p 3000:3000 temp

问题是您的服务器返回图像文件,但如果您在容器中打开了调试shell,它将返回不同的图像文件?或者它返回的是实际的错误消息?您能否在问题本身中以文本形式描述您遇到的问题,包括任何相关错误和容器日志消息?欢迎使用SO!请删除图片并提供问题中的实际文本。“”和“”解释原因。