Dockerfiles: Entrypoint vs CMD?
Publicado em: sábado, 6 de jun de 2020
Categorias: Docker de A a Z
Tags: Docker

Você viu Entrypoint e CMD em um dockerfile em em um docker run, mas não faz a ideia do que seja? Vem comigo, é mais simples do que você imagina.

Esse é o típico cenário em que a resposta é mais idiota do que você possa imaginar. É algo que não é nem sofisticado, nem complexo, mas gera confusão.

Entrypoint e CMD só existem de forma separada para facilitar sua vida. Nada mais. Quando um container for inicializado, o que será executado é a soma de Entrypoint e CMD.

Então em um dockerfile:

...
ENTRYPOINT ["dotnet", "suaapp.dll"]
CMD ["meuparametro"]
...

O resultado disso é

...
dotnet suaapp.dll meuparametro
...

Isso quer dizer que, se as 3 sentenças estivessem somente no Entrypoint ou somente no CMD, o resultado será exatamente o mesmo? Sim!

“Se funciona, então estás certo!” Será?

Então podemos concluir que tanto faz usar CMD ou ENTRYPOINT? Não!

Estou contanto qual é o efeito prático. Você precisa entender agora pra que existe a divisão entre Entrypoint e CMD e pra que foram criados separados.

A anatomia do docker run

Essa é a anatomia de um docker run.

...
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
...

Nota que você enxerga um COMMAND, e não enxerga o ENTRYPOINT?

Isso é feito para que o Entrypoint seja estático, definido na imagem, durante o build, enquanto o CMD, você teria um default no dockerfile, mas pode facilmente sobrescrever durante um docker run, por exemplo.

“O ENTRYPOINT de uma imagem é semelhante a um COMMAND porque especifica o executável a ser executado quando o contêiner é iniciado, mas é (intencionalmente) mais difícil de substituir.” Docker run reference

Você pode sobrescrever o entrypoint usando –entrypoint em um docker run, mas não é nem de longe mais prático do que sobrescrever o command.

Conclusão

No contexto de um dockerfile de uma aplicação ASP.NET Core, o que vier no COMMAND se torna parâmetro que você recebe no argumento args do método Main da classe Program.

    class Program
    {
        static void Main(string[] args)
        {
            if (args != null && args.Length > 0)
                Console.WriteLine("Seus parâmetros " + args[0]);
            else
                Console.WriteLine("Sem parâmetros ");
        }
    }

Se o entrypoint da sua imagem for [“dotnet “, “seuassembly.dll”], então tudo que vier no CMD do container, entrará como args direto no teu método Main.

Testa aí!?!

Te ajudou?

Quando eu pensei nisso pela primeira vez, tentei achar algo relevante, mas cheguei na documentação a explicações muito simplistas. Eu queria achar um bom e fantástico motivo. Na verdade depois de entender o propósito eu acho de fato sofisticado, principalmente pela simplicidade.

Você sabia disso? Te ajudou?

Compartilha com alguém que possa ser ajudado também!

Luiz Carlos Faria

Mensagem do Autor

Espero que goste desse post. Não deixe de comentar e falar o que achou. 

Se acha que esse post pode ajudar alguém que você conheça, compartilhe!

 

Eventos passados

novembro 2020
outubro 2020
setembro 2020
agosto 2020
Nenhum evento encontrado!
Carregar Mais

Publicidade

Assine

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.

Agenda & Eventos

outubro

novembro 2020

dezembro
DOM
SEG
TER
QUA
QUI
SEX
SAB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
Events for 1st novembro
Sem Eventos
Events for 2nd novembro
Sem Eventos
Events for 3rd novembro
Sem Eventos
Events for 4th novembro
Sem Eventos
Events for 5th novembro
Sem Eventos
Events for 6th novembro
Sem Eventos
Events for 7th novembro
Sem Eventos
Events for 8th novembro
Sem Eventos
Events for 9th novembro
Sem Eventos
Events for 10th novembro
Sem Eventos
Events for 11th novembro
Sem Eventos
Events for 12th novembro
Events for 13th novembro
Sem Eventos
Events for 14th novembro
Sem Eventos
Events for 15th novembro
Sem Eventos
Events for 16th novembro
Sem Eventos
Events for 17th novembro
Sem Eventos
Events for 18th novembro
Sem Eventos
Events for 19th novembro
Sem Eventos
Events for 20th novembro
Sem Eventos
Events for 21st novembro
Sem Eventos
Events for 22nd novembro
Sem Eventos
Events for 23rd novembro
Sem Eventos
Events for 24th novembro
Sem Eventos
Events for 25th novembro
Sem Eventos
Events for 26th novembro
Sem Eventos
Events for 27th novembro
Sem Eventos
Events for 28th novembro
Sem Eventos
Events for 29th novembro
Sem Eventos
Events for 30th novembro
Sem Eventos
Share This