web-dev-qa-db-fra.com

Erreur Docker - "jq: erreur: impossible d'itérer sur null"

J'essaie donc de déployer un fichier de dock sur Elastic Beanstalk, mais je ne peux pas dépasser cette erreur - "jq: erreur: impossible de parcourir la valeur 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'

Il n'y a pas d'autres erreurs dans les journaux. Mon conteneur Docker a été construit avec succès. Il semble donc peu probable que l'erreur vienne de là. 

Mon Dockerrun.aws.json ressemble à: 

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

Je frappe ma tête contre un mur avec celui-ci, rien de ce que je change ne semble l'affecter et googler n'a été d'aucune aide. 

Des idées?

22
YYZ

Si d’autres cherchent comment éviter l’erreur Cannot iterate over null dans leurs propres commandes jq, ajoutez un point d’interrogation après le []. Par exemple

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

[] a été remplacé par []? n'affiche pas l'erreur.

Du manuel:

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

Le problème est que la propriété Volumes est manquante dans votre fichier Dockerrun.aws.json.

Le script 04pre.sh utilise l'outil jq pour interroger le fichier JSON.

Plus précisément, il exécute la commande suivante sur votre fichier, ce qui génère une erreur:

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

Spécifier un tableau "Volumes" vide devrait résoudre l'erreur.

22
cbley

Notez qu'un déploiement d'Elastic Beanstalk sur la plate-forme Docker peut échouer avec le message d'erreur "jq: erreur ... ne peut pas itérer sur null ..." dans différentes phases d'un déploiement Elastic Beanstalk, pour différentes raisons. Cela peut inclure votre application (conteneur Docker) qui se ferme ou se trompe au démarrage. 

Bien que cette occurrence signalée du problème ait pu être spécifique à une propriété "Volumes" manquante dans Dockerrun.aws.json, votre problème peut ne pas l'être. Si vous obtenez cette erreur, le meilleur moyen de diagnostiquer le problème est de télécharger vos journaux EB complets et de vérifier les diagnostics dans le fichier journal suivant /var/log/eb-activity.log.

Si le problème a été causé par l'échec de votre application au démarrage, vous trouverez l'erreur dans /var/log/eb-docker/containers/eb-current-app/unexpected-quit.log.

11
Neil Brown

Dans mon cas, le problème a été causé par ADD dans Dockerfile au lieu de l'instruction COPY. Le changer a résolu le problème.

0
Victor