所以我试图在Elastic Beanstalk上部署dockerfile,但是我无法解决这个错误 - " jq:error:无法迭代null"。
Successfully built [myContainerId]
Successfully built aws_beanstalk/staging-app
[2015-01-29T10:35:59.494Z] INFO [16343] - [CMD-AppDeploy/AppDeployStage0/AppDeployPreHook/04run.sh] : Starting activity...
[2015-01-29T10:36:05.507Z] INFO [16343] - [CMD-AppDeploy/AppDeployStage0/AppDeployPreHook/04run.sh] : Activity execution failed, because: command failed with error code 1: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
jq: error: Cannot iterate over null
Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Thu Jan 29 10:36:05 UTC 2015:. Check snapshot logs for details. (Executor::NonZeroExitStatus)
at /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/executor-1.0/lib/executor/exec.rb:81:in `sh'
from /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/executor-1.0/lib/executor.rb:15:in `sh'
from /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/beanstalk-core-1.1/lib/elasticbeanstalk/executable.rb:63:in `execute!'
from /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/beanstalk-core-1.1/lib/elasticbeanstalk/hook-directory-executor.rb:29:in `block (2 levels) in run!'
from /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/beanstalk-core-1.1/lib/elasticbeanstalk/activity.rb:169:in `call'
from /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.1.0/gems/beanstalk-core-1.1/lib/elasticbeanstalk/activity.rb:169:in `exec'
日志中没有任何其他错误。我的Docker容器已成功构建,因此似乎不太可能出现错误。
我的Dockerrun.aws.json看起来像:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "blah",
"Update": "false"
},
"Ports": [
{
"ContainerPort": "8080"
}
]
}
我用这个把头撞到墙上,我改变的任何东西似乎都没有影响它,谷歌搜索也没有任何帮助。
有什么想法吗?
答案 0 :(得分:28)
如果其他人正在寻找如何避免他们自己的Cannot iterate over null
命令中的jq
错误,请在[]
之后添加问号。例如
echo '{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "blah",
"Update": "false"
},
"Ports": [
{
"ContainerPort": "8080"
}
]
}'|jq -c '.Volumes[]?|[.HostDirectory,.ContainerDirectory]'
其中[]
被[]?
替换,但不显示错误。
从手册:
.[]?
Like .[], but no errors will be output if . is not an array or object.
答案 1 :(得分:23)
问题是您的Dockerrun.aws.json文件缺少Volumes
属性。
04pre.sh脚本使用jq工具来查询JSON文件。
具体来说,它会在您的文件上运行以下命令,从而产生错误:
$ jq -c '.Volumes[] | [.HostDirectory, .ContainerDirectory]' < Dockerrun.aws.json
jq: error: Cannot iterate over null
指定一个空的“Volumes”数组应该可以解决错误。
答案 2 :(得分:11)
请注意,对Docker平台的Elastic Beanstalk部署可能会失败,并且&#34; jq:error ...无法迭代null ...&#34;出于各种不同的原因,在Elastic Beanstalk部署的各个阶段中出现错误消息。这可能包括您的应用程序(Docker容器)在启动时退出或出错。
虽然这个特定报道的问题可能是特定于缺失的&#34;卷&#34;在Dockerrun.aws.json的财产,你的问题可能不是。如果您收到此错误,那么诊断问题的最佳方法是下载完整的EB日志并检查以下日志文件/var/log/eb-activity.log中的诊断信息。
如果问题是由您的应用程序无法启动引起的,那么您将在/var/log/eb-docker/containers/eb-current-app/unexpected-quit.log.
答案 3 :(得分:0)
在我的情况下,问题是由Dockerfile中的ADD
而不是COPY
指令引起的。改变它解决了这个问题。