O que é um Dockerfile
Dockerfile é um arquivo de instruções usado para construir uma imagem de container. Ele descreve como preparar os arquivos e a configuração que servirão de base à execução, incluindo a origem do ambiente e o comando previsto para iniciar a aplicação.
O arquivo participa do build, mas não representa uma aplicação em execução. Depois de alterá-lo, você precisa gerar outra imagem e criar ou atualizar os containers que usarão esse resultado.
Instruções de construção e de execução
A instrução FROM define a base de uma etapa, e COPY copia arquivos para a imagem. RUN executa comandos durante o build, como instalar uma dependência. Já CMD fornece o comando ou os argumentos padrão usados na execução, conforme sua combinação com ENTRYPOINT.
Essa diferença explica por que uma imagem pode ser construída e falhar apenas ao iniciar. Declarar um comando em CMD não o executa durante o build nem comprova que o arquivo indicado estará disponível no ambiente final. Se houver ENTRYPOINT, confira também quais argumentos ele receberá.
Quais arquivos entram no contexto de build
O conjunto de arquivos do build fica disponível ao processo de construção. Na cópia padrão com COPY, os arquivos vêm desse conjunto. Um caminho válido no computador não fica automaticamente disponível se estiver fora dele ou tiver sido excluído.
A origem muda quando você usa COPY --from: os arquivos podem vir de outra etapa, de uma imagem ou de uma fonte de arquivos nomeada. Essa opção permite copiar o resultado compilado de uma etapa anterior sem incluir todas as ferramentas de compilação na imagem final.
O arquivo .dockerignore permite deixar conteúdo fora do contexto de build. Confira suas exclusões para evitar enviar arquivos desnecessários e para não remover, por engano, um modelo de email ou outro recurso que a aplicação precisa encontrar depois.
A ordem influencia o cache
Uma etapa pode reaproveitar um resultado anterior quando suas entradas continuam compatíveis com o cache. Alterar um arquivo usado cedo na construção pode exigir refazer etapas posteriores, mesmo que apenas uma parte do projeto tenha mudado.
Separar a preparação de dependências da cópia de arquivos alterados com frequência pode reduzir trabalho repetido. A organização, porém, precisa respeitar os arquivos realmente exigidos por cada etapa, incluindo manifestos e arquivos que fixam versões.
Algumas instruções registram configuração
Nem toda instrução adiciona uma camada de arquivos. Algumas definem informações que serão usadas ao criar o container, como diretório de trabalho, variáveis e comando padrão.
EXPOSE informa uma porta prevista pela imagem, mas não a publica no host. A aplicação precisa escutar no endereço adequado e a execução precisa configurar o acesso pela rede conforme o uso desejado.
Credenciais não pertencem à construção distribuída
Um segredo copiado para a imagem pode permanecer recuperável em camadas, mesmo que uma instrução posterior remova o arquivo. Argumentos e variáveis de build também não devem ser usados como promessa de sigilo para credenciais.
Quando o build precisa acessar um recurso privado, use o mecanismo de segredos oferecido pela ferramenta e confira se os comandos não gravam o valor na saída. Esse acesso temporário não substitui a configuração de credenciais necessárias quando a aplicação estiver em execução.
Validar a imagem produzida
Construa a imagem, confira os arquivos esperados e inicie uma instância em teste com as opções necessárias. Leia a mensagem de encerramento e os logs se a aplicação parar, pois o erro pode estar no comando, no conteúdo ou em uma dependência externa.
O Desenvolvimento Colaborativo da Dev Side Studio pode orientar uma investigação delimitada de Docker ou deploy ao vivo. Leve o Dockerfile e a diferença observada entre a construção e a execução, preservando as credenciais do projeto.
Dúvidas frequentes
Perguntas frequentes sobre Dockerfile
- RUN e CMD fazem a mesma coisa?
- Não. RUN executa uma instrução durante a construção. CMD fornece o comando ou os argumentos padrão da execução, conforme sua combinação com ENTRYPOINT. Esses valores podem ser substituídos ao iniciar o container.
- EXPOSE abre a porta no servidor?
- Não. A instrução documenta uma porta prevista pela imagem. A publicação e o acesso dependem da configuração de execução e da rede.
- Toda instrução cria uma camada de arquivos?
- Não. Algumas modificam o sistema de arquivos, enquanto outras registram configurações da imagem. Não é correto interpretar cada linha como uma nova camada de arquivos.
- Alterar o Dockerfile atualiza containers existentes?
- Não. É preciso construir a nova imagem e atualizar a execução para usá-la. O arquivo editado não altera uma instância que já está em funcionamento.
Para continuar
Recursos relacionados
Documentação
Docker: referência do Dockerfile
Semântica das instruções de construção e configuração.
Abrir recursoDocumentação
Docker: contexto de build
Arquivos disponíveis para a construção e uso de .dockerignore.
Abrir recursoDocumentação
Docker: segredos durante o build
Acesso temporário a credenciais durante a construção.
Abrir recursoAplicação na formação
Formação DevOps
O Dockerfile descreve instruções utilizadas no build da imagem da aplicação.
Conhecer a formação
Fontes consultadas
Referências deste verbete
Este verbete ajudou você?
Obrigado pela resposta. Ela fica salva apenas neste navegador.