2015-01-29 5 views
22

Also ich versuche, eine Dockerdatei auf Elastic Beanstalk zu implementieren, aber ich kann nicht über diesen Fehler - "jq: error: Kann nicht über Null iterieren".Docker Fehler - "jq: Fehler: Kann nicht über Null iterieren"

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' 

Es gibt keine anderen Fehler in den Protokollen. Mein Docker-Container wurde erfolgreich erstellt, daher scheint es unwahrscheinlich, dass der Fehler von dort kommt.

Mein Dockerrun.aws.json wie folgt aussieht:

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

ich meinen Kopf gegen eine Wand mit diesem hämmern, nichts, was ich so scheint es, zu beeinflussen ändern und googeln keine Hilfe war nicht.

Irgendwelche Ideen?

Antwort

22

Das Problem ist, dass Ihre Dockerrun.aws.json-Datei die Volumes-Eigenschaft fehlt.

Das Script 04pre.sh verwendet das Tool jq, um die JSON-Datei abzufragen.

Insbesondere läuft es den folgenden Befehl auf die Dateien, die zu einem Fehler führt:

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

Angabe eines leeren „Volumes“ Array sollte den Fehler beheben.

10

Beachten Sie, dass eine Elastic Beanstalk-Bereitstellung auf der Docker-Plattform mit der Fehlermeldung "jq: error ... Can not iterate over null ..." in verschiedenen Phasen einer Elastic Beanstalk-Bereitstellung aus verschiedenen Gründen fehlschlagen kann. Dies kann dazu führen, dass Ihre Anwendung (Docker-Container) beim Start beendet wird oder dass ein Fehler auftritt.

Obwohl dieses spezielle gemeldete Auftreten des Problems möglicherweise für eine fehlende "Volumes" -Eigenschaft in Dockerrun.aws.json spezifisch ist, ist Ihr Problem möglicherweise nicht. Wenn Sie diesen Fehler erhalten, besteht der beste Weg, das Problem zu diagnostizieren, darin, Ihre vollständigen EB-Protokolle herunterzuladen und die Diagnose in der folgenden Protokolldatei /var/log/eb-activity.log zu überprüfen.

Wenn das Problem dadurch verursacht wurde, dass Ihre Anwendung nicht gestartet werden konnte, finden Sie den Fehler in /var/log/eb-docker/containers/eb-current-app/unexpected-quit.log.

+3

Um eine Vorstellung von alternativen Ursachen für diese Fehlermeldung zu geben: meins wurde aufgrund von nicht genügend Arbeitsspeicher. –

18

Wenn andere suchen, wie die Cannot iterate over null Fehler in ihrem eigenen jq Befehlen zu vermeiden, ein Fragezeichen nach [] hinzufügen. Zum Beispiel

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

wo [] mit []? ersetzt wurde der Fehler nicht angezeigt werden soll.

Aus dem Handbuch:

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

Dies wird in jq 1.3 nicht unterstützt. Leider Ubuntu 14.04 Schiffe 1.3. Wer kennt einen Workaround für jq 1.3? – JDS

+0

Ja pls jede Arbeit um @nisetama – Nobody

+0

@JDS @nobody, siehe Antwort [hier] (https://Stackoverflow.com/a/42622937/267455) - da 'jq' ist eine einzelne, eigenständige Binär, können Sie einfach überschreiben Sie Ihre Apt-Version mit einer Version aus einer neueren Version, z. B. [Version 1.5] (https://github.com/stedolan/jq/releases/tag/jq-1.5) –

0

In meinem Fall Problem wurde durch ADD in Dockerfile statt COPY Anweisung verursacht. Durch das Ändern wurde das Problem behoben.