Sinatra::Reloader 没有重新加载 Docker 容器中的文件

Sinatra::Reloader not reloading files in Docker container

我正在尝试在 Docker 容器中设置一个简单的 sinatra 应用程序。我已经在 config.ru:

机架上设置了模块化 Sinatra 应用程序
require 'rubygems'
require 'sinatra'
require "sinatra/reloader"

Dir[File.dirname(__FILE__) + '/controllers/*.rb'].each {|file| require file}

#map controllers
map('/') {run WebController}

单控制器/controllers/hello.rb

class WebController < Sinatra::Base

  register Sinatra::Reloader

  get '/' do
    "Hello World"
  end

  get '/test' do
    "Hello World I'm a docker app"
  end
end

这是 Dockerfile

FROM ruby:2.4.0
MAINTAINER Bugs Bunny <bbunny@rubyplus.com>

RUN apt-get update && \ apt-get install -y net-tools

# Install gems
ENV APP_HOME /app
ENV HOME /root
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
COPY Gemfile* $APP_HOME/
RUN bundle install

# Upload source
COPY . $APP_HOME

# Start server
ENV PORT 3000
EXPOSE 3000
CMD ["bundle", "exec", "rackup", "-o", "0.0.0.0", "-p", "3000"]

Gemfile:

source 'https://rubygems.org'

gem 'rack'
gem 'rack-test'
gem 'sinatra'
gem 'sinatra-contrib'

当 运行ing docker run -p 3000:3000 sinatra WEBrick 输出时:

[2019-02-24 20:43:08] INFO  WEBrick 1.3.1
[2019-02-24 20:43:08] INFO  ruby 2.4.0 (2016-12-24) [x86_64-linux]
[2019-02-24 20:43:08] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

问题是,当 docker 容器中的 运行 时 Sinatra::Reloader 不再刷新修改后的控制器文件。

我已经尝试 运行在主机上使用相同的命令 bundle exec rackup -o 0.0.0.0 -p 3000 并且按预期重新加载。如果我在 localhost:3000 上刷新页面后编辑 /controllers/hello.rb,更改会立即显示。

当我 运行 在 Docker 中使用相同的应用程序时,重新加载停止工作。

感谢任何帮助,谢谢。

您的问题与 Docker 有关:构建图像后,您不能(轻松地)再更改其内容,除非重建它。因此,当您在主机系统上更改 controller/hello.rb 的内容时,更改不会传播到图像内部。您可以 use Docker volumes to mount your host directory inside of the container, so that any changes you make in the host system will propagate inside of the container (just don't forget to rebuild it before deploying!). You could also declare that in a docker-compose.yml 文件以便于维护!