![](https://crypto4nerd.com/wp-content/uploads/2024/04/1ime7PKQhs7gJoovd90si9g.jpeg)
Como prometido, agora criar uma esteira automática para que o github monte nossa imagem docker e salve localmente em nossas máquinas no dockerhub desktop. Vamos começar, o repositório usado no exemplo pode ser encontrado no seguinte link: Repositório meu primeiro deploy de docker.
Primeiramente, vamos compreender a estrutura do nosso repositório. A princípio, o modelo que vamos “containerizar” é simples: um modelo de aprendizado de máquina no qual treinamos conjuntos de dados para identificar se uma imagem contém um humano ou um cavalo, utilizando a biblioteca TensorFlow. No entanto, a intenção deste tutorial não é focar na parte de IA, mas sim em como disponibilizar a infraestrutura.
Dentro do nosso arquivo dockerfile temos algumas instruções bem similares do nosso dockerfile exemplo que mostramos anteriormente.
Com o arquivo Dockerfile e o requirements.txt, temos o básico para criar qualquer imagem Docker. No entanto, o grande diferencial nesta etapa é, de fato, a pasta .github. Essa pasta contém configurações especiais e recursos úteis, como workflows de CI/CD (Integração Contínua/Entrega Contínua), que otimizam o fluxo de desenvolvimento de qualquer projeto. Em resumo, promove uma abordagem DevOps, facilitando a integração, entrega e operação contínua do software.
Para iniciar a criação desses workflows, é preciso criar um diretório chamado .github na raiz do seu repositório. Dentro deste diretório, crie um subdiretório chamado workflows. Por fim, dentro do subdiretório workflows, crie um arquivo chamado docker-image.yml.
Dentro desse arquivo docker-image.yml, temos a seguinte sintaxe:
# Nome da nossa pipeline
name: Docker Image CI # Aqui estamos indicando que vamos ativá-la toda vez que um commit for enviado
# para a branch especificada, que neste caso é a branch main
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
# Passo 1: Checkout do código-fonte
- uses: actions/checkout@v3
# Passo 2: Construção da imagem Docker localmente
- name: Build da imagem Docker localmente
run: docker build . -t ${{ github.repository }}:latest
# Passo 3: Debug - Listagem das imagens Docker
- name: Debug - Listagem das imagens Docker
run: docker images
# Passo 4: Marcação e Envio da imagem Docker para o Docker Hub,
# atenção o nome da imagem do github que estamos subindo, aqui pegamos o nome do nosso repositório
- name: Tag e Envio da imagem Docker
run: |
echo "$DOCKER_HUB_PASSWORD" | docker login --username "$DOCKER_HUB_USERNAME" --password-stdin
docker tag ${{ github.repository }}:latest $DOCKER_HUB_USERNAME/${{ github.repository }}:latest
docker push $DOCKER_HUB_USERNAME/${{ github.repository }}:latest
env:
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} #Aqui estamos puxando segredos dentro do github
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
Vamos analisar a sintaxe do que estamos fazendo:
Passo 1: Checkout do código-fonte: Este passo utiliza uma ação predefinida do GitHub para realizar o checkout do código-fonte do repositório. Ele garante que o código-fonte mais recente do repositório seja disponibilizado para as etapas subsequentes da pipeline.
Passo 2: O nome da imagem Docker é definido como o nome do repositório GitHub (incluindo o proprietário/nome do usuário) seguido por “:latest”.
Passo 3: Debug — Listagem das imagens Docker: Este passo é opcional e serve para exibir uma listagem das imagens Docker presentes no ambiente, útil para fins de depuração e verificação.
Passo 4: Marcação e Envio da imagem Docker para o Docker Hub: Neste passo, a imagem Docker é marcada com a tag correta e, em seguida, enviada para o Docker Hub. As credenciais de acesso ao Docker Hub são recuperadas dos secrets do GitHub e utilizadas para autenticar o login e o envio da imagem.
Após criar o arquivo, vamos iniciar nosso fluxo no GitHub. Mas, perceba que antes configuramos o login e senha do Docker Hub e mencionamos os “secrets do GitHub”. Então, o que são esses tais de “secrets”?!
Bem, os secrets do GitHub são como cofres seguros para informações sensíveis, como tokens de acesso, senhas e chaves de API. Eles são criptografados e podem ser usados em fluxos de trabalho do GitHub para garantir que informações confidenciais, como credenciais de serviços externos, sejam acessadas de forma segura durante a execução dos nossos processos. Isso é essencial para proteger nossos dados e garantir que nosso pipeline funcione de maneira segura e eficiente.
Vamos configurar nossa conta do dockerhub dentro do nosso git, caso voce não tenha criado uma conta recomendo que faça essa etapa antes de prosseguirmos, dentro do dockerhub desktop tem a opção de login/sign up.
Vamos acessar a configuração do nosso repositório.
Precisamos criar duas secrets, sendo elas:
DOCKER_HUB_PASSWORD => onde vai armazenar nossa senha do dockerhub.
DOCKER_HUB_USERNAME => onde vai armazenar nosso usuário.
Atenção que devemos cadastrar um segredo de cada vez.
Após cadastrarmos podemos realizar um novo commit em nossa branch main que configuramos para ativar a pipeline do docker ou acessar a barra do github actions e re-acionar nosso fluxo.
Caso você tenha feito tudo de forma correta, a pipeline aparecerá um simbolo verdinho, o que significa que foi executada com sucesso! Vamos verificar nosso docker desktop para acessar nossa imagem.
Acessando a opção Images e em seguida Hub, podemos ver todas imagens que criamos vinda dos nossos repositórios github.
Vamos executar agora a imagem localmente, para testar se tudo está funcionando corretamente, para isso precisamos inicialmente usar o comando docker pull, onde ele vai pegar a nossa imagem e baixar-la localmente.
O motivo de porque essa etapa antes de realizar o docker run é que ele permite baixar imagens de contêineres de um registro remoto(neste caso nossa conta no docker hub) para o ambiente local do usuário.
Agora um exemplo teste de execução do código direto do dockerhub desktop.