【问题标题】:Docker Error - "jq: error: Cannot iterate over null"Docker 错误 - “jq:错误:无法迭代 null”
【发布时间】:2015-03-28 14:11:31
【问题描述】:

所以我试图在 Elastic Beanstalk 上部署一个 dockerfile,但我无法克服这个错误 - “jq: error: Cannot iterate over 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"
    }
  ]
}

我正用这个把头撞到墙上,我所做的任何改变似乎都不会影响它,谷歌搜索也没有任何帮助。

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services docker amazon-elastic-beanstalk jq


    【解决方案1】:

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

    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.
    

    【讨论】:

    • jq 1.3 不支持此功能;不幸的是,ubuntu 14.04 发布了 1.3。有人知道 jq 1.3 的解决方法吗?
    • @JDS @nobody,查看答案here - 因为jq 是一个单独的、自包含的二进制文件,您可以用较新版本的版本覆盖您的apt 版本,例如version 1.5
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      请注意,在 Elastic Beanstalk 部署的各个阶段,出于各种不同的原因,部署到 Docker 平台的 Elastic Beanstalk 可能会失败并显示“jq: error ... Cannot iterate over null...”错误消息。这可能包括您的应用程序(Docker 容器)在启动时退出或出错。

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

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

      【讨论】:

      • 给出一些关于此错误消息的替代原因的想法:我的原因是内存不足。
      • 这确实是最好的答案。此外,对于像我这样的新手,要检查日志,您可以在 CLI 上执行此操作:eb logs
      【解决方案4】:

      在我的情况下,问题是由 Dockerfile 中的 ADD 而不是 COPY 指令引起的。更改它可以解决问题。

      【讨论】:

        猜你喜欢
        • 2019-09-14
        • 2019-07-14
        • 2019-08-04
        • 2019-06-08
        • 2021-04-27
        • 2019-11-02
        • 1970-01-01
        • 2021-09-30
        • 2020-01-06
        相关资源
        最近更新 更多