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文件中声明这一点,以便于维护!
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |