docker 容器中的 Rails 应用程序不会在开发中重新加载 [英] Rails app in docker container doesn't reload in development

查看:70
本文介绍了docker 容器中的 Rails 应用程序不会在开发中重新加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遵循了有关如何启动 rails 应用程序的

上图仅供参考.检查 docker-compose 和 Dockefile 是否在同一目录中.它们不必必须像这样,您只需要确保正确指定了目录.

docker-compose 相对于文件../ 意味着它将把当前的 docker-compose 目录(在这种情况下是整个 ruby​​ 应用程序)作为它要托管图像内容的地方.

: 只是一种区分图像所在位置和图像所在位置的方法.

下一部分:/var/www/ 与您在 Dockerfile 中指定的路径相同.

第 2 步:

打开 development.rb(可以在/config/environments 中找到)

并寻找config.file_watcher,替换:

config.file_watcher = ActiveSupport::EventedFileUpdateChecker对于:

 config.file_watcher = ActiveSupport::FileUpdateChecker

这将代替轮询机制.

就是这样!

请记住,任何不是 routes.rb 的东西,也不在 app 文件夹中,很有可能需要手动重新加载 Rails 应用程序.

I followed this docker-compose tutorial on howto start a rails app. It runs perfectly but the app isn't reloaded when I change a controller.

What can it be missing?

解决方案

I was struggling with this as well, there are 2 things that you need to do:

1) Map the current directory to the place where Docker is currently hosting the files.

2) Change the config.file_watcher to ActiveSupport::FileUpdateChecker

Step 1:

In your Dockerfile, check where are you copying/adding the files.

See my 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 . .

The /var/www directory is key here. That's the inner folder structure of the image, and where you need to map the current directory to.

Then, in your docker-compose, define an index called volumes, and place that route there (Works for V2 as well!):

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"

The image above is for reference. Check that the docker-compose and Dockefile are in the same directory. They not necessarily need to be like this, you just have to be sure that the directories are specified correctly.

docker-compose works relative to the file. The ./means that it will take the current docker-compose directory (In this case the entire ruby app) as the place where it's going to host the image's content.

The : just a way to divide between the where it's going to be vs where the image has it.

The next part: /var/www/ is the same path you specified in the Dockerfile.

Step 2:

Open development.rb (Can be found in /config/environments)

and look for config.file_watcher, replace:

config.file_watcher = ActiveSupport::EventedFileUpdateChecker for:

  config.file_watcher = ActiveSupport::FileUpdateChecker

This would do a polling mechanism instead.

That's it!

Remember, that anything that is not routes.rb, and it's not inside the app folder, it's highly probable that the Rails app is going to need to be reloaded manually.

这篇关于docker 容器中的 Rails 应用程序不会在开发中重新加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆