我尝试将带有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容器中的生产中运行此示例。因此,我补充道
Dockerfile
,docker-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中使用硬编码的虚拟值我感觉不太好。
答案 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,这一切都成功了。