A diferença entre CMD e ponto de entrada nas imagens do Docker

As instruções ENTRYPOINT do CMD são duas diretivas Dockerfile comumente confundidas. Ambos desempenham um papel na determinação do comando a ser executado quando o contêiner é iniciado.

O CMD é ENTRYPOINT pode ser substituído individualmente dentro de cada imagem. O uso eficiente dessas diretivas simplifica o uso do contêiner encurtando o comprimento dos comandos fornecidos.

índice

  1. Qual é o ponto de entrada?
  2. Adicionar comando (CMD)
  3. Substituições de ponto de entrada
  4. Qual usar?
  5. Modo de ponto de entrada: Shell ou Exec
  6. Benefícios da abordagem do ponto de entrada do Docker
  7. Resumo

Qual é o ponto de entrada?

Veremos ENTRYPOINT primeiro, pois o CMD é processado primeiro ao iniciar um novo contêiner. O ponto de entrada da imagem define o processo a ser executado quando o contêiner for iniciado.

O padrão do Docker é o ponto de entrada /bin/sh -c . Isso significa que você estará em uma sessão de shell quando iniciar o contêiner. Para muitos contêineres, é mais desejável ter um processo diferente que seja iniciado por padrão. Você deseja que os serviços headless iniciem sua carga de trabalho imediatamente.

A diretiva de cenário ENTRYPOINT em um Dockerfile diz ao Docker para executar um comando específico quando o contêiner for iniciado. Ele se tornará o processo em primeiro plano, em vez da sessão padrão do shell.

 PONTO DE ENTRADA ["data"]

Um contêiner criado com este Dockerfile executará o comando date . Como a date não é um processo de primeiro plano de longa duração, o contêiner sairá logo depois.

Os pontos de entrada devem ser arquivos binários ou scripts executáveis. Seu contêiner não será iniciado se você especificar um ponto de entrada inválido. Se você estiver usando um script personalizado, certifique-se de que ele tenha o bit executável definido. Você pode adicionar permissões de execução usando chmod +x my-script.sh .

Adicionar comando (CMD)

A educação CMD é um pouco imprópria. Fornece argumentos predefinidos para o comando definido por ENTRYPOINT .

 ENTRYPOINT ["data"] CMD ["+%A"]

Neste exemplo, o contêiner está executando a date +%A . O argumento +%A até a date retorna o dia da semana atual (por exemplo, Monday ).

CMD foi projetado para ser sobrescrito. docker run permite especificar um comando diferente para uma única instância de contêiner:

 docker execute minha imagem +%B

O valor CMD padrão será substituído por +%B , o que fará com que o contêiner exiba o nome do mês atual. Isso funciona porque o ponto de entrada da imagem permanece intacto. O CMD é sempre adicionado ao arquivo ENTRYPOINT , então o comando final se torna date +%B .

Você deve usar ENTRYPOINT para definir o executável principal do seu container. Use CMD para definir os argumentos padrão para esse executável. Ele será substituído quando o contêiner for executado com argumentos diferentes.

Substituições de ponto de entrada

Você pode forçar o Docker a iniciar uma imagem usando um ponto de entrada personalizado. Passe o --entrypoint para marcar uma docker run :

 docker run --entrypoint /bin/sh minha-imagem

O ponto de entrada definido na imagem do contêiner será ignorado em favor do comando especificado. Em nosso exemplo, uma sessão de shell será iniciada em vez do comando file date .

A substituição de pontos de entrada deve ser uma ocorrência rara. Pode ir contra as intenções do autor da imagem. Definir um ponto de entrada personalizado pode ser útil, especialmente durante a depuração. Se um contêiner se comportar mal, substituir seu ponto de entrada pode conceder a você acesso ao shell que você não obteria de outra forma.

Qual usar?

Se você for um autor de imagem, deve usar ENTRYPOINT ao definir o que o contêiner será executado. Se você deseja fornecer argumentos padrão, mas espera que o usuário os substitua, inclua purê de batatas CMD .

Como usuário de imagem, geralmente você ainda pode substituir CMD . docker run tem suporte transparente para substituição de comando. Qualquer argumento fornecido após o nome da imagem será interpretado como a string CMD do contêiner.

Modo de ponto de entrada: Shell ou Exec

Na verdade, o Docker suporta duas formas diferentes de ENTRYPOINT : modo exec e modo shell. O modo Exec é caracterizado pelo uso de uma construção de matriz para especificar parâmetros. No modo shell, o comando é especificado como uma string.

 # exec mode ENTRYPOINT ["binary", "--param", "--another-param"] # shell mode ENTRYPOINT binário --param --another-param

Usar o modo shell faz com que seu binário seja executado como um thread de /bin/sh -c . Isso dá ao seu ponto de entrada acesso às variáveis ​​de ambiente definidas pelo shell.

No entanto, o modo shell tem desvantagens. Você não pode usar o CMD para que os usuários não possam emitir substituições. Argumentos dados uma docker run ignorados; seu contêiner sempre usará o ponto de entrada como está.

Como seu binário está sendo executado dentro de um shell, os comandos do ciclo de vida do Docker, como docker stop , podem funcionar de forma irregular ou não funcionar. O Docker relata a parada do shell do arquivo, em vez do processo interno. Você pode iniciar seu processo com exec para evitar isso.

 ENTRYPOINT exec binary --param --another-param

Benefícios da abordagem do ponto de entrada do Docker

Separar o ponto de entrada de seus temas ajuda a ocultar a complexidade em seus contêineres. Isso é especialmente benéfico ao criar wrappers de utilitários para encapsular programas CLI.

Configure seu binário CLI como o ponto de entrada da imagem. Isso permite que os usuários interajam sem repetir o nome binário em cada comando.

Considere se empacotamos o Dockerfile acima como date:latest :

 # default entrypoint (/bin/sh -c) docker run date:latest date +%A # com `date` como o entrypoint docker run date:latest +%A`

Definir um ponto de entrada personalizado encurta os comandos e reduz a repetição. O container se torna mais especializado chamando date automaticamente. Isso cria uma interface mais amigável para seus usuários.

Resumo

As instruções CMD do ENTRYPOINT são uma fonte frequente de confusão. Sua nomenclatura mascara seus propósitos pretendidos.

Use ENTRYPOINT para definir o "comando" a ser executado ao iniciar novos contêineres. Você pode definir argumentos predefinidos usando CMD . ENTRYPOINT e CMD são combinados para produzir a string de comando final do container.

Quando você usa docker run , o Docker substitui a configuração de imagem CMD padrão pelos argumentos especificados. Se você precisar substituir o ponto de entrada de uma imagem, use o arquivo de sinalização --entrypoint .

  • Domino's India revela violação de dados depois que hackers venderam dados online
  • Como visualizar e restaurar versões anteriores de um documento do Word

descubra mais conteúdo

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão geek

O que é uma carga fantasma?

Deixe uma resposta Cancelar resposta

O que é o ponto de entrada no Docker?

O ENTRYPOINT especifica o executável que o container usará e o CMD corresponde aos parâmetros a serem usados ​​com esse executável.

O que o CMD faz no Dockerfile?

O CMD é usado para executar um comando por padrão, quando o contêiner é criado. É bastante versátil, pois podemos passar argumentos para ele ao executar o contêiner e podemos substituí-lo facilmente.

O que há no Docker?

Docker é um sistema operacional para contêineres. Semelhante à forma como uma máquina virtual virtualiza (elimina a necessidade de gerenciar diretamente) o hardware do servidor, os contêineres virtualizam o sistema operacional de um servidor.

Como abrir o terminal no Docker?

Para acesso ao terminal , conecte-se a cada contêiner do InfoSphere MDM Docker conforme necessário.

Processo

  1. Use bpmadmin para se conectar ao mdmisc_container.
  2. Use ws9admin para conectar-se a mdm_container, kafka_container e wb_container.
Ir arriba