无法向 sinatra 应用程序 运行 docker 和 docker-compose 发送请求

Can't send requests to a sinatra app running with docker and docker-compose

你能告诉我我的 Dockerfile 或 docker-compose 有什么问题吗?

# Dockerfile

FROM ruby:2.5.0

RUN apt-get update -qq && apt-get install -y build-essential

ENV APP_HOME /app
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/
RUN bundle install

ADD . $APP_HOME


# docker-compose.yml

version: '3'

services:
 db:
  image: mongo
  volumes:
    - $HOME/data/mongodb:/data/db
  ports:
    - "27017:27017"

web:
 build: .
 command: rackup config.ru --port 4567
 volumes:
   - .:/app
 ports:
   - "4567:4567"
 depends_on:
   - db

如果我直接使用 'rackup' 命令 运行 应用程序,它运行良好。当我通过 'docker-compose up' 命令 运行 容器时,问题就开始了,它停止通过 'localhost:4567' 接受请求。 我无法发现问题,这就是我寻求帮助的原因。

这是来自 'docker-compose up' 的日志,以防万一。

Starting tracker_db_1 ... done
Recreating tracker_api_1 ... done
Attaching to tracker_db_1, tracker_api_1
db_1   | 2018-07-30T09:43:17.580+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=fe12227a1143
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] db version v4.0.0
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] allocator: tcmalloc
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] modules: none
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] build environment:
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten]     distarch: x86_64
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten]     target_arch: x86_64
db_1   | 2018-07-30T09:43:17.669+0000 I CONTROL  [initandlisten] options: { net: { bindIpAll: true } }
db_1   | 2018-07-30T09:43:17.686+0000 I STORAGE  [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
db_1   | 2018-07-30T09:43:17.700+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=487M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
web_1  | [2018-07-30 09:43:19] INFO  WEBrick 1.4.2
web_1  | [2018-07-30 09:43:19] INFO  ruby 2.5.0 (2017-12-25) [x86_64-linux]
web_1  | [2018-07-30 09:43:19] INFO  WEBrick::HTTPServer#start: pid=1 port=4567
db_1   | 2018-07-30T09:43:29.033+0000 I STORAGE  [initandlisten] WiredTiger message [1532943809:33683][1:0x7f429bbb8a00], txn-recover: Main recovery loop: starting at 7/8576
db_1   | 2018-07-30T09:43:29.787+0000 I STORAGE  [initandlisten] WiredTiger message [1532943809:787811][1:0x7f429bbb8a00], txn-recover: Recovering log 7 through 8
db_1   | 2018-07-30T09:43:30.362+0000 I STORAGE  [initandlisten] WiredTiger message [1532943810:362900][1:0x7f429bbb8a00], txn-recover: Recovering log 8 through 8
db_1   | 2018-07-30T09:43:30.433+0000 I STORAGE  [initandlisten] WiredTiger message [1532943810:433423][1:0x7f429bbb8a00], txn-recover: Set global recovery timestamp: 0
db_1   | 2018-07-30T09:43:30.463+0000 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
db_1   | 2018-07-30T09:43:30.487+0000 I CONTROL  [initandlisten]
db_1   | 2018-07-30T09:43:30.488+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
db_1   | 2018-07-30T09:43:30.488+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
db_1   | 2018-07-30T09:43:30.488+0000 I CONTROL  [initandlisten]
db_1   | 2018-07-30T09:43:30.635+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
db_1   | 2018-07-30T09:43:30.642+0000 I NETWORK  [initandlisten] waiting for connections on port 27017

您的应用程序在 localhost 之外不可用,它的 localhost 是 docker 容器,而不是您的系统(您甚至可以尝试从容器内部 curl localhost,我敢打赌它会工作得很好)。我不能给你更多的细节,我不擅长这个话题。但是你需要做的只是将 rack 绑定到 0.0.0.0.

例如,我 运行 我的 rails 应用是这样的:

bundle exec rails s -p 3000 -b 0.0.0.0

在你的情况下它将是:

rackup --host 0.0.0.0 --port ...

现在它甚至可以从您的网络中使用(至少应该是)

我 运行 在尝试使用内置 WEBrick 服务器在 Docker 中设置一个简单的 Sinatra 应用程序时遇到了这个问题。换句话说,我没有 config.ru 文件。万一其他人遇到同样的问题,我想我会 post 我的解决方案。

我的应用程序是一个 "Hello World" 应用程序,我只是用来在 Docker 容器中获取 Sinatra 运行。

这是我更改前的 app.rb

require 'sinatra'

get '/' do
  'Hello world!'
end

当我 运行 Docker 容器时,我可以看到 WEBrick 运行 并准备好接受请求。但是当我试图从我的笔记本电脑访问它时,请求从未到达容器。

为了解决这个问题,我将 set :bind, '0.0.0.0' 添加到 app.rb,就像这样。

require 'sinatra'

set :bind, '0.0.0.0'

get '/' do
  'Hello world!'
end

对于任何需要更复杂配置设置的东西,最好将绑定设置添加到配置文件中。