2015-01-29 14 views
22

Quindi sto cercando di distribuire un file docker su Elastic Beanstalk, ma non riesco a superare questo errore - "jq: errore: impossibile ripetere su null".Errore Docker - "jq: errore: impossibile ripetere su 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' 

Non ci sono altri errori nei registri. Il mio contenitore Docker è stato creato con successo, quindi sembra improbabile che l'errore provenga da lì.

mio Dockerrun.aws.json assomiglia:

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

sto sbattendo la testa contro un muro con questo, niente cambio sembra incidere su di essa e googling non è stato di alcun aiuto.

Qualche idea?

risposta

22

Il problema è che nel file Dockerrun.aws.json manca la proprietà Volumes.

Lo script 04pre.sh utilizza lo strumento jq per interrogare il file JSON.

In particolare, viene eseguito il seguente comando sul file, che cede di un errore:

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

specificare una matrice "Volumi" vuoti dovrebbe risolvere l'errore.

10

Si noti che una distribuzione Elastic Beanstalk sulla piattaforma Docker può fallire con il messaggio di errore "jq: error ... Can not iterate over null ..." in varie fasi di una distribuzione Elastic Beanstalk, per vari motivi. Ciò può includere l'applicazione (contenitore Docker) in uscita o l'errore all'avvio.

Anche se questo particolare evento segnalato del problema potrebbe essere stato specifico per una proprietà "Volumi" mancante in Dockerrun.aws.json, il problema potrebbe non esserlo. Se si verifica questo errore, il modo migliore per diagnosticare il problema è scaricare i registri EB completi e controllare la diagnostica nel seguente file di log /var/log/eb-activity.log.

Se il problema è stato causato dall'avvio dell'applicazione non riuscita, si troverà l'errore in /var/log/eb-docker/containers/eb-current-app/unexpected-quit.log.

+3

Per dare un'idea delle cause alternative di questo messaggio di errore: il mio era dovuto alla mancanza di memoria. –

18

Se gli altri sono alla ricerca di come evitare l'errore Cannot iterate over null nelle proprie jq comandi, aggiungere un punto interrogativo dopo []. Per esempio

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

dove [] è stato sostituito con []? non visualizza l'errore.

Dal manuale:

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

Questo non è supportato in jq 1.3; sfortunatamente, ubuntu 14.04 ha 1.3. qualcuno sa una soluzione alternativa per jq 1.3? – JDS

+0

Sì, qualsiasi problema intorno a @nisetama – Nobody

+0

@JDS @nobody, vedere la risposta [qui] (https://stackoverflow.com/a/42622937/267455) - poiché 'jq' è un singolo binario autonomo, puoi solo sovrascrivi la tua versione di apt con una da una versione più recente, come [versione 1.5] (https://github.com/stedolan/jq/releases/tag/jq-1.5) –

0

Nel mio problema è stato causato da caso ADD in Dockerfile invece di COPY istruzioni. La modifica ha risolto il problema.