Docker exec – Escribir text en file en contenedor

Quiero escribir una línea de text en un file de text DENTRO de un contenedor acoplador en ejecución. Esto es lo que he intentado hasta ahora:

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

Respuesta:

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

Segundo bash:

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

Respuesta:

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

¿Algunas ideas?

eval es un shell incorporado , mientras que docker exec requiere una utilidad externa para llamar, por lo que el uso de eval no es una opción.

En su lugar, invoque explícitamente un ejecutable de shell en el contenedor ( bash ) y páselo por el command para ejecutarlo como una cadena , a través de su opción -c :

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

Al usar una cadena de comillas dobles para pasar a bash -c , se asegura de que la shell actual realice la interpolación de cadenas primero, mientras que la instancia de bash del contenedor ve el resultado expandido como un literal , como parte de la cadena incrustada de una sola cita .


En cuanto a tus síntomas :

  • /home/user/.app/app.config: No such file or directory se informó de /home/user/.app/app.config: No such file or directory , porque la networkingirección que pretendía que ocurriera en el contenedor sucedió realmente en el shell de su host, y porque dir. /home/user/.app aparentemente no existe en el sistema de files de su host, el command falló fundamentalmente , antes de que el shell de su host incluso intentara ejecutar el command ( bash abortará la ejecución del command si no se puede realizar una networkingirección de salida).

    • Por lo tanto, aunque tu primer command también contenía eval , su uso no surgió como un problema hasta tu segundo command, que realmente se ejecutó.
  • exec: "eval": executable file not found in $PATH sucedió, porque, como se dijo, eval no es una utilidad externa , sino que un shell builtin y docker exec solo pueden ejecutar utilidades externas.

Adicionalmente:

Si necesita escribir text desde fuera del contenedor, esto también funciona:

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

Esto canalizará su input al contenedor. Por supuesto, esto también funcionaría para text sin formatting (sin file). Es importante dejar fuera del parámetro -t .

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

ACTUALIZAR (en caso de que solo necesite copyr files, no partes de files):

Docker v17.03 tiene docker cp que copy entre el fs local y el contenedor: https://docs.docker.com/engine/reference/commandline/cp/#usage

Pruebe con comillas simples para todo el asunto:

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