使用Docker

时间:2016-09-05 17:56:28

标签: ruby-on-rails devise docker-compose dockerfile production-environment

我尝试将带有devise gem的小型rails项目迁移到Docker版本中。为了说明(MWE),我将使用设计示例。

没有泊坞工,一切都很好:

git clone git://github.com/RailsApps/rails-devise.git
cd rails-devise
bundle install
bundle exec rake db:migrate
rails s

现在我想在Docker容器中的生产中运行此示例。因此,我补充道  Dockerfiledocker-compose.yml.env.web。我们的想法是遵循最佳实践并将所有秘密放在环境.env.web文件中,该文件包含所有密钥和配置:

PORT=3000
SECRET_KEY_BASE=e69d022dcead6a7025f6f7d37cf540d5c53fd5a075826998418b2165a3138ff4e32b82a45feb338a61a2d1d81f677173025b514ebc315e1fc9cd7ad4ed80d145
DOMAIN_NAME=example.com

秘密密钥通过以下方式获得:

bundle exec rake secret

为了帮助回答这个问题,我将所有内容放入此存储库的分支中。要重现我的问题,您可以运行这些命令

git clone https://github.com/patwie-stuff/rails-devise.git
cd rails-devise
docker-compose build

有效,但我得到了:

** Invoke assets:precompile (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
rake aborted!
Devise.secret_key was not set. Please add the following to your Devise initializer:

  config.secret_key = '28952e4c2a1372b9ff2ec6b46fbbe942fa192fac9192982313f692e7ff3fae6c9227a8b6fd0034b87e64ebefb757c854095cc4f3594f7254280697ddf98c47b8'

Please ensure you restarted your application after installing Devise or setting the key.
/usr/local/bundle/gems/devise-3.5.2/lib/devise/rails/routes.rb:475:in `raise_no_secret_key'
/usr/local/bundle/gems/devise-3.5.2/lib/devise/rails/routes.rb:209:in `devise_for'
/myapp/config/routes.rb:3:in `block in <top (required)>'

此错误来自

RUN RAILS_ENV=production bundle exec rake assets:precompile --trace

默认情况下,默认情况下,devise使用rails secret_key_base。此值是从环境中获取的,因此是.env.web文件。但它就在那里!如何将来自secret.yml的东西保存在环境文件中。

取消注释Dockerfile中的第15,16行并运行

docker-compose run web ruby test.rb

给出正确的结果a_production_secret_key

“docker-compose build”和“docker-compose run web test.rb”之间是否存在差异?显然,不同之处在于构建时和运行时。

但是,如何处理生产的SECRET_KEY_BASE变量?我不想在Dockerfile中对其进行硬编码。这里最好的做法是什么?对于生产,必须预先编译资产。

我可以为SECRET_KEY_BASE设置一个虚拟值吗?在Dockerfile中使用硬编码的虚拟值我感觉不太好。

1 个答案:

答案 0 :(得分:0)

经过几个小时和很多参考,我终于找到了一个有效的。

对我来说最干净的代码是使用来自http://equinox.one/blog/2016/04/20/Docker-with-Ruby-on-Rails-in-development-and-production/的解决方案。 只需替换你的Dockerfile

  

RUN RAILS_ENV =生产包exec rake资产:预编译--trace

# Set Rails to run in production
ENV RAILS_ENV production 
ENV RACK_ENV production

RUN bundle exec rake SECRET_KEY_BASE=dummytoken  assets:precompile

从这里开始:https://nickjanetakis.com/blog/dockerize-a-rails-5-postgres-redis-sidekiq-action-cable-app-with-docker-compose 我理解资产之前的值:precompile可以是dummy,只要它们具有有效的语法。

编辑:

虽然上面的解决方案允许我预先编译资产,但资产仍未​​在生产中加载。

最后,我最终使用了rails 12 factor gem,正如我在这个答案中看到的那样:https://stackoverflow.com/a/36441251/1461972,这一切都成功了。