Como substituir o CMD ao executar uma imagem do Docker?

123

Desejo inspecionar uma imagem de janela de encaixe criada por outra pessoa com um ponto de entrada e um cmd especificados, por exemplo:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Atualmente, faço:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Existe uma maneira de substituir o CMD para ficar vazio (para que eu não precise usar "--login")?

urdidura
fonte

Respostas:

126

Você pode simplesmente entrar via docker run -it --entrypoint=/bin/bash $IMAGE -i(você iniciará um novo contêiner a partir da imagem e obterá um shell bash no modo interativo) e, em seguida, execute o comando de ponto de entrada nesse contêiner.

Você pode inspecionar o contêiner em execução no estado em que deveria estar em execução.

Edição: desde o Docker 1.3, você pode usar execpara executar um processo em um contêiner em execução. Inicie seu contêiner como faria normalmente e insira-o emitindo:

docker exec -it $CONTAINER_ID /bin/bash

Supondo que o bash esteja instalado, você receberá acesso do shell ao contêiner em execução.

Panagiotis Moustafellos
fonte
Isso não executaria "/ usr / sbin / apache2ctl / bin / bash"? (porque o seu exemplo não substitui o entrypoint ele irá usar o ponto de entrada definido no Dockerfile - ou estou faltando alguma coisa?)
warp
Isso é algo diferente para as versões docker mais antigas / mais recentes, talvez? Certamente, ele executa o ponto de entrada para mim: gist.github.com/warpr/26a5cc471dce7fcf9021 . Isso está usando o docker 0.10.0 no Ubuntu 13.10.
warp
4
Eu sei que a passagem --entrypoint substitui o ponto de entrada. Mas quando uso --entrypoint, como faço para substituir o CMD para ficar vazio? (Para o bash, posso usar algo como -i ou --login, mas nem todos os pontos de entrada que eu queira usar terão um argumento "fictício" equivalente).
warp
1
Pelo menos no Docker v1.11.1, parece que a substituição do --entrypoint também impede a adição normal do CMD ao ponto de entrada. Isso só parece acontecer quando o ponto de entrada não é substituído.
Jasmine Hegman
1
Por que existe um -idepois $IMAGE?
Eyal Levin
27

Consulte: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Parte relevante:

CMD (comando ou opções padrão) Recupere o COMMAND opcional na linha de comando do Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Este comando é opcional porque a pessoa que criou a IMAGE já pode ter fornecido um COMANDO padrão usando o Dockerfile CMD. Como operador (a pessoa que executa um contêiner a partir da imagem), você pode substituir esse CMD apenas especificando um novo COMMAND.

Se a imagem também especificar um ENTRYPOINT, o CMD ou COMMAND será anexado como argumento ao ENTRYPOINT.

Então, para fazer o que quiser que você precisa única especificar um cmd, e substituir usando /bin/bash. Não é "vazio", mas faz o trabalho 99%.

Simon Thum
fonte
Ops, eu esqueci um detalhe. Exceto para encurtar --logina -lAcho que a solução já é tão bom quanto ele ganha.
Simon Thum
Aqui está uma coisa divertida que vi hoje: o comando não é substituído, é anexado. Aqui está o PS de dentro do contêiner. Observe que o comando que adicionei foi eco "configurando o db" e o comando interno é / usr / bin / geth. Também defino o ponto de entrada como "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
O link de referência da janela de encaixe não funciona mais - não é possível encontrar um substituto óbvio para ele.
Chris Kimpton
Eu apenas consertei, mas também achei difícil de encontrar; (
Simon Thum
15

Para quem vem aqui substituir o ponto de entrada AND e o comando para passar outro comando, por exemplo, execute bash em vez do script do ponto de entrada e, em seguida, execute outro comando com parâmetros (não estava claro para mim a partir de outras respostas):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'é o parâmetro, /bin/shentão aqui você pode passar qualquer comando que queira executar no contêiner. /bin/shé para imagens alpinas, /bin/bashprovavelmente para outras imagens.

infro
fonte
1
Apenas uma comandos shell addtion deve ser json writen base, então ao invés de aspas com aspas simples '...'usar aspas duplas"..."
Jimmy Obonyo Abor
Ou apenas passe quantos argumentos --entrypoint você quiser
Nick Roz
isso parece não funcionar: "exec: \" - c \ ": arquivo executável não encontrado em $ PATH": desconhecido.
Richard
Verifique o caminho no contêiner, talvez ele realmente não exista. A maioria das imagens tem, /bin/shmas a sua pode não ser o caso.
infro