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

问题描述 投票:0回答:1

我正在尝试在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 <[email protected]>

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'

运行qazxsw poi时WEBrick输出:

docker run -p 3000:3000 sinatra

问题是,当在docker容器中运行时,[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 不再刷新已修改的控制器文件。

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

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

任何帮助表示赞赏,tnx。

ruby docker sinatra
1个回答
1
投票

你的问题在于Docker:一旦构建了一个图像,你就不能(轻松地)改变它的内容,除非通过重建它。因此,当您在主机系统上更改localhost:3000的内容时,更改不会在图像内部传播。您可以使用controller/hello.rb,以便您在主机系统中进行的任何更改都将在容器内传播(只是不要忘记在部署之前重建它!)。你可以use Docker volumes to mount your host directory inside of the container文件,以便于维护!

© www.soinside.com 2019 - 2024. All rights reserved.