我试图支持使用EB的webp格式,但它没有按预期工作。。。
我用.eextensions创建了一个.config文件:
commands:
01-command:
command: wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-0.5.0.tar.gz
02-command:
command: tar xvzf libwebp-0.5.0.tar.gz
03-command:
command: cd libwebp-0.5.0
04-command:
command: ./configure
05-command:
command: make
06-command:
command: sudo make install
但当部署时,我得到了这个错误:
错误:命令在实例上失败。返回代码:127输出:/bin/sh:/configure:没有这样的文件或目录。
我做错什么了吗?(环境:64位Amazon Linux 2015.09 v2.0.6运行PHP 5.6)
您需要执行安装后部署。AWS还没有真正记录如何执行post部署后的命令,所以我将在这里执行。
commands:
create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_install_libwebp.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-0.5.0.tar.gz
tar xvzf libwebp-0.5.0.tar.gz
cd libwebp-0.5.0
sudo ./configure
sudo make
sudo make install
正如我所提到的,AWS并没有真正证明您可以在部署后在ElasticBeanstalk上执行脚本。如果您查看eb-commandprocessor.log文件,您将看到eb查找AppDeployPreHook(第4个,共6个)和AppDeployPostHook(第一个,共2个)。它看起来像这样:
[2016-04-13T14:15:22.955Z] DEBUG [8851] : Loaded 6 actions for stage 0.<br>
[2016-04-13T14:15:22.955Z] INFO [8851] : Running 1 of 6 actions: InfraWriteConfig...<br>
[2016-04-13T14:15:22.962Z] INFO [8851] : Running 2 of 6 actions: DownloadSourceBundle...<br>
[2016-04-13T14:15:23.606Z] INFO [8851] : Running 3 of 6 actions: EbExtensionPreBuild...<br>
[2016-04-13T14:15:24.229Z] INFO [8851] : Running 4 of 6 actions: AppDeployPreHook...<br>
[2016-04-13T14:15:28.469Z] INFO [8851] : Running 5 of 6 actions: EbExtensionPostBuild...<br>
[2016-04-13T14:15:28.970Z] INFO [8851] : Running 6 of 6 actions: InfraCleanEbextension...<br>
[2016-04-13T14:15:28.974Z] INFO [8851] : Running stage 1 of command CMD-AppDeploy...<br>
[2016-04-13T14:15:28.974Z] DEBUG [8851] : Loaded 2 actions for stage 1.<br>
[2016-04-13T14:15:28.974Z] INFO [8851] : Running 1 of 2 actions: AppDeployEnactHook...<br>
[2016-04-13T14:15:29.600Z] INFO [8851] : Running 2 of 2 actions: AppDeployPostHook...<br>
[2016-04-13T14:16:42.048Z] INFO [8851] : Running AddonsAfter for command CMD-AppDeploy... <br>
这个小小的"AppDeployPostHook"告诉我们,它正在搜索运行部署后的脚本。您可以在服务器上的/opt/elasticbeanstalk
目录中找到eb部署脚本,如果您在该目录中ssh和ls
,您将找到hooks
,这就是我们要查找的内容;如果您在cd hooks
中找到appdeploy目录,cd appdeploy
,然后是ls
,您将获得两个预生成目录。这看起来很普通,但确实很棒,因为现在我们知道eb在哪里寻找它正在运行的脚本了。由于AppDeployPreHook脚本是从"pre"目录执行的,我们知道我们需要一个"post"目录来使用eb正在运行的AppDeployPostHook执行命令行部署。既然我们知道该做什么,我们就可以开始编写命令了。
- create_post_dir第一步是使用mkdir命令在服务器上创建"post"目录。
mkdir "/opt/elasticbeanstalk/hooks/appdeploy/post"
会为我们做这件事,所以我们将创建它作为命令 - 文件文件配置允许我们通过ElasticBeanstalk在目录中创建一个文件。非常方便我们的目的!files操作的第一行为我们提供了要创建的文件的名称。我们将创建一个shell脚本来执行命令,您可以随意调用它,但我会从99开始,然后继续。我们将创建的这个shell脚本称为"99_install_libwebp.sh"
- 文件设置接下来的三行设置文件设置。确保root拥有它们,并且有000755'd
- 文件内容这是我们正在创建的文件的内容。直截了当。把你的shell脚本放在那里,你就可以开始了
- 加载环境变量我们选择加载eb环境变量,这样我们的脚本就可以知道应用程序的当前版本在哪里。它通常在/var/app/current中,但根据各种因素,它可能在其他地方。我们将使用环境变量来让我们的生活更轻松
- 更改到我们当前的应用程序目录我们将cd到我们当前应用程序目录,这样我们就可以做我们在这里要做的事情
- 获取我们想要的软件包使用wget获取我们需要的libwebp
- 打开包装不言自明
- 更改到包目录现在我们已经解包了,我们可以更改到包的目录
- 做我们需要做的事情我们现在可以运行我们的/配置、制作和安装
就是这样。你可以使用隐秘的AppDeployPostHook来运行你需要的任何部署后命令。如果您需要安装软件包、重新启动服务或在部署后执行任何其他操作,则非常有用。
我添加了我部署到Github的代码,以便于参考。https://github.com/hephalump/testphp
注意:我成功地运行了一个稍微不同的环境。我使用ElasticBeanstalk部署了一个新的PHP应用程序,使用的最新环境版本是64位Amazon Linux 2016.03 v2.1.0上的PHP 5.6;你使用的环境类型对我来说不是一个选项……事实上,这是我唯一可用的PHP 5.6版本,所以我选择了它。