ruby-on-rails - 如何在 Amazon Elastic Beanstalk 单容器 Docker 环境中运行 Rails 迁移和播种

标签 ruby-on-rails docker amazon-elastic-beanstalk

我正在使用 docker 将 Rails 应用程序部署到 Elastic Beanstalk,到目前为止一切顺利。我正处于应用程序需要运行数据库的迁移和播种的地步,但我无法确切地弄清楚我需要如何进行。 /.ebextensions 文件夹中的任何命令似乎都在主机上下文中运行,而不是在 docker 容器中运行。对吗?

我可以在启动后运行命令在 docker 容器内执行迁移,但是如何确保迁移仅在单个实例上运行?是否有环境变量或其他方式可以告诉我 docker 容器中的领导者是哪台机器?


更新:我发布了 a question in the Amazon Elastic Beanstalk forums asking how to run "commands from Docker host on the container" 8 月 6 日/15 日。您可以关注那里的对话以及它们是否有用。

最佳答案

我不确定您提出的解决方案是否可行。 EB Docker 部署的当前进程似乎在新的 docker 容器运行之前运行容器命令,这意味着您不能在其上使用 docker exec。我怀疑您的命令将针对尚未停止服务的旧容器执行。

经过多次试验和错误,我通过使用带有 shell 脚本的容器命令来解决这个问题。

container_commands:
  01_migrate_db:
    command: ".ebextensions/scripts/migrate_db.sh"
    leader_only: true

还有脚本:

if [ "${PROCESS}" = "WEB" ]; then

  . /opt/elasticbeanstalk/hooks/common.sh

  EB_SUPPORT_FILES=$(/opt/elasticbeanstalk/bin/get-config container -k support_files_dir)

  EB_CONFIG_DOCKER_ENV_ARGS=()

  while read -r ENV_VAR; do
    EB_CONFIG_DOCKER_ENV_ARGS+=(--env "$ENV_VAR")
  done < <($EB_SUPPORT_FILES/generate_env)

  echo "Running migrations for aws_beanstalk/staging-app"
  docker run --rm "${EB_CONFIG_DOCKER_ENV_ARGS[@]}" aws_beanstalk/staging-app bundle exec rake db:migrate || echo "The Migrations failed to run."
fi
true

我将整个脚本封装在一个检查中,以确保迁移不会在后台工作人员上运行。

然后,我以与 EB 在启动新容器时完全相同的方式构建 ENV,以便为迁移准备好正确的环境。

最后,我对已创建但尚未运行的新容器运行命令 - aws_beanstalk/staging-app。它在迁移结束时退出,--rm 会自动删除容器。

关于ruby-on-rails - 如何在 Amazon Elastic Beanstalk 单容器 Docker 环境中运行 Rails 迁移和播种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31572970/

相关文章:

reactjs - 在生产模式下 Dockerizing React : FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

ruby-on-rails - Rails 3 应用程序中没有方法错误

mysql - rails db:migrate rails 中止! Mysql2::错误:用户 'root' @'localhost' 的访问被拒绝(使用密码:是)

docker - 带有 .net core 3.1 Web 应用程序的 docker 容器问题

amazon-web-services - 将Docker容器部署到AWS时,是否还需要部署自己的反向代理?

amazon-web-services - 计划在Beanstalk部署或ECS任务不使用EC2实例时停止/启动EC2实例?

java - Spring Controller : method to return file path?

ruby-on-rails - rails : prepend_before_action in superclass

ruby-on-rails - 带参数的 before_filter

docker - docker commit至少需要1个参数,最多2个参数