Cómo ejecutar 2 comandos con Docker Exec

84

Necesito ejecutar 2 comandos con docker exec. Estoy copiando un archivo del contenedor de la ventana acoplable y no quiero tener que lidiar con las credenciales para usar algo como ssh. Este comando copia un archivo:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

Pero crea un subdirectorio var / log, quiero evitar eso, así que si pudiera hacer esto en el contenedor de la ventana acoplable, debería ser bueno:

cd /var/log ; tar -cv ./file.log

¿Cómo puedo hacer que Docker Exec ejecute 2 comandos?

Solx
fuente

Respuestas:

136

Esto llevó a la respuesta: carácter de escape en la línea de comando de Docker Terminé haciendo esto:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

Entonces funciona, más o menos, ejecutando el comando bash con un parámetro que son los 2 comandos que quiero ejecutar.

Solx
fuente
Muchas gracias, esto me ayuda mucho
dicho
Si tiene comillas dobles dentro del comando, puede hacerlo -c "cd /var/log; tar -cv \"$1\""si el archivo está en el parámetro 1.
zed
27

Muy a menudo, la necesidad de varios comandos es cambiar el directorio de trabajo, como en la pregunta del OP.

Para eso, Docker ahora tiene una -wopción para especificar el directorio de trabajo. Por ejemplo, en el presente caso

docker exec -w /var/log boring_hawking tar -cv ./file.log
P-Gn
fuente
Realmente útil, este es el camino a seguir.
TortelliEngineer
¡Esto es exactamente lo que estaba buscando!
Clay Mitchell
11

Para cualquier otra persona que se encuentre con esto y quiera una forma diferente de especificar varios comandos para ejecutar un script más complejo:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF
zbrunson
fuente
Esta es una solución legible muy agradable cuando desea ejecutar un script más complejo. Se merece más votos
positivos
the input device is not a TTY
Recibo
Se --interactivesupone que se ocupará de eso, si ese no es el caso, entonces no estoy seguro de lo que está sucediendo sin tener un contexto más amplio sobre cómo está usando esto.
zbrunson
6

Si alguien más vino aquí para obtener la respuesta increíble, pero también quiere una mejor manera de resolver el problema original de OP (OP's OP ..?) Para copiar un archivo de un contenedor de ventana acoplable, ahora hay un docker cpcomando que hará esto: https: //docs.docker.com/engine/reference/commandline/cp/

Will the Thrill
fuente
agradable, realmente agradable
Solx