How to run Rails migrations and seeding in Amazon Elastic Beanstalk single container Docker environment

后端 未结 4 1872
野趣味
野趣味 2020-12-29 12:50

I\'m working on deploying a Rails application to Elastic Beanstalk using docker and so far everything has worked out. I\'m at the point where the application needs to run mi

4条回答
  •  清酒与你
    2020-12-29 13:19

    I'm not sure the solution you have proposed is going to work. It appears that the current process for EB Docker deployment runs container commands before the new docker container is running, which means that you can't use docker exec on it. I suspect that your commands will execute against the old container which is not yet taken out of service.

    After much trial and error I got this working through using container commands with a shell script.

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

    And the script:

    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
    

    I wrap the whole script in a check to ensure that migrations don't run on background workers.

    I then build the ENV in exactly the same way that EB does when starting the new container so that the correct environment is in place for the migrations.

    Finally I run the command against the new container which has been created but is not yet running - aws_beanstalk/staging-app. It exits at the end of the migration and the --rm removes the container automatically.

提交回复
热议问题