Construir serviços com argumentos de build e sem cache
Nesta etapa, exploraremos duas opções avançadas de construção com Docker Compose: usar argumentos de construção e construir sem cache.
Argumentos de construção permitem que você passe variáveis para o processo de construção do Docker. Isso é útil para personalizar a construção com base em diferentes ambientes ou configurações sem alterar o próprio Dockerfile.
Primeiro, vamos modificar nosso Dockerfile para aceitar um argumento de construção. Abra o Dockerfile para edição:
nano ~/project/Dockerfile
Altere o conteúdo para o seguinte:
FROM ubuntu:latest
ARG MESSAGE="Hello from build argument!"
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "$MESSAGE"]
Adicionamos uma instrução ARG MESSAGE para definir um argumento de construção chamado MESSAGE com um valor padrão. Também alteramos a instrução CMD para usar este argumento.
Salve o Dockerfile pressionando Ctrl + X, depois Y e Enter.
Agora, vamos modificar nosso arquivo docker-compose.yml para passar um valor para este argumento de construção. Abra o arquivo para edição:
nano ~/project/docker-compose.yml
Altere o conteúdo para o seguinte:
version: "3.8"
services:
cow:
build:
context: .
args:
MESSAGE: "Custom message from Compose!"
Mudamos a diretiva build: para um objeto com context: e args:.
context: . especifica o contexto de construção, que é o diretório que contém o Dockerfile.
args: é um mapa de argumentos de construção para passar para o Dockerfile. Estamos passando o valor "Custom message from Compose!" para o argumento MESSAGE.
Salve o arquivo docker-compose.yml pressionando Ctrl + X, depois Y e Enter.
Agora, vamos construir a imagem com o argumento de construção. Certifique-se de estar no diretório ~/project.
cd ~/project
docker-compose build
Observe a saída da construção. Você deve ver que o argumento de construção é usado durante o processo de construção.
Após a conclusão da construção, vamos executar um container a partir desta imagem para ver a saída.
docker run project_cow
Você deve ver a saída do cowsay com a mensagem "Custom message from Compose!". Isso confirma que o argumento de construção foi passado e usado com sucesso.
Às vezes, você pode querer forçar o Docker a reconstruir todas as camadas, ignorando o cache. Isso é útil quando você suspeita de problemas de cache ou deseja garantir uma construção limpa. Você pode fazer isso usando a flag --no-cache com o comando docker-compose build.
Vamos tentar reconstruir a imagem com a flag --no-cache.
docker-compose build --no-cache
Observe a saída da construção novamente. Desta vez, você verá que o Docker não usa nenhuma camada em cache e reconstrói cada etapa no Dockerfile. Este processo levará mais tempo do que uma construção em cache.
Após a conclusão da construção, você pode executar o container novamente para confirmar que a mensagem ainda é aquela passada via argumento de construção.
docker run project_cow
Você ainda deve ver "Custom message from Compose!". A flag --no-cache afeta apenas o processo de construção, não a configuração definida em docker-compose.yml.