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

agosto 2020
julho 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

agosto

setembro 2020

outubro
DOM
SEG
TER
QUA
QUI
SEX
SAB
30
31
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
Eventos para setembro

1st

Sem Eventos
Eventos para setembro

2nd

Sem Eventos
Eventos para setembro

3rd

Sem Eventos
Eventos para setembro

4th

Sem Eventos
Eventos para setembro

5th

Sem Eventos
Eventos para setembro

6th

Sem Eventos
Eventos para setembro

7th

Sem Eventos
Eventos para setembro

8th

Sem Eventos
Eventos para setembro

9th

Sem Eventos
Eventos para setembro

10th

Sem Eventos
Eventos para setembro

11th

Sem Eventos
Eventos para setembro

12th

Sem Eventos
Eventos para setembro

13th

Sem Eventos
Eventos para setembro

14th

Sem Eventos
Eventos para setembro

15th

Sem Eventos
Eventos para setembro

16th

Sem Eventos
Eventos para setembro

17th

Sem Eventos
Eventos para setembro

18th

Sem Eventos
Eventos para setembro

19th

Sem Eventos
Eventos para setembro

20th

Sem Eventos
Eventos para setembro

21st

Sem Eventos
Eventos para setembro

22nd

Sem Eventos
Eventos para setembro

23rd

Sem Eventos
Eventos para setembro

24th

Sem Eventos
Eventos para setembro

25th

Sem Eventos
Eventos para setembro

26th

Sem Eventos
Eventos para setembro

27th

Sem Eventos
Eventos para setembro

28th

Sem Eventos
Eventos para setembro

29th

Sem Eventos
Eventos para setembro

30th

Sem Eventos
Share This