Подтвердить что ты не робот

Ошибка Docker - "jq: ошибка: не может перебирать нуль"

Итак, я пытаюсь развернуть dockerfile на Elastic Beanstalk, но я не могу пройти мимо этой ошибки - "jq: error: Can not 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 успешно построен, поэтому кажется маловероятным, что ошибка исходит оттуда.

My Dockerrun.aws.json выглядит так:

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

Я ударяю головой о стену с этим, ничто из меня, похоже, не влияет на него, и googling не помог.

Любые идеи?

4b9b3361

Ответ 1

Проблема заключается в том, что в вашем файле Dockerrun.aws.json отсутствует свойство Volumes.

В 04pre.sh script используется инструмент jq, чтобы запросить файл JSON.

В частности, он выполняет следующую команду в вашем файле, что приводит к ошибке:

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

Указание пустого массива "Объемы" должно разрешить ошибку.

Ответ 2

Если другие ищут, как избежать ошибки 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.

Ответ 3

Обратите внимание, что развертывание Эластичного Beanstalk на платформе Docker может потерпеть неудачу с сообщением об ошибке "jq: error... Can not iterate over null..." на разных этапах развертывания Elastic Beanstalk по различным причинам. Это может включать ваше приложение (контейнер Docker) при выходе или ошибке при запуске.

Хотя это конкретное сообщение о возникновении проблемы, возможно, было специфичным для отсутствующего свойства "Тома" в Dockerrun.aws.json, вашей проблемы может быть не так. Если вы получите эту ошибку, то лучше всего диагностировать проблему - загрузить ваши полные журналы EB и проверить диагностику в следующем файле журнала /var/log/eb -activity.log.

Если проблема возникла из-за неудачного запуска приложения, вы обнаружите ошибку в/var/log/eb-docker/containers/eb-current-app/unexpected-quit.log.

Ответ 4

В моем случае проблема была вызвана ADD в файле Dockerfile вместо инструкции COPY. Это изменило проблему.