Dockerfile -  O processo de criação e build


Hoje veremos os conceitos básicos envolvidos na criação do Dockerfile e no processo de build para criação de imagens Docker.

Se você esta chegando agora e não sabe o que é Dockerfile sugiro que acompanhe o meu curso de introdução ao Docker nesta série de artigos: Docker - Uma introdução básica - Macoratti.net

Se quiser apenas recordar os conceitos sobre Dockerfile veja este artigo: Docker - Criando uma imagem com Dockerfile - Macoratti

O Dockerfile

O Docker cria imagens automaticamente lendo as instruções de um Dockerfile - um arquivo de texto que contém todos os comandos, em ordem, necessários para construir uma determinada imagem.

Um Dockerfile adere a um formato específico e a um conjunto de instruções que você pode encontrar na referência do Dockerfile.

Uma imagem do Docker consiste em camadas somente leitura, cada uma representando uma instrução Dockerfile. As camadas são empilhadas e cada uma delas é um delta das alterações da camada anterior.

Considere este Dockerfile:

FROM Ubuntu: 18.04
COPY . /app
RUN make /app
CMD phyton /app/app.py

Cada instrução acima cria uma camada na imagem:

FROM cria uma camada a partir da imagem do ubuntu: 18.04 Docker.
COPY adiciona arquivos do diretório atual do cliente do Docker.
RUN constrói sua aplicação com make.
CMD especifica qual comando deve ser executado no contêiner.

Quando você executa uma imagem e gera um contêiner, adiciona uma nova camada gravável (a "camada de contêiner") sobre as camadas subjacentes.

É nessa camada que vamos trabalhar no contêiner.

Todas as alterações feitas no contêiner em execução, como gravar novos arquivos, modificar arquivos existentes e excluir arquivos, são gravadas nessa camada de contêiner gravável fina.(thin R/W layer).

O processo de build

Quando você emite um comando docker build, o diretório de trabalho atual é chamado de contexto de build ou construção.

Por padrão, pressupõe-se que o Dockerfile esteja localizado nesta pasta, mas você pode especificar um local diferente para o Dockerfile usando o sinalizador de arquivo (-f).

Independentemente de onde o Dockerfile estiver, todo o conteúdo recursivo de arquivos e diretórios no diretório atual será enviado para o daemon do Docker como o contexto de build ou compilação.

Exemplo de contexto de build

  1. Crie um diretório para o contexto de build e entre neste diretório;
  2. Escreva "Ola Mundo" em um arquivo de texto chamado Ola.txt
  3. Crie um arquivo Dockerfile que execute um comando cat;
  4. Construa a imagem a partir do contexto de build (.):

mkdir projeto && cd projeto
echo "ola Mundo" > ola
echo -e "FROM busybox\nCOPY /ola / \nRUN cat /Ola" > Dockerfile
docker build -t
OlaApp:v1 .

Mova os arquivos Dockerfile e ola para diretórios separados e construa uma segunda versão da imagem (sem depender do cache da última compilação).

Use -f para apontar para o Dockerfile e especificar o diretório do contexto de build:

mkdir -p dockerfiles context
mv Dockerfile dockerfiles
&& mv ola context
docker build
--no-cache -t OlaApp:v2 -f dockerfiles/Dockerfile context

Assim, se você incluir arquivos que não são necessários para construir uma imagem, isso resultará em um contexto de build maior e em um tamanho de imagem maior.

Isso vai aumentar o tempo para construir a imagem, o tempo para baixar e enviar as imagens do/e para o repositório, e, o tempo de execução do contêiner.

Para ver o tamanho do seu contexto de build, procure por uma mensagem com o mesmo teor da mensagem abaixo quando da criação do seu Dockerfile:

Sending build context to Docker daemon  187.8MB

Assim entender esses conceitos básicos para criação do Dockerfile e para o processo de build são fundamentais para que ele seja otimizado e sua imagem seja a menor possível.

"Louvai ao Senhor dos senhores; porque a sua benignidade dura para sempre."
Salmos 136:3

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti