la ventana acoplable ejecuta <IMAGE> <MULTIPLE COMMANDS>

255

Estoy tratando de ejecutar MÚLTIPLES comandos como este.

docker run image cd /path/to/somewhere && python a.py

Pero esto me da el error "No existe tal archivo o directorio" porque se interpreta como ...

"docker run image cd /path/to/somewhere" && "python a.py"

Parece que se necesitan algunos caracteres ESCAPE como "" o ().

Así que también probé

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

Pero estos no funcionaron.

He buscado Docker Run Reference pero no he encontrado ninguna pista sobre los caracteres ESCAPE.

ai0307
fuente

Respuestas:

440

Para ejecutar varios comandos en Docker, use /bin/bash -cy punto y coma;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

En caso de que necesitemos que se ejecute el comando2 (python) si y solo si el comando1 (cd) devolvió el estado de salida cero (sin error), use en &&lugar de;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
fuente
Gracias por tu pista! Simplemente intenté [docker run image "cd / bin; ls"] y obtuve los siguientes mensajes de error. [exec: "cd / bin; ls": stat cd / bin; ls: no existe tal archivo o directorio] [Respuesta de error del demonio: No se puede iniciar el contenedor]
ai0307
1
Cualquiera que encuentre esta respuesta podría estar interesado en cómo usar los documentos aquí para alimentar comandos a un contenedor: aquí está mi respuesta a otra pregunta como esta sobre los documentos aquí, no dude en consultarla .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"esto me ayuda mucho, cuando bash no está disponible.
Eddy Hernández
1
Esto funciona cdpero no para cosas en las que los códigos de retorno importan ;no es lo mismo que &&ver unix.stackexchange.com/questions/37069/…
Nick Zalutskiy
1
Gracias @NickZalutskiy, respuesta actualizada con su comentario
anhlc
31

Puedes hacer esto de dos maneras:

  1. Use la opción -w para cambiar el directorio de trabajo:

    -w, --workdir = "" Directorio de trabajo dentro del contenedor

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. Pase el argumento completo a / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
fuente
No se menciona --workdiren el enlace proporcionado. La página probablemente se ha movido / cambiado. Podría actualizarse a docs.docker.com/engine/reference/run/#workdir o docs.docker.com/engine/reference/commandline/run
marcv
10

También puede canalizar comandos dentro del contenedor Docker, bash -c "<command1> | <command2>"por ejemplo:

docker run img /bin/bash -c "ls -1 | wc -l"

Pero, sin invocar el shell en el control remoto, la salida se redirigirá al terminal local.

USUARIO_1
fuente
3

Si desea almacenar el resultado en un archivo fuera del contenedor, en su máquina local, puede hacer algo como esto.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

El resultado de sus comandos estará disponible /tmp/result.txten su máquina local.

Flamarion
fuente
2

Para cualquier otra persona que vino aquí que busca hacer lo mismo con docker-composeusted, solo necesita anteponer bash -cy encerrar múltiples comandos entre comillas, junto con &&.

Entonces, en el ejemplo de los OP docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
fuente
este funcionó para mí, pero el proceso de acoplamiento se cierra después de ejecutar el comando
node_man
¿Y cómo salgo de ese proceso de acoplador? presionar ctrl C o ctrl Z o escribir exit no funciona o ¿tengo que matarlo con el comando docker stop?
node_man
hace docker-compose down [service-name]que no funcione o? (y no le preocupa nada, feliz de ayuda :))
S ..
2

Solo para hacer una respuesta adecuada del comentario de @Eddy Hernández y que es muy correcto ya que Alpine viene con cenizas, no bash.

La pregunta ahora se refiere a Iniciar un shell en el contenedor Docker Alpine que implica usar sho asho /bin/sho /bin/ash/.

Basado en la pregunta del OP:

docker run image sh -c "cd /path/to/somewhere && python a.py"

Nqsir
fuente
1

bash -cfunciona bien si los comandos que está ejecutando son relativamente simples. Sin embargo, si está intentando ejecutar una larga serie de comandos llenos de caracteres de control, puede volverse complejo.

Lo solucioné con éxito conectando mis comandos al proceso desde el exterior, es decir

cat script.sh | docker run -i <image> /bin/bash

usuario2966041
fuente