我正在尝试在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。
答案 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归档以便于维护!