Docker容器中的Rails应用程序在开发中不会重新加载

时间:2016-06-08 10:12:41

标签: ruby-on-rails docker docker-compose

我按照docker-compose tutorial关于如何启动rails应用程序。 它运行完美但我更换控制器时没有重新加载应用程序。

它可以丢失什么?

5 个答案:

答案 0 :(得分:6)

我也在努力解决这个问题,你需要做两件事:

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中,定义一个名为volumes的索引,并将该路径放在那里(同样适用于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应用程序)作为它将托管图像内容的位置。

:只是一种在图像所在位置与图像所在位置之间进行划分的方法。

下一部分:/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应用程序。

答案 1 :(得分:2)

您应创建一个使用docker中相同代码映射本地/主机源代码的卷,以便处理代码并启用此类功能。

这是一个(docker-compose)映射文件的示例,我在编辑器中更新,而不必通过构建过程来查看我的更新:

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

没有映射主机< - > guest,guest将简单地运行在构建过程中收到的任何代码。

答案 2 :(得分:0)

尝试使用下一个命令重建图像,将更改添加到dockerized app:

docker-compose build

之后,您需要使用docker-compose up重新启动应用,为您的应用重新创建Docker容器。

答案 3 :(得分:0)

我遇到了同样的问题,对于某人,我不知道您的问题是我的,但我希望您能解决,对我而言,我可以解决。

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

答案 4 :(得分:0)

增加@Jose A的答案,我将development.rb中的属性/healthz更改为config.cache_classes,它解决了问题。以下是其解释:

false