finestra mobile eseguita <IMMAGINE> <COMANDI MULTIPLI>


255

Sto cercando di eseguire MULTIPLE comandi in questo modo.

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

Ma questo mi dà l'errore "Nessun file o directory" perché è interpretato come ...

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

Sembra che siano necessari alcuni caratteri ESCAPE come "" o ().

Quindi ho anche provato

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

ma questi non hanno funzionato.

Ho cercato Docker Run Reference ma non ho trovato alcun suggerimento sui caratteri ESCAPE.

Risposte:


440

Per eseguire più comandi nella finestra mobile, utilizzare /bin/bash -ce punto e virgola;

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

Nel caso in cui avessimo bisogno che command2 (python) fosse eseguito se e solo se command1 (cd) avesse restituito lo stato di uscita zero (nessun errore), usare &&invece di;

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

Grazie per il tuo suggerimento! Ho semplicemente provato [immagine di esecuzione docker "cd / bin; ls"] e ho ricevuto i seguenti messaggi di errore. [exec: "cd / bin; ls": stat cd / bin; ls: no tali file o directory] [Risposta dell'errore dal demone: Impossibile avviare il contenitore]
ai0307,

1
Chiunque trova questa risposta potrebbe essere interessato a come utilizzare qui i documenti per inviare comandi a un contenitore: ecco la mia risposta a un'altra domanda come questa sui documenti qui, sentitevi liberi di dare un'occhiata .
Kohányi Róbert

14
docker run alpine sh -c "ls | wc >> xxx"questo mi aiuta molto, quando bash non è disponibile.
Eddy Hernandez,

1
Questo funziona per cd, ma non per le cose in cui i codici di ritorno la materia ;non è lo stesso di &&vedere unix.stackexchange.com/questions/37069/...
Nick Zalutskiy

1
Grazie @NickZalutskiy, risposta aggiornata con il tuo commento
anhlc

31

Puoi farlo in due modi:

  1. Utilizzare l'opzione -w per modificare la directory di lavoro:

    -w, --workdir = "" Directory di lavoro all'interno del contenitore

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

  2. Passa l'intero argomento a / bin / bash:

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

Nessuna menzione --workdirnel link fornito. La pagina è stata probabilmente spostata / modificata. Potrebbe essere aggiornato a docs.docker.com/engine/reference/run/#workdir o docs.docker.com/engine/reference/commandline/run
marcv

10

È inoltre possibile eseguire il pipe dei comandi all'interno del contenitore Docker, bash -c "<command1> | <command2>"ad esempio:

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

Ma, senza invocare la shell nel telecomando, l'output verrà reindirizzato al terminale locale.


3

Se desideri archiviare il risultato in un file all'esterno del contenitore, nel tuo computer locale, puoi fare qualcosa del genere.

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"

Il risultato dei tuoi comandi sarà disponibile /tmp/result.txtnel tuo computer locale.


2

Per chiunque sia venuto qui cercando di fare lo stesso con docker-composete, devi solo anteporre bash -ce racchiudere più comandi tra virgolette, uniti insieme &&.

Quindi nell'esempio dei PO docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


questo ha funzionato per me ma il processo docker termina dopo l'esecuzione del comando
node_man

e come esco da un processo docker del genere? premendo ctrl C o ctrl Z o digitando exit non funziona o devo ucciderlo con il comando docker stop?
node_man,

non docker-compose down [service-name]funziona o? (e non preoccuparti, benvenuto, felice di aiutarti :))
S ..

2

Giusto per dare una risposta corretta dal commento di @Eddy Hernandez e che è molto corretto dal momento che Alpine arriva con la cenere e non la bash.

La domanda ora si riferisce a Avvio di una shell nel contenitore Docker Alpine che implica l'utilizzo di sho asho /bin/sho /bin/ash/.

Sulla base della domanda del PO:

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


1

bash -cfunziona bene se i comandi che stai eseguendo sono relativamente semplici. Tuttavia, se stai cercando di eseguire una lunga serie di comandi pieni di caratteri di controllo, può diventare complesso.

Ho risolto il problema inviando i miei comandi al processo dall'esterno, ad es

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.