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 文件以便于维护!
我正在尝试在 Docker 容器中设置一个简单的 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}
单控制器/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 文件以便于维护!