我正在编辑我的.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);
}
}
}
,但它不起作用。
答案 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"