Como usar o comando docker compose watch para reconstruir serviços automaticamente

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como aproveitar o comando docker compose watch para reconstruir e atualizar automaticamente seus serviços Docker em resposta a alterações nos arquivos. Começaremos configurando um projeto Docker Compose simples com um contexto de construção, incluindo um arquivo de aplicação básico, um Dockerfile e um arquivo docker-compose.yaml.

Após a configuração do projeto, você explorará a funcionalidade principal do docker compose watch para monitorar modificações nos arquivos e acionar reconstruções automáticas. Também examinaremos a opção --no-up para observar as alterações sem uma inicialização inicial do serviço e a opção --quiet para suprimir a saída da construção, permitindo que você observe o comportamento do watch de forma mais clara.

Prepare um projeto Docker Compose simples com um contexto de construção

Nesta etapa, prepararemos um projeto Docker Compose simples que inclui um contexto de construção. Um contexto de construção é o conjunto de arquivos em um local especificado (PATH ou URL) que são enviados ao daemon Docker para construir uma imagem Docker. Isso é importante porque o Dockerfile e quaisquer arquivos que ele precise (como código de aplicação) devem estar dentro do contexto de construção.

Primeiro, vamos criar um diretório para nosso projeto. Vamos chamá-lo de my-watch-app.

mkdir ~/project/my-watch-app
cd ~/project/my-watch-app

Agora, precisamos criar um arquivo de aplicação simples. Usaremos um script Python básico que imprime uma mensagem.

nano app.py

Adicione o seguinte conteúdo a app.py:

print("Hello from the Docker container!")

Salve e feche o arquivo (Ctrl+X, Y, Enter).

Em seguida, precisamos criar um Dockerfile que construirá uma imagem para nossa aplicação. O Dockerfile copiará nosso script Python para a imagem e, em seguida, o executará.

nano Dockerfile

Adicione o seguinte conteúdo ao Dockerfile:

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

CMD ["python", "app.py"]

Este Dockerfile usa uma imagem Python 3.9 slim como base, define o diretório de trabalho como /app, copia app.py para o diretório /app e, finalmente, define o comando para executar o script Python quando o contêiner iniciar.

Finalmente, precisamos criar um arquivo docker-compose.yaml para definir nosso serviço. Este arquivo dirá ao Docker Compose como construir e executar nossa aplicação.

nano docker-compose.yaml

Adicione o seguinte conteúdo a docker-compose.yaml:

version: "3.8"

services:
  myapp:
    build: .
    volumes:
      - .:/app

Este arquivo docker-compose.yaml define um serviço chamado myapp. A instrução build: . diz ao Docker Compose para construir a imagem usando o Dockerfile no diretório atual (que é nosso contexto de construção). A linha volumes: - .:/app monta o diretório atual (.) na máquina host para o diretório /app dentro do contêiner. Isso é crucial para o docker compose watch, pois permite que as alterações no host sejam refletidas no contêiner.

Agora, vamos construir e executar nosso serviço usando o Docker Compose para garantir que tudo esteja configurado corretamente. Como o Docker Compose não está pré-instalado, precisamos instalá-lo primeiro.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Agora podemos usar docker-compose.

docker-compose up --build

Você deve ver a saída indicando que a imagem está sendo construída e o contêiner está em execução, imprimindo "Hello from the Docker container!". Pressione Ctrl+C para parar o contêiner.

Use docker compose watch para monitorar alterações nos arquivos e reconstruir

Nesta etapa, usaremos o comando docker compose watch para reconstruir e reiniciar automaticamente nosso serviço quando fizermos alterações no código da aplicação. Este é um recurso poderoso para fluxos de trabalho de desenvolvimento, permitindo uma iteração rápida.

O comando docker compose watch monitora os arquivos em seu contexto de construção e, quando as alterações são detectadas, ele pode reconstruir automaticamente a imagem e reiniciar o serviço.

Certifique-se de estar no diretório ~/project/my-watch-app.

cd ~/project/my-watch-app

Agora, execute o comando docker compose watch.

docker-compose watch

Você verá a saída indicando que o Docker Compose está iniciando o serviço e monitorando as alterações nos arquivos. A saída inicial será semelhante à execução de docker-compose up.

Enquanto o docker compose watch estiver em execução em seu terminal, abra outro terminal ou aba. Navegue até o diretório do projeto no novo terminal.

cd ~/project/my-watch-app

Agora, vamos modificar o arquivo app.py.

nano app.py

Altere o conteúdo para:

print("Hello again from the updated Docker container!")

Salve e feche o arquivo (Ctrl+X, Y, Enter).

Volte para o terminal onde o docker compose watch está em execução. Você deve ver a saída indicando que uma alteração foi detectada, a imagem está sendo reconstruída e o contêiner está sendo reiniciado. Após a reinicialização, a nova mensagem "Hello again from the updated Docker container!" será impressa.

Isso demonstra como o docker compose watch lida automaticamente com o processo de construção e reinicialização quando seu código é alterado.

Pressione Ctrl+C no terminal executando docker compose watch para parar o processo.

Explore a opção --no-up para watch sem a construção inicial

Nesta etapa, exploraremos a opção --no-up com docker compose watch. Por padrão, o docker compose watch construirá e iniciará os serviços definidos em seu arquivo docker-compose.yaml antes de começar a monitorar as alterações nos arquivos. A opção --no-up impede essa construção e inicialização iniciais. Isso é útil se você deseja começar a monitorar as alterações sem iniciar imediatamente os serviços, talvez porque planeja iniciá-los manualmente mais tarde ou porque eles já estão em execução.

Certifique-se de estar no diretório ~/project/my-watch-app.

cd ~/project/my-watch-app

Agora, execute o comando docker compose watch com a opção --no-up.

docker-compose watch --no-up

Você notará que a saída é diferente da etapa anterior. O Docker Compose começará a monitorar as alterações nos arquivos, mas não construirá a imagem nem iniciará o contêiner inicialmente. A saída indicará que está monitorando os caminhos especificados.

Enquanto o docker compose watch --no-up estiver em execução em seu terminal, abra outro terminal ou aba. Navegue até o diretório do projeto no novo terminal.

cd ~/project/my-watch-app

Agora, vamos modificar o arquivo app.py novamente.

nano app.py

Altere o conteúdo para:

print("Watching without initial up!")

Salve e feche o arquivo (Ctrl+X, Y, Enter).

Volte para o terminal onde o docker compose watch --no-up está em execução. Você deve ver a saída indicando que uma alteração foi detectada e a imagem está sendo reconstruída. No entanto, o contêiner não reiniciará automaticamente porque usamos a opção --no-up.

Para ver o efeito da alteração, você precisará iniciar manualmente o serviço em outro terminal após a conclusão da reconstrução.

docker-compose up

Você verá a nova mensagem "Watching without initial up!" impressa pelo contêiner.

Pressione Ctrl+C no terminal executando docker compose watch --no-up para parar o processo de monitoramento. Pressione Ctrl+C no terminal executando docker-compose up para parar o contêiner.

Observe a opção --quiet para ocultar a saída da construção (build)

Nesta etapa, observaremos o efeito da opção --quiet com docker compose watch. Por padrão, quando o docker compose watch detecta uma alteração e reconstrói uma imagem, ele exibe a saída completa do processo de construção. A opção --quiet suprime essa saída detalhada da construção, mostrando apenas informações essenciais sobre o processo de monitoramento e reinicializações do serviço. Isso pode tornar a saída mais limpa, especialmente para pequenas alterações frequentes.

Certifique-se de estar no diretório ~/project/my-watch-app.

cd ~/project/my-watch-app

Agora, execute o comando docker compose watch com a opção --quiet. Também incluiremos a opção --no-up novamente para que possamos ver apenas a saída relacionada ao processo de monitoramento e reconstrução, e não a inicialização inicial do serviço.

docker-compose watch --quiet --no-up

Você verá a saída indicando que o Docker Compose está monitorando as alterações nos arquivos, mas não haverá saída detalhada da construção inicialmente.

Enquanto o docker compose watch --quiet --no-up estiver em execução em seu terminal, abra outro terminal ou aba. Navegue até o diretório do projeto no novo terminal.

cd ~/project/my-watch-app

Agora, vamos modificar o arquivo app.py pela última vez.

nano app.py

Altere o conteúdo para:

print("Quietly watching changes!")

Salve e feche o arquivo (Ctrl+X, Y, Enter).

Volte para o terminal onde o docker compose watch --quiet --no-up está em execução. Você deve ver a saída indicando que uma alteração foi detectada e a imagem está sendo reconstruída, mas as etapas detalhadas do processo de construção do Docker serão ocultadas. Você verá apenas uma mensagem concisa sobre a reconstrução.

Isso demonstra como a opção --quiet reduz a verbosidade da saída durante a fase de construção acionada pelo docker compose watch.

Pressione Ctrl+C no terminal executando docker compose watch --quiet --no-up para parar o processo de monitoramento.

Resumo

Neste laboratório, aprendemos como preparar um projeto Docker Compose simples com um contexto de construção (build context), que é essencial para construir imagens Docker a partir de arquivos locais. Criamos um diretório de projeto, um arquivo de aplicação Python básico (app.py), um Dockerfile para construir uma imagem para a aplicação e um arquivo docker-compose.yaml para definir o serviço e seu contexto de construção.

Em seguida, exploramos o comando docker compose watch, que nos permite monitorar automaticamente as alterações nos arquivos dentro do contexto de construção e acionar reconstruções do serviço associado. Aprendemos como usar o comando para observar este processo de reconstrução automática e também exploramos a opção --no-up para monitorar sem uma construção inicial e a opção --quiet para suprimir a saída da construção, fornecendo um fluxo de trabalho otimizado para desenvolvimento.