janela de encaixe executada <IMAGE> <MULTIPLE COMMANDS>

255

Estou tentando executar vários comandos como este.

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

Mas isso me dá o erro "Não existe esse arquivo ou diretório" porque é interpretado como ...

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

Parece que são necessários alguns caracteres ESCAPE como "" ou ().

Então eu também tentei

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

mas estes não funcionaram.

Eu tenho procurado Docker Run referência , mas não encontrar qualquer dicas sobre caracteres de escape.

ai0307
fonte

Respostas:

440

Para executar vários comandos na janela de encaixe, use /bin/bash -ce ponto e vírgula;

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

Caso seja necessário executar o comando2 (python), se e somente se o comando1 (cd) retornou o status de saída zero (sem erro), use em &&vez de;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
fonte
Obrigado pela sua dica! Eu simplesmente tentei [docker run image "cd / bin; ls"] e recebi as seguintes mensagens de erro. [exec: "cd / bin; ls": stat cd / bin; ls: esse arquivo ou diretório não existe] [Resposta de erro do daemon: Não é possível iniciar o contêiner]
ai0307 13/02/2015
1
Alguém acha que essa resposta pode estar interessada em como usar os documentos aqui para alimentar comandos em um contêiner: aqui está a minha resposta para outra pergunta como esta sobre os documentos aqui, fique à vontade para conferir .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"isso me ajuda muito quando o bash não está disponível.
Eddy Hernandez
1
Isso funciona para cd, mas não para as coisas, onde os códigos de retorno importa ;não é o mesmo que &&ver unix.stackexchange.com/questions/37069/...
Nick Zalutskiy
1
Obrigado @NickZalutskiy, resposta atualizada com seu comentário
anhlc
31

Você pode fazer isso de duas maneiras:

  1. Use a opção -w para alterar o diretório de trabalho:

    -w, --workdir = "" Diretório de trabalho dentro do contêiner

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

  2. Passe o argumento inteiro para / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
fonte
Nenhuma menção --workdirno link fornecido. A página provavelmente foi movida / alterada. Pode ser atualizado para docs.docker.com/engine/reference/run/#workdir ou docs.docker.com/engine/reference/commandline/run
marcv
10

Você também pode canalizar comandos dentro do contêiner do Docker, bash -c "<command1> | <command2>"por exemplo:

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

Mas, sem chamar o shell no controle remoto, a saída será redirecionada para o terminal local.

USER_1
fonte
3

Se você deseja armazenar o resultado em um arquivo fora do contêiner, na máquina local, pode fazer algo assim.

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"

O resultado dos seus comandos estará disponível /tmp/result.txtna sua máquina local.

Flamarion
fonte
2

Para qualquer pessoa que veio aqui procurando fazer o mesmo com docker-composevocê, basta adicionar bash -ce incluir vários comandos entre aspas, unidos a &&.

Então, no exemplo dos OPs docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
fonte
este trabalhou para mim, mas o processo será encerrado janela de encaixe após o comando é executado
node_man
e como faço para sair de um processo desse tipo de janela de encaixe? pressionar ctrl C ou ctrl Z ou digitar exit não está funcionando ou preciso matá-lo pelo comando docker stop?
node_man 30/01/19
se docker-compose down [service-name]não funcionar ou? (e não se preocupe, seja bem-vindo, prazer em ajudar :))
S ..
2

Só para dar uma resposta adequada do comentário de @Eddy Hernandez e que é muito correto, pois o Alpine vem com cinzas e não com bash.

A pergunta agora se refere a Iniciar um shell no contêiner Docker Alpine, o que implica usar shor ashou /bin/shor /bin/ash/.

Com base na pergunta do OP:

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

Nqsir
fonte
1

bash -cfunciona bem se os comandos que você está executando são relativamente simples. No entanto, se você estiver tentando executar uma longa série de comandos cheios de caracteres de controle, pode ficar complexo.

Eu consegui contornar isso, canalizando meus comandos para o processo de fora, ou seja,

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

user2966041
fonte