Exec del Docker – Scriva il text al file nel contenitore

Voglio scrivere una row di text a un file di text INSIDE un contenitore per dock in esecuzione. Ecco cosa ho provato finora:

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 

Qualche idea?

eval è una shell incorporata , mentre il command docker exec richiede che venga chiamata un'utilità esterna , quindi l'utilizzo di eval non è un'opzione.

Invece, ricall in modo esplicito un shell eseguibile nel contenitore ( bash ) e passarlo il command da eseguire come una string , tramite la sua opzione -c :

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

Utilizzando una string double per passare a bash -c , assicurati che la shell corrente esegue l'interpolazione di string prima, mentre l'istanza bash del contenitore vede il risultato espanso come un letterale , come parte della string singola citata incorporata.


Per quanto riguarda i sintomi :

  • /home/user/.app/app.config: No such file or directory stato segnalato, perché il reindirizzamento che hai intenzione di accadere nel contenitore è accaduto effettivamente nella shell del tuo host e perché dir. /home/user/.app apparentemente non esiste nel filesystem del tuo host, il command è fallito fondamentalmente , prima che il shell dell'host abbia persino tentato di eseguire il command ( bash aborti l'esecuzione del command se non è ansible eseguire un reindirizzamento di output).

    • Così, anche se il tuo primo command conteneva anche eval , il suo utilizzo non si è presentato come un problema finché il secondo command non è stato eseguito.
  • exec: "eval": executable file not found in $PATH accaduto perché, come detto, l' eval non è un'utilità esterna , ma una shell incorporata e l' docker exec può eseguire solo utilità esterne.

Inoltre:

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

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

Questo ti farà entrare nel contenitore. Naturalmente, questo functionrebbe anche per il text normale (nessun file). È importnte lasciare il parametro -t .

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

UPDATE (nel caso in cui sia sufficiente copiare file, non parti di file):

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

Provate le citazioni singole in tutto:

 docker exec -i app_$i 'echo "Hello World" > test.txt'