Sinatra :: Reloader无法重新加载Docker容器中的文件

时间:2019-02-24 20:52:06

标签: ruby docker sinatra

我正在尝试在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'

运行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,然后按预期进行重新加载。如果在刷新/controllers/hello.rb上的页面后编辑localhost:3000,则会立即显示更改。

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

任何帮助,tnx。

1 个答案:

答案 0 :(得分:1)

您的问题在Docker上:一旦构建了映像,您将无法(轻松)更改其内容,除非通过重建它。因此,当您在主机系统上更改controller/hello.rb的内容时,更改不会在映像内部传播。您可以use Docker volumes to mount your host directory inside of the container,这样您在主机系统中所做的任何更改都将在容器内部传播(请不要忘记在部署之前重建它!)。您可以also declare that in a docker-compose.yml归档以便于维护!