2016-02-29 16 views
8

Voglio scrivere una riga di testo in un file di testo DENTRO un contenitore di finestra mobile in esecuzione. Ecco quello che ho provato finora:Esegui finestra mobile - Scrive il testo in un file nel contenitore

docker exec -d app_$i eval echo "server.url=$server_url" >> /home/app/.app/app.config 

Risposta:

/home/user/.app/app.config: No such file or directory 

secondo tentativo:

cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config" 
docker exec -i app_$i eval $cfg_add 

Risposta:

exec: "eval": executable file not found in $PATH 

Tutte le idee?

+0

Perché '-d' per docker exec? – user2915097

+2

'eval' non è presente nel contenitore. Il kernel è condiviso tra l'host e il contenitore. I programmi non lo sono. Se hai installato 'nc' sul tuo host, il contenitore non sarà in grado di eseguirlo finché non lo ha installato all'interno. – Auzias

+0

@Auzias: Il problema non è che 'eval' non è _present_ nel contenitore (probabilmente è, come _shell builtin_ della shell del contenitore), ma che è _non un'utility esterna_, quindi 'docker exec' non può richiamare esso. – mklement0

risposta

22

eval è un guscio builtin, considerando docker exec richiede un'utilità esterna di essere chiamato, in modo da utilizzare eval è non un'opzione.

invece richiamare un eseguibile shell nel contenitore (bash) esplicitamente, e passarlo il comando da eseguire come stringa, tramite il suo -c opzione:

docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config" 

Utilizzando un doppia -corretta per passare a bash -c, ci si assicura che la shell corrente esegua prima l'interpolazione stringa, mentre l'istanza bash del contenitore vede il risultato espanso come letterale, come parte della stringa con citazione singola.


Per quanto riguarda i sintomi:

  • /home/user/.app/app.config: No such file or directory è stato segnalato, in quanto il reindirizzamento si intendeva accadere nel contenitore realmente accaduto in guscio tuo host - e perché dir. /home/user/.app apparentemente non esiste nel filesystem del tuo host, il comando non è riuscito fondamentalmente, prima dello la shell del tuo host ha anche tentato di eseguire il comando (bash interromperà l'esecuzione del comando se non è possibile eseguire un reindirizzamento dell'output).

    • Così, anche se il primo comando conteneva anche eval, il suo uso non ha di superficie come un problema fino a quando il secondo comando, che in realtà ha fatto vengono eseguiti.
  • exec: "eval": executable file not found in $PATH successo, perché, come detto, non è eval un'utilità esterna , ma un guscio BUILTIN e docker exec può eseguire solo utenze esterne.

+0

Ottima risposta. Ho postato una risposta qui sotto, senza rendermi conto che voleva usare le variabili dichiarate dall'host e così via. La tua risposta è molto migliore e ho spiegato le cose molto bene. Grazie. – CtheGood

+0

@CtheGood: Grazie; a parte l'uso delle variabili host, il tuo comando non funzionerà, perché devi passare gli argomenti _separatamente_ a 'docker exec'; nel tuo caso, la stringa _entire_ single-quoted sarebbe interpretata come _command name_, e restituirà il seguente errore: 'exec:" echo \ "Hello World \"> test.txt ": file eseguibile non trovato in $ PATH' – mklement0

+0

Ecco un esempio qui è possibile scrivere file con citazioni in essi. Ad esempio, si desidera scrivere 'obj ['key'] = 'value'' in un file denominato'/etc/config.py' 'docker exec" app_ $ i "bash -c' echo" obj [' "'chiave'" '] =' "'valore'" '">/etc/config.py'' – Gourneau

4

Inoltre:

Se è necessario scrivere il testo dall'esterno del contenitore, questo funziona anche:

(docker exec -i container sh -c "cat > c.sql") < c.sql 

Questo tubo volontà si immette nel contenitore. Naturalmente, questo funzionerebbe anche per il testo semplice (nessun file). È importante lasciare il parametro -t.

Vedi https://github.com/docker/docker/pull/9537

UPDATE (nel caso in cui non vi resta che copiare i file, non parti di file):

Docker v17.03 ha docker cp che copia tra le fs locali e il contenitore: https://docs.docker.com/engine/reference/commandline/cp/#usage

Problemi correlati