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

Str*_*i84 2 ruby sinatra docker

我正在尝试在 Docker 容器中设置一个简单的 sinatra 应用程序。我已经在机架上设置了模块化 Sinatra 应用程序config.ru

require 'rubygems'
require 'sinatra'
require "sinatra/reloader"

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

#map controllers
map('/') {run WebController}
Run Code Online (Sandbox Code Playgroud)

单控制器/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
Run Code Online (Sandbox Code Playgroud)

这是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"]
Run Code Online (Sandbox Code Playgroud)

Gemfile

source 'https://rubygems.org'

gem 'rack'
gem 'rack-test'
gem 'sinatra'
gem 'sinatra-contrib'
Run Code Online (Sandbox Code Playgroud)

运行docker run -p 3000:3000 sinatraWEBrick 输出时:

[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
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何帮助表示赞赏,tnx。

小智 5

您的问题在于 Docker:一旦构建了映像,您就无法(轻松)再更改其内容,除非重建它。因此,当您更改主机系统上的内容时controller/hello.rb,更改不会在映像内部传播。您可以使用 Docker 卷将主机目录挂载到容器内,以便您在主机系统中所做的任何更改都将在容器内传播(只是不要忘记在部署之前重建它!)。您还可以在 docker-compose.yml文件中声明这一点,以便于维护!