Ao construir com Docker, três instruções – RUN, CMD e ENTRYPOINT – são frequentemente empregadas no Dockerfile para definir vários aspectos de uma imagem Docker. Elas parecem semelhantes e, às vezes, causam confusão. Vamos discutir suas diferenças.
RUN, CMD e ENTRYPOINT
- RUN executa comandos e cria novas camadas de imagem.
- CMD define o comando e seus parâmetros a serem executados por padrão após o início do container. No entanto, CMD pode ser substituído pelos parâmetros da linha de comando do docker run.
- ENTRYPOINT configura o comando a ser executado quando o container é iniciado, similar à funcionalidade do CMD.
Formato Shell vs Formato Exec
Os comandos para RUN, CMD e ENTRYPOINT podem ser especificados de duas maneiras: Formato Shell e Formato Exec, que possuem sutis diferenças de uso.
Formato Shell
O formato Shell tem a forma:
<instrução> <comando>
Exemplos:
RUN apt-get install python3
CMD echo "Olá mundo"
ENTRYPOINT echo "Olá mundo"
Quando executado, o comando no formato Shell chama /bin/sh -c <comando>
. O ambiente definido pelo comando ENV será herdado.
ENV name Homem Nuvem
ENTRYPOINT echo "Olá, $name"
Resultado:
Olá, Homem Nuvem
Formato Exec
O formato Exec segue:
<instrução> ["executável", "param1", "param2", ...]
Exemplos:
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Olá mundo"]
ENTRYPOINT ["/bin/echo", "Olá mundo"]
Neste formato, o comando será chamado diretamente e não será processado pelo shell. Variáveis de ambiente definidas por ENV não serão passadas.
ENV name Homem Nuvem
ENTRYPOINT ["/bin/echo", "Olá, $name"]
Resultado:
Olá, $name
O formato Exec é recomendado para CMD e ENTRYPOINT por ser mais legível e fácil de entender.
RUN
O comando RUN é geralmente usado para instalar aplicativos e pacotes. Ele executa o comando sobre a imagem atual, criando uma nova camada.
CMD
O CMD permite especificar o comando padrão executado pelo container. Se docker run
especificar outro comando, o padrão definido por CMD será ignorado.
ENTRYPOINT
O ENTRYPOINT permite que o container seja executado como uma aplicação ou serviço. Mesmo que outros comandos sejam especificados ao executar docker run
, o ENTRYPOINT não será ignorado.
Conclusão
- Use o comando RUN para instalar aplicativos, pacotes e construir imagens.
- Para imagens Docker que visam executar uma aplicação ou serviço, como o MySQL, prefira usar o comando ENTRYPOINT no formato Exec.
- Se desejar definir o comando de inicialização padrão para o container, use o comando CMD.
Espero que este artigo tenha ajudado a esclarecer as diferenças e usos de RUN, CMD e ENTRYPOINT no Docker. Agradeço a Shespelt pelo contributo!
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.