Приложение Rails в контейнере докера не перезагружается в процессе разработки

Я последовал за этим учебником по сборке докеров о том, как запустить приложение rails. Он работает отлично, но приложение не перезагружается, когда я меняю контроллер.

Что он может потерять?

Ответ 1

Вы должны создать том, который отображает исходный код вашего локального/хоста с тем же кодом, который находится внутри докера, чтобы работать с кодом и включать такие функции.

Вот пример сопоставленного файла (docker-compose), который я обновляю в своем редакторе, без необходимости проходить процесс сборки, только чтобы увидеть мои обновления:

  volumes:
    - ./lib/radius_auth.py:/etc/freeradius/radius_auth.py

Без отображения host ↔ guest гость просто запускает любой код, который он получил во время процесса сборки.

Ответ 2

Я тоже боролся с этим, есть две вещи, которые вам нужно сделать:

1) Сопоставьте текущий каталог с местом, где Docker в настоящее время размещает файлы.

2) Измените config.file_watcher на ActiveSupport :: FileUpdateChecker

Шаг 1:

В вашем Dockerfile проверьте, куда вы копируете/добавляете файлы.

Смотрите мой Dockerfile:

# https://docs.docker.com/compose/rails/#define-the-project

FROM ruby:2.5.0
# The qq is for silent output in the console
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs vim

# Sets the path where the app is going to be installed
ENV RAILS_ROOT /var/www/

# Creates the directory and all the parents (if they don't exist)
RUN mkdir -p $RAILS_ROOT

# This is given by the Ruby Image.
# This will be the de-facto directory that 
# all the contents are going to be stored. 
WORKDIR $RAILS_ROOT

# We are copying the Gemfile first, so we can install 
# all the dependencies without any issues
# Rails will be installed once you load it from the Gemfile
# This will also ensure that gems are cached and onlu updated when 
# they change.
COPY Gemfile ./
COPY Gemfile.lock ./
# Installs the Gem File.
RUN bundle install

# We copy all the files from the current directory to our
# /app directory
# Pay close attention to the dot (.)
# The first one will select ALL The files of the current directory, 
# The second dot will copy it to the WORKDIR!
COPY . .

Каталог /var/www является ключевым здесь. Это внутренняя структура папок изображения, и где вам нужно сопоставить текущий каталог.

Затем, в вашем docker-compose, определите индекс с именем volume и поместите туда этот маршрут (также работает для V2!):

version: '3'
services:
  rails:
    # Relative path to Dockerfile. 
    # Docker will read the Dockerfile automatically
    build: .
    # This is the one that makes the magic
    volumes:
    - "./:/var/www"

Directory of the current project

Изображение выше для справки. Убедитесь, что docker-compose и Dockefile находятся в одном каталоге. Они не обязательно должны быть такими, вы просто должны быть уверены, что каталоги указаны правильно.

docker-compose работает относительно файла. ./ означает, что он будет принимать текущий каталог docker-compose (в данном случае все приложение ruby) в качестве места, где он будет размещать содержимое изображения.

The : просто способ разделения между тем, где оно будет, и тем, где оно есть.

Следующая часть: /var/www/ - это тот же путь, который вы указали в Dockerfile.

Шаг 2:

Откройте файл development.rb (можно найти в /config/средах)

и найдите config.file_watcher, замените:

config.file_watcher = ActiveSupport :: EventedFileUpdateChecker для:

  config.file_watcher = ActiveSupport::FileUpdateChecker

Это сделало бы механизм опроса вместо этого.

Это!

Помните, что все, что не является rout.rb и не находится внутри папки приложения, весьма вероятно, что приложение Rails потребуется перезагрузить вручную.

Ответ 3

Попробуйте перестроить образ следующей командой, чтобы добавить изменения в приложение, установленное в докере:

docker-compose build

И после этого вам нужно перезапустить приложение с помощью docker-compose up, чтобы воссоздать контейнер докера для вашего приложения.

Ответ 4

у меня та же проблема, для кого-то, я не знаю, ваша проблема такая же моя, но я надеюсь, что вы можете исправить, для меня я мог бы исправить, когда я это сделал.

1, Restart mac
2, Delete application.yml
3, make
4, make up