如何在docker-compose run中使用Docker访问Sinatra端口

hoo*_*tor 4 ruby sinatra docker docker-compose

我不确定如何正确将4567Docker 的Sinatra端口正确地公开回主机。在本地运行该应用程序没有问题。

以下存储库显示了问题的情况https://gitlab.com/davidhooey/sinatra-docker

通过搜索,我注意到以下问题:在Docker容器中运行Ruby Sinatra无法连接(通过Mac主机)或无法找到命令(在不同情况下)?--host 0.0.0.0传递到rackup命令中。但是,我正在使用编程方式启动该网站Site.run!

文件树

.
??? Dockerfile
??? Gemfile
??? Gemfile.lock
??? README.md
??? app.rb
??? docker-compose.yml
??? site.rb
??? views
    ??? index.erb
Run Code Online (Sandbox Code Playgroud)

app.rb

module App
    class App
        def initialize(args)
            # Do some stuff before launching site.
            # Launch site
            Site.run!
        end
    end
end

App::App.new(ARGV)
Run Code Online (Sandbox Code Playgroud)

site.rb:bind西纳特拉设置为0.0.0.0

site.rb

require 'sinatra'

module App
    class Site < Sinatra::Base
        set :bind, '0.0.0.0'
        set :static, true
        set :public_dir, File.expand_path(__dir__)

        get '/' do
            erb :'/index'
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

在Docker容器中运行时,即使仍然无法访问该站点。

Dockfile

FROM ruby:2.2.6

EXPOSE 4567

RUN mkdir /app
WORKDIR /app
COPY . /app

RUN gem install bundler && bundle install

CMD ["/bin/bash"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3.2'

services:
    app:
        build: .
        hostname: app
        ports:
            - "4567:4567"
        environment:
            - RUBYOPT=-W0 -KU -E utf-8:utf-8
        volumes:
            - type: bind
              source: .
              target: /app
Run Code Online (Sandbox Code Playgroud)

当地作品:

ruby app.rb
Run Code Online (Sandbox Code Playgroud)

Docker没那么多:

docker-compose build
docker-compose run --rm app ruby app.rb
Run Code Online (Sandbox Code Playgroud)

Docker运行示例。

$ docker-compose run --rm app ruby app.rb
[2018-07-27 14:21:10] INFO  WEBrick 1.3.1
[2018-07-27 14:21:10] INFO  ruby 2.2.6 (2016-11-15) [x86_64-linux]
== Sinatra (v2.0.3) has taken the stage on 4567 for development with backup from WEBrick
[2018-07-27 14:21:10] INFO  WEBrick::HTTPServer#start: pid=1 port=4567
Run Code Online (Sandbox Code Playgroud)

将bash shell启动到正在运行的容器中,以访问该容器中的Sinatra。

$ docker exec -it aa8f64b009b0 bash
root@app:/app# curl localhost:4567
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Sinatra Docker</title>
    </head>
   <body>
        <h1>Sinatra Docker</h1>
   </body>
</html>
root@app:/app#
Run Code Online (Sandbox Code Playgroud)

当以编程方式启动Sinatra时,关于如何从本地主机访问容器中运行的Sinatra端口的任何想法都非常受欢迎。

Cas*_*per 5

当运行带有的应用程序时docker-compose run,将不会映射服务端口。这是设计使然,因为run它是一次性任务,而不是引导整个组合堆栈。

在此处查看文档:https :
//docs.docker.com/compose/reference/run/

第二个区别是docker-compose run命令不会创建服务配置中指定的任何端口。这样可以防止端口与已经打开的端口发生冲突。

要映射端口您可能需要使用run--service-ports,或添加command部分的docker-compose.yml,然后使用docker-compose up

选项1(使用运行):

docker-compose run --service-ports --rm app ruby app.rb
Run Code Online (Sandbox Code Playgroud)

选项2(引导整个堆栈):

services:
  app:
    build: .
    hostname: app
    command: ruby app.rb   # <-- Add this
    ports:
      - "4567:4567"
    ...
Run Code Online (Sandbox Code Playgroud)

然后:

docker-compose up
Run Code Online (Sandbox Code Playgroud)

  • 我还发现有必要使用以下命令将Sinatra绑定到任意主机:ruby app.rb -o 0.0.0.0(请参阅/sf/answers/2917168201/令人困惑,因为没有这样的docker-compose配置是Rails所必需的)。之后,可以从主机连接到http:// localhost:4567 (2认同)