QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.
- Source
- Introdução
- Parte I - ASP.NET - Inicializando os Projetos
- Parte 2 - PostgreSQL
- Parte 3 - ASP.NET - Registrando Serviços e Lendo Variáveis de Ambiente
- Parte 4 - ASP.NET - Entity Framework e ASP.NET Core Identity
- Parte 5 - ASP.NET - Documentação Interativa com Swagger
- Parte 6 - ASP.NET - Regionalização
- Parte 7 - ASP.NET - Autenticação e Autorização
- Parte 8 - ASP.NET - CORS
- Parte 9 - Quasar - Criação e Configuração do Projeto
- Parte 10 - Quasar - Configurações e Customizações
- Parte 11 - Quasar - Componentes - Diferença entre SPA e SSR
- Parte 12 - Quasar - Serviços
- Parte 13 - Quasar - Regionalização e Stores
- Parte 14 - Quasar - Consumindo a API
- Parte 15 - Quasar - Login
- Parte 16 - Quasar - Áreas Protegidas
- Parte 17 - Quasar - Registro
- Parte 18 - Docker - Maquina Virtual Linux
- Parte 19 - Docker - Registro e Build
- Parte 20 - Docker - Traefik e Publicação
- Demo Online
38 Criando um Container Registry no Azure.
para podemos continuar, iremos precisar de um Container Registry
, novamente, você pode usar qual quer provedor, como por exemplo, o Docker Hub porém estarei criando um no azure.
Então comece o processo para adicionar um novo recurso, e busque por Container Registry
:
É interessante que o Container Registry
use o mesmo grupo de recursos e esteja localizado na mesma região que a VM
, assim como estaremos ativando o usuário admin
, e como estamos criando este registro apenas para testes, use o SKU
Basic.
Agora à confirmação da criação do registro, precisamos esperar alguns instantes, até que o azure configure tudo.
Por fim, vá até a guia Access Keys
e copie o nome do Login server
, username
e o password
.
Agora, temos um registro para onde podemos enviar as nossas imagens.
39 Fazendo o Build para produção
Antes de realizamos o build
para produção, precisamos desativar o redirecionamento HTTPS
da API
, pois este procedimento será feito por outro serviço, o traefik.
então, no docker-compose.yml
remova qual quer referencia à porta 443
.
- "34513:443" => // remova completamente esta linha - ASPNETCORE_URLS=http://+:443;http://+:80 => - ASPNETCORE_URLS=;http://+:80
E no QPANC.Api/Startup.cs, remova a seguinte linha:
app.UseHttpsRedirection();
Então, faça uma copia do docker-compose.override.yml
e renomeie ela para docker-compose.production.yml
.
QPANC/docker-compose.production.yml
version: '3.4' services: qpanc.api: environment: - ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_URLS=https://+:443;http://+:80 - DEFAULT_CONNECTION=Server=qpanc.database;Port=5432;Database=postgres;User Id=postgres;Password=keepitsupersecret; - JWTBEARER_VALIDISSUER=https://api.qpanc.tobiasmesquita.dev/ - JWTBEARER_VALIDAUDIENCE=https://api.qpanc.tobiasmesquita.dev/ - JWTBEARER_ISSUERSIGNINGKEY=itUXC7iVRsofSDWNeg/aLYpc4bMzHAsMPzeItE1PQi2tMK2f4t0InRgTE5B/4IAjhAX5LQSIGL1CaUHSSzED8A== - JWTBEARER_TOKENDECRYPTIONKEY=7hfboHG0d4GnXjVng0ukMo+IgrKKrPLUMtOvnt4S514= - CORS_HOSTS__0=qpanc.tobiasmesquita.dev ports: - "34512:80" - "34513:443" volumes: - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro qpanc.app: container_name: qpanc_app_prod build: context: ./QPANC.App target: 'prod-stage' dockerfile: .docker/prod.Dockerfile volumes: - app:/app ports: - "34514:3000" qpanc.database: volumes: - database:/var/lib/postgresql/database environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: keepitsupersecret POSTGRES_DB: postgres volumes: app: database:
No service qpanc.api
nós alteramos o environment
, adicionando algumas variáveis de ambiente e modificando outras: ASPNETCORE_ENVIRONMENT
, JWTBEARER_VALIDISSUER
, JWTBEARER_VALIDAUDIENCE
e CORS_HOSTS__0
.
No service qpanc.app
, temos mais alterações, a primeira é o nome do contêiner em container_name: qpanc_app_prod
, no caso do build, estamos usando um outro Dockerfile
, nos volumes
, app
vai está apontando para um volume interno, na porta, estaremos usando a porta 3000
ao invés de 8080
, assim como, foi removido o commands
.
Por fim, o qpanc.database
teve alterações menos relevantes, como o volumes
e o container_name
.
O próximo passo, é preparar o prod.Dockerfile
QPANC.App/.docker/prod.Dockerfile
# develop stage FROM node:12.16-alpine as develop-stage WORKDIR /app/source COPY package*.json ./ RUN npm i -g @quasar/cli@latest COPY . . # local-deps FROM develop-stage as local-deps-stage RUN ls RUN rm -r -f .quasar RUN rm -r -f dist RUN rm -r -f node_moduless RUN rm -f yarn.lock RUN yarn # build stage FROM local-deps-stage as build-stage ENV API_CLIENT_URL=https://api.qpanc.tobiasmesquita.dev/ ENV API_SERVER_URL=https://api.qpanc.tobiasmesquita.dev/ RUN quasar build -m ssr # prod stage FROM build-stage as prod-stage WORKDIR /app/source/dist/ssr RUN mv * ../../../ WORKDIR /app RUN rm -r -f source RUN yarn CMD ["node", "index.js"]
Basicamente, estamos copiando o source
, apagando node_moduless
, dist
, locks
, e baixamos novamente, então é feito o build, copiamos os arquivos do build para a raiz, por fim apagamos o source
Agora, execute o seguinte comando.:
docker-compose -f docker-compose.yml -f docker-compose.production.yml build docker image ls -a
Vai levar alguns longos segundos, para que o build do app e da api seja realizado, então devemos anotar o ID das imagens, no meu caso 516a0d428a28
para a api
e eb3ec1b5548e
para o app
.
Então, execute o seguinte comando para o app
e para a api
, para que consigamos criar as suas respectivas tags.
docker tag {image} {registry_name}/{container_name}:{tag_name}
no meu caso:
docker tag 516a0d428a28 qpanc.azurecr.io/api:latest docker tag eb3ec1b5548e qpanc.azurecr.io/app:latest docker image ls -a
Agora que criamos as nossas imagens e as suas respectivas tags, precisamos subir relas para o container
, para que isto seja possível, teremos de logar no docker
usando uma conta com permissão:
docker login -u ${username} -p ${password} ${login_server}
no meu caso
docker login -u qpanc -p ************************ qpanc.azurecr.io
agora que efetuamos o login, podemos fazer o push
das imagens, então execute o seguinte comando, tanto para o app
como para a api
.
docker push {registry_name}/{container_name}:{tag_name}
no meu caso
docker push qpanc.azurecr.io/api:latest docker push qpanc.azurecr.io/app:latest
Feito isto, as imagens já estão disponíveis, já podemos ser acessadas a partir da VM
Caso tenha feito o upload para um Registro criado no portal do Azure, eles vão ser listados da seguinte forma:
Note que latest
é o valor default
para as tags
, porém é interessante, que a cada publicação seja criado uma nova tag
, como por exemplo 1.0.0
, 1.0.1
ou 1.1.0
, e a latest
deverá ser apenas um alias
para a mais recente.
Por fim, deixo um script que fazer a limpeza dos containers/imagens, faz o build, cria as tags e realiza o upload. Porém que fique claro, que esta solução é um tanto quanto drástica.
docker container stop $(docker container ls -aq) docker container rm $(docker container ls -aq) docker image rm $(docker image ls -aq) -f docker-compose -f docker-compose.yml -f docker-compose.production.yml build --no-cache --force-rm --compress docker tag $(docker image ls -f=reference="qpancapi" -q) qpanc.azurecr.io/api:latest docker tag $(docker image ls -f=reference="qpancapp" -q) qpanc.azurecr.io/app:latest docker push qpanc.azurecr.io/api:latest docker push qpanc.azurecr.io/app:latest
Top comments (0)