你能在弹性beanstalk环境中运行rails控制台或rake命令吗?

时间:2013-10-27 17:12:34

标签: ruby-on-rails amazon-web-services amazon-ec2 elastic-beanstalk

我已经在AWS'弹性beanstalk上建立了一个RoR环境。我能够进入我的EC2实例。 我的主目录是/ home / ec2-user ,实际上是空的。 如果我向上移动目录,还有一个我无法访问的 / home / webapp 目录。

有没有办法在弹性beanstalk实例上运行 rake 命令或 rails console

如果我输入 rails console ,我会Usage: rails new APP_PATH [options] 如果我输入 RAILS_ENV =生产包exec rails console ,我会收到“Could not locate Gemfile

12 个答案:

答案 0 :(得分:52)

对于rails,跳转到/var/app/current然后@juanpastas说,运行RAILS_ENV=production bundle exec rails c

答案 1 :(得分:40)

不知道为什么,但由于EBS以root身份运行所有内容,这对我有用:

sudo su
bundle exec rails c production

答案 2 :(得分:14)

这里提到的这些解决方案都不适合我,所以我编写了一个脚本/ aws-console中的小脚本。

您可以以root身份从/ var / app / current目录运行它:

eb ssh
cd /var/app/current
sudo script/aws-console

我的脚本可以找到Gist here

答案 3 :(得分:8)

其他答案都没有对我有用,所以我去寻找 - 这对我现在的弹性beanstalk 64bit amazon linux 2016.03 V2.1.2 ruby​​ 2.2(美洲狮)堆栈

cd /var/app/current
sudo su
rake rails:update:bin
bundle exec rails console

返回预期的控制台

Loading production environment (Rails 4.2.6)
irb(main):001:0>

答案 4 :(得分:3)

我想在我的rails应用的根目录创建一个eb_console文件,然后chmod u+x。它包含以下内容:

ssh -t ec2-user@YOUR_EC2_STATION.compute.amazonaws.com  'cd /var/app/current && bin/rails c'

这样,我只需要运行:

./eb_console

就像我会运行heroku run bundle exec rails c

答案 5 :(得分:1)

对于最新的红宝石版本,请使用以下命令:

BUNDLE_PATH = / opt / rubies / ruby​​-2.6.3 / lib / ruby​​ / gems / 2.6.0 / bundle exec rails c production

不需要使用sudo运行它。

答案 6 :(得分:1)

对于 Ruby 2.7:

正如有人所说,如果您不需要 env vars,请运行以下代码

BUNDLE_PATH=/var/app/current/vendor/bundle/ bundle exec rails c

但是,如果您需要 ENV,我建议按照 AWS 文档执行此操作: https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-linux2/

tl;博士

在 Amazon Linux 2 上,所有环境属性都集中在一个名为 /opt/elasticbeanstalk/deployment/env 的文件中。没有用户可以在应用程序之外访问这些。所以,他们建议在部署后添加一些钩子脚本,基本上创建一个副本。

#!/bin/bash

#Create a copy of the environment variable file.
cp /opt/elasticbeanstalk/deployment/env /opt/elasticbeanstalk/deployment/custom_env_var

#Set permissions to the custom_env_var file so this file can be accessed by any user on the instance. You can restrict permissions as per your requirements.
chmod 644 /opt/elasticbeanstalk/deployment/custom_env_var

#Remove duplicate files upon deployment.
rm -f /opt/elasticbeanstalk/deployment/*.bak

如果由于某种原因您不想以 root 身份运行,请执行以下操作以将 env vars 从 root 传递到新的用户环境:

sudo -u <user> -E env "PATH=$PATH" bash -c 'cd /var/app/current/ && <wtv you want to run>'

答案 7 :(得分:0)

这些都不适合我,包括aws-console脚本。我最终在script中创建了一个/var/app/current目录,然后在this answer on another SO question中按照大纲创建了该rails文件。

eb ssh myEnv
cd /var/app/current
sudo mkdir script
sudo vim script/rails

将此添加到文件并保存:

echo #!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'

然后使其可执行并运行它:

sudo chmod +x script/rails
sudo script/rails console

它有效。

答案 8 :(得分:0)

添加eb扩展快捷方式:

# .ebextensions/irb.config
files:
  "/home/ec2-user/irb":
    mode: "000777"
    owner: root
    group: root
    content: |
      sudo su - -c 'cd /var/app/current; bundle exec rails c'

然后:

$ eb ssh
$ ./irb
irb(main):001:0>

答案 9 :(得分:0)

#!/bin/sh

shell_join () {
  ruby -r shellwords -e 'puts Shellwords.join(ARGV)' "$@"
}


command_str () {
  printf 'set -e; . /etc/profile.d/eb_envvars.sh; . /etc/profile.d/use-app-ruby.sh; set -x; exec %s\n' "$(shell_join "$@")"
}

exec sudo su webapp -c "$(command_str "$@")"

将文件放在源代码中的某个位置,将eb ssh部署到eb实例cd /var/app/current中,然后执行path/to/above/script bin/rails whatever argumeents you usually use

我为什么要写上面的脚本的原因是:

  1. 使用sudo时,它会删除一些Rails应用程序可能实际需要的环境变量;因此手动加载Elastic Beanstalk平台提供的配置文件。
  2. 当前的Beanstalk红宝石平台假设您在用户webapp(不可登录用户)上运行Rails应用程序,因此在该用户中运行命令将是明智的。

答案 10 :(得分:0)

对于Ruby 2.7:

如果您不需要环境变量:

scipy.integrate.solve_ivp

环境变量似乎不再自动加载,这可能会阻止Rails控制台启动。 我通过创建此.ebextensions文件解决了该问题:

BUNDLE_PATH=/var/app/current/vendor/bundle/ bundle exec rails c

答案 11 :(得分:-1)

您必须找到包含Gemfile的文件夹:p。

要做到这一点,我会看看你的网络服务器配置应该有一个配置,告诉你你的应用程序目录在哪里。

也许你知道你的应用在哪里。

但如果您不知道,我会尝试:

grep -i your_app_name /etc/apache/*
grep -i your_app_name /etc/apache/sites-enabled/*

在Apache config中搜索包含your_app_name的文件。

或者,如果您使用的是nginx,请将上面的apache替换为nginx

找到应用程序文件夹后,找到它并运行RAILS_ENV=production bundle exec rails c

确保您的应用程序配置为在Apache或nginx配置中的生产中运行。