Sinatra :: Reloader не перезагружает файлы в контейнере Docker - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь настроить простое приложение sinatra в контейнере 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'

При запуске 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.

1 Ответ

0 голосов
/ 25 февраля 2019

Ваша проблема связана с Docker: после создания изображения вы не можете (легко) изменить его содержимое, кроме как путем его восстановления.Таким образом, когда вы изменяете содержимое controller/hello.rb в вашей хост-системе, это изменение не распространяется внутри образа.Вы можете использовать тома Docker, чтобы смонтировать каталог хоста внутри контейнера , чтобы любые изменения, которые вы вносите в систему хоста, распространялись внутри контейнера (просто не забудьте перестроить его перед развертыванием!),Вы также можете объявить это в файле docker-compose.yml для упрощения обслуживания!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...