将 lxml 安装到 Elastic Beanstalk 时遇到问题
Trouble installing lxml to Elastic Beanstalk
很难将 Python requirements.txt 安装到 Elastic Beanstalk 上的 PHP 应用程序。
最初我曾质疑 . While this is not possible out of the box, it is possible to run pre-install commands via .ebextentions
的能力
这导致创建 .ebextentions/install_python_requirements.config
container_commands:
python_req:
command: 'pip install -r /var/app/ondeck/requirements.txt'
问题是,现在 lxml
,需求中的依赖项,在部署过程中始终失败。奇怪的是,ssh
直接进入 EC2 实例然后 运行 pip install -r requirements.txt
毫无问题地完成。
为什么依赖项安装通过直接 ssh
访问成功,但在使用 eb deploy
和 install_python_requirements.config
部署期间失败?
/var/log/eb-activity.log
失败
creating build/temp.linux-x86_64-2.7/src/lxml
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-A6NhcA/lxml/src/lxml/includes -I/usr/include/python2.7 -c src/lxml/lxml.etree.c -o build/temp.linux-x86_64-2.7/src/lxml/lxml.etree.o -w
gcc: error trying to exec 'cc1': execvp: No such file or directory
error: command 'gcc' failed with exit status 1
----------------------------------------
Command "/usr/bin/python2.7 -c "import setuptools, tokenize;__file__='/tmp/pip-build-A6NhcA/lxml/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-gSsRbZ-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-A6NhcA/lxml
(ElasticBeanstalk::ExternalInvocationError)
事实证明,问题最终出在系统 $PATH
上。似乎在 eb deploy
期间系统路径未设置。 pip install
能够开始,因为系统 PATH 可用于部署过程。但是,该系统 PATH 变量未传递到 pip
进程中。因此,当尝试对 pip 进行后续调用时,它们会因为找不到应用程序路径而失败。通过向 install_python_requirements.config
添加日志证明
whome:
command: 'whoami'
env:
command: '/bin/sh -c env'
然后检查 /var/log/eb-activity.log 上面日志命令的输出,并注意到 $PATH
的缺失
解决方案是通过另一个 .ebextentions/var.config
手动设置 PATH
option_settings:
- option_name: PATH
value: '/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin'
这使得 requirements.txt 在 eb deploy
过程中成功完成
很难将 Python requirements.txt 安装到 Elastic Beanstalk 上的 PHP 应用程序。
最初我曾质疑
这导致创建 .ebextentions/install_python_requirements.config
container_commands:
python_req:
command: 'pip install -r /var/app/ondeck/requirements.txt'
问题是,现在 lxml
,需求中的依赖项,在部署过程中始终失败。奇怪的是,ssh
直接进入 EC2 实例然后 运行 pip install -r requirements.txt
毫无问题地完成。
为什么依赖项安装通过直接 ssh
访问成功,但在使用 eb deploy
和 install_python_requirements.config
部署期间失败?
/var/log/eb-activity.log
失败 creating build/temp.linux-x86_64-2.7/src/lxml
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-A6NhcA/lxml/src/lxml/includes -I/usr/include/python2.7 -c src/lxml/lxml.etree.c -o build/temp.linux-x86_64-2.7/src/lxml/lxml.etree.o -w
gcc: error trying to exec 'cc1': execvp: No such file or directory
error: command 'gcc' failed with exit status 1
----------------------------------------
Command "/usr/bin/python2.7 -c "import setuptools, tokenize;__file__='/tmp/pip-build-A6NhcA/lxml/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-gSsRbZ-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-A6NhcA/lxml
(ElasticBeanstalk::ExternalInvocationError)
事实证明,问题最终出在系统 $PATH
上。似乎在 eb deploy
期间系统路径未设置。 pip install
能够开始,因为系统 PATH 可用于部署过程。但是,该系统 PATH 变量未传递到 pip
进程中。因此,当尝试对 pip 进行后续调用时,它们会因为找不到应用程序路径而失败。通过向 install_python_requirements.config
whome:
command: 'whoami'
env:
command: '/bin/sh -c env'
然后检查 /var/log/eb-activity.log 上面日志命令的输出,并注意到 $PATH
解决方案是通过另一个 .ebextentions/var.config
手动设置 PATH option_settings:
- option_name: PATH
value: '/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin'
这使得 requirements.txt 在 eb deploy
过程中成功完成