部署 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base`

Posted

技术标签:

【中文标题】部署 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base`【英文标题】:Deploying Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base` 【发布时间】:2020-06-05 06:00:41 【问题描述】:

我似乎无法找到为 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker 部署设置 secret_key_base 的正确方法。因此,部署不断失败。我一直在尝试遵循本教程:https://dev.to/fdoxyz/elastic-beanstalk-apps-using-docker-containers-56l8

系统:

Ubuntu 18.04 ruby 2.6.5p114(2019-10-01 修订版 67812)[x86_64-linux] 捆绑器版本 2.1.4 Rails 6.0.2.1 Docker 版本 18.09.7,构建 2d0083d 节点 v12.16.1

以下是我从空目录到部署的步骤:

mkdir new_project && cd new_project
eb init
     2) us-west-1 : US West (N. California)
     2) [ Create new Application ]
     (default is "new_project")
     8) Docker
     Do you want to set up SSH for your instances? Y
     Select a keypair.

eb create
     Enter Environment Name (default is new-project-dev)
     Enter DNS CNAME prefix (default is new-project-dev)
     Select a load balancer type: 2) application
     enable Spot Fleet? n
     download the sample application into the current directory? n

eb setenv SECRET_KEY_BASE=$(ruby -e "require 'securerandom';puts SecureRandom.hex(64)")
eb setenv RAILS_ENV=production

cat .gitignore
rails new .
vim .gitignore (paste old contents of gitignore)
touch Dockerfile
vim Dockerfile

===============
FROM ruby:2.6.5

# Install NodeJS & Yarn
RUN apt-get update && \
    apt-get install apt-transport-https && \
    curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
    apt-get purge nodejs && \
    apt-get update && \
    apt-get install nodejs -y && \
    npm install yarn -g  && \
    gem install bundler -v 2.1.4

# Workdir and add dependencies
WORKDIR /app/
ADD Gemfile Gemfile.lock /app/

# Throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1

# Install dependencies
ARG RAILS_MASTER_KEY
ENV RAILS_ENV=production NODE_ENV=production RAILS_SERVE_STATIC_FILES=1
RUN bundle install --without development test

# Add the app code, precompile assets and use non-root user
ADD . /app/
RUN rake assets:precompile DISABLE_SPRING=1 && \
    chown -R nobody:nogroup /app
USER nobody
ENV HOME /app

# Make sure to explicitly bind to port & interface
CMD ["bundle", "exec", "rails s -p 3000 -b 0.0.0.0"]
===============

vim config/environments/production.rb
insert at the top of the file:
    config.secret_key_base = ENV["SECRET_KEY_BASE"]

git add . && git commit -m "Initial commit"
eb use new_project-dev
eb deploy

这是从 ssh 到 '/var/log/eb-activity.log' 实例的完整日志:

https://raw.githubusercontent.com/maxtocarev/eb-log/master/eb-activity.log

【问题讨论】:

【参考方案1】:

secret_key_base 是存储在Rails encrypted credentials 中的值。构建 Docker 映像时,来自 Dockerfile 内部的命令 rake assets:precompile 似乎失败,因为它需要 secret_key_base 值。我相信发生这种情况是因为它在您的本地项目中没有config/master.key。我建议使用以下方式将其传递给docker build

docker build  --build-arg RAILS_MASTER_KEY=$RAILS_MASTER_KEY ...

出于安全原因,我绝对不建议在项目本身中包含config/master.key,这就是为什么我会使用 ENV 变量。

在这种情况下,您似乎正在使用 Elastic Beanstalk“自动构建”(这意味着 Docker 映像是在您的源代码的每次部署上构建的),因此您无需手动构建映像。这可以通过使用 eb setenv RAILS_MASTER_KEY=XXXXXXXX 或从 AWS Web 控制台添加 RAILS_MASTER_KEY 环境变量来解决。

【讨论】:

谢谢费尔南多!你用Dockerrun.aws.json吗?我的根目录中只有Dockerfile。我在哪里实际包含docker build 命令? 我使用Dockerrun.aws.json,它适用于单容器和多容器设置。 Mutli-container 很酷,因为您最终可以在部署中部署单独的 Sidekiq 容器。但是有一个问题,如果您的根目录中有Dockerfile,我相信AWS 不会考虑Dockerrun.aws.json(它需要在您的项目中的其他位置)。我进行了谷歌搜索,但找不到如何传递参数。我可能会建议使用Dockerrun.aws.json(dev.to 教程有文档链接)手动构建容器映像并将其推送到 ECR(尝试 CI/CD)

以上是关于部署 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base`的主要内容,如果未能解决你的问题,请参考以下文章

使用适用于Ruby on Rails的AWS CI / CI流程进行部署

AWS OpsWorks:成功的 Ruby on Rails 默认层部署在浏览器中显示 404 错误

在 Elastic Beanstalk 环境上部署 ruby​​ on rails 应用程序时出现 AWS 数据库迁移错误

如何在 AWS OpsWorks 上调试 Ruby On Rails?

Amazon ElasticBeanstalk 上的 Ruby on Rails 部署:签名过期错误

AWS SNS 和 Ruby on Rails SMTP