在部署弹性beanstalk之前运行正确的脚本

时间:2017-07-01 15:39:55

标签: python django amazon-web-services elastic-beanstalk

我正在编辑我的.ebextensions .config文件,以便在部署之前运行一些初始化命令。我以为这些命令将在包含我的应用程序的解压缩.zip的同一文件夹中运行。但事实并非如此。 manage.py位于我的zip的根目录中,如果我执行命令:

  01_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

我得到ERROR: [Instance: i-085e84b9d1df851c9] Command failed on instance. Return code: 2 Output: python: can't open file 'manage.py': [Errno 2] No such file or directory.

我可以执行command: "python /opt/python/current/app/manage.py collectstatic --noinput"但是会​​运行先前已成功部署的manage.py,而不是运行正在部署atm的.config

我尝试通过执行command: "pwd"检查/opt/elasticbeanstalk/eb_infra运行的命令的工作目录是什么,而pwd似乎是$PYTHONPATH,它不包含我的应用。< / p>

所以我可能需要更改option_settings: aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: myapp.settings PYTHONPATH: "./src" 以包含正确的路径,但我不知道它是哪条路径。

在此comment中,用户将以下内容添加到他的.config文件中:

manage.py

因为他的PYTHONPATH: "."位于他的zip根目录下的src文件夹中。在我的情况下,我会做public class ExportXML { public static void main(String [] args) throws Exception { Class.forName("org.sqlite.JDBC"); Connection conexiune=DriverManager.getConnection("jdbc:sqlite:BazaDeDate.db"); Statement comanda=conexiune.createStatement(); ResultSet rs=comanda.executeQuery("SELECT* FROM AvionPasageri"); JAXBContext context=JAXBContext.newInstance(AvionPasageri.class); Marshaller marshaller=context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); while(rs.next()) { String serie=rs.getString("serie"); float tonaj=rs.getFloat("tonaj"); String marca=rs.getString("marca"); float capacitate=rs.getFloat("capacitate"); String cnp=rs.getString("cnp"); List<String>listaCnp=new Vector<>(); listaCnp.add(cnp); AvionPasageri ap=new AvionPasageri(serie, tonaj, marca, capacitate,listaCnp); File f=new File("AvionPasageri.xml"); marshaller.marshal(ap,f); } } } ,但它不起作用。

2 个答案:

答案 0 :(得分:5)

AWS支持解决了这个问题。这是他们的答案:

当Beanstalk部署应用程序时,它会在处理EB Extensions和Hook脚本时将应用程序文件保存在“暂存”目录中。预部署脚本完成后,应用程序将移至“生产”目录。当您执行“01_collectstatic”命令时,您遇到的问题与“manage.py”文件不在预期位置有关。

您的环境的暂存位置(Python 3.4,Amazon Linux 2017.03)是“/ opt / python / ondeck / app”。

EB扩展“命令”部分在实际创建临时目录之前执行。要在创建临时目录后运行脚本,应使用“container_commands”。本部分用于在解压缩应用程序之后,但在将应用程序部署到生产目录之前修改应用程序。它将自动在您的临时目录中运行您的命令。

您能否尝试实施container_command部分,看看它是否有助于解决您的问题?语法看起来与此类似(但请在部署到生产之前对其进行测试):

container_commands:
  01_collectstatic:
    command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"

答案 1 :(得分:0)

因此,要记住关于beanstalk的事情是每个命令都是独立的,并且维护它们之间的状态。在这种情况下,您有两个选项,将命令放入uploaded in the files section of ebextensions的shell脚本中。或者,您可以编写一行命令,执行以您感兴趣的命令为前缀的所有有状态活动。

如,

00_collectstatic:
    command: "pushd /path/to/django && source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput && popd"