我按照docker-compose tutorial关于如何启动rails应用程序。 它运行完美但我更换控制器时没有重新加载应用程序。
它可以丢失什么?
答案 0 :(得分:6)
我也在努力解决这个问题,你需要做两件事:
1)将当前目录映射到Docker当前托管文件的位置。
2)将config.file_watcher更改为ActiveSupport :: FileUpdateChecker
在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"
上图仅供参考。检查docker-compose和Dockefile是否在同一目录中。他们不一定需要像这样,你只需要确保正确指定目录。
docker-compose相对于文件 。 ./
意味着它将当前的docker-compose目录(在本例中为整个ruby应用程序)作为它将托管图像内容的位置。
:
只是一种在图像所在位置与图像所在位置之间进行划分的方法。
下一部分:/var/www/
与您在Dockerfile中指定的路径相同。
打开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