docker错误 – “jq:错误:无法遍历空”

所以我试图在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容器是成功构build的,所以看起来似乎不太可能从那里发生错误。

我的Dockerrun.aws.json如下所示:

  { "AWSEBDockerrunVersion": "1", "Image": { "Name": "blah", "Update": "false" }, "Ports": [ { "ContainerPort": "8080" } ] } 

我用这一个敲我的头撞墙,没有任何改变似乎影响它,谷歌search没有任何帮助。

有任何想法吗?

问题是您的Dockerrun.aws.json文件缺lessVolumes属性。

04pre.sh脚本使用jq工具来查询JSON文件。

具体来说,它会在您的文件上运行以下命令,这会导致错误:

 $ jq -c '.Volumes[] | [.HostDirectory, .ContainerDirectory]' < Dockerrun.aws.json jq: error: Cannot iterate over null 

指定一个空的“卷”数组应该可以解决这个错误。

如果其他人正在寻找如何避免在自己的jq命令中Cannot iterate over null错误,请在[]后面添加一个问号。 例如

 echo '{ "AWSEBDockerrunVersion": "1", "Image": { "Name": "blah", "Update": "false" }, "Ports": [ { "ContainerPort": "8080" } ] }'|jq -c '.Volumes[]?|[.HostDirectory,.ContainerDirectory]' 

哪里[]被replace为[]? 不显示错误。

从手册:

 .[]? Like .[], but no errors will be output if . is not an array or object. 

请注意,由于各种不同的原因,Elastic Beanstalk部署到Docker平台可能会因Elastic Beanstalk部署的各个阶段中的“jq:error …无法迭代null …”错误消息而失败。 这可能包括您的应用程序(Docker容器)在启动时退出或错误。

虽然这个特定的报告发生的问题可能是特定于Dockerrun.aws.json中缺less“卷”属性,您的问题可能不会。 如果出现此错误,那么诊断问题的最佳方法是下载完整的EB日志,并在以下日志文​​件/var/log/eb-activity.log中检查诊断。

如果问题是由于您的应用程序无法启动导致的,那么您会在/var/log/eb-docker/containers/eb-current-app/unexpected-quit.log中find该错误。

在我的情况下,问题是由Dockerfile中的ADD而不是COPY指令造成的。 改变它解决了这个问题。