Quarkus :: Deploy no Heroku pt.2 (Docker)

Lírio
Devspoint
Published in
5 min readDec 28, 2021

O Heroku Container-Registry nos permite fazer deploy de nossa aplicação através de imagens Docker. A vantagem de fazer deploy com container é que temos controle total e talvez até mesmo escolhamos implantar um container com um app nativo usando GraalVM no processo de build.

Leia o artigo→ Quarkus :: Deploy no Heroku pt.1

O que vamos aprender?

  • Gerar imagem Docker de uma aplicação Quarkus
  • Deploy com Docker no Heroku
  • Criar um Banco de Dados Postgres no Heroku
  • Deploy de modo Nativo (GraalVM)

Os pré-requisitos para esse artigo são:

Primeiramente vamos gerar a imagem Docker da aplicação quarkus-intro e depois subi-lá para o Container-Registry do Heroku.

Para gerar a imagem Docker da nossa aplicação o Quarkus possui uma Extension chamado quarkus-container-image-docker e podemos adicionar essa Extension com o comando abaixo.

./mvnw quarkus:add-extension \
-Dextensions="io.quarkus:quarkus-container-image-docker"

Para gerar a imagem Docker utilizaremos o maven e para subir para Container-Registry do Heroku precisamos do nome adequado sugerido pelo próprio Heroku.

Repositoryregistry.heroku.com/quarkus-intro/web

Taglatest

./mvnw clean package \
-Dquarkus.container-image.build=true \
-Dquarkus.container-image.group=registry.heroku.com/quarkus-intro \
-Dquarkus.container-image.name=web \
-Dquarkus.container-image.tag=latest

Use o Comando docker images para ver a imagem gerada.

docker images

Subindo a imagem para o Container-Registry.

Antes de fazer o deploy da aplicação em Container, temos a aplicação quarkus-intro no Heroku sendo identificada como Java e depois do deploy com Container passara ser identificada como Container.

Java App

Iremos agora fazer login no Container-Registry do Heroku e depois publicar a imagem.

heroku container:login
docker push registry.heroku.com/quarkus-intro/web

Na imagem acima liberamos o deploy após publicar a imagem com o comando heroku container:release web.

Podemos ver no Console Web do Heroku nossa aplicação agora sendo identificada como Container.

No log podemos ver que a aplicação executa dentro da JVM e iniciou nesse primeiro momento em 10.951 segundos.

2021-12-08T06:25:39.851904+00:00 app[web.1]: 2021-12-08 06:25:39,851 INFO [io.quarkus] (main) quarkus-intro 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.4.2.Final) started in 10.951s. Listening on: http://0.0.0.0:43892

Testando Aplicação

Deploy com Native Image

O Heroku irá parar ou suspender a aplicação quando não houver tráfego e uma vantagem que podemos tirar é implantar um Container com a aplicação compilado nativamente. Uma aplicação nativa desperta e inicia muito mais rápido.

O processo de build e deploy é praticamente o mesmo.

./mvnw clean package \
-Dquarkus.container-image.build=true \
-Dquarkus.container-image.group=registry.heroku.com/quarkus-intro \
-Dquarkus.container-image.name=web \
-Dquarkus.container-image.tag=latest \
-Pnative \
-Dquarkus.native.container-build=true

Compilar a aplicação para o modo Nativo sempre será mais demorado → Tempo de Build 4:30 minutos.

Ao iniciar a aplicação recebemos o Erro abaixo.

General error: "java.lang.UnsupportedOperationException: H2 database compiled into a native-image is only functional as a client: can’t create an Embedded Database Session"

Um banco de dados embutido não funciona com aplicação nativa, nesse caso criaremos um banco de dados Postgresql e iremos configurar a aplicação com a String de Conexão.

Criando um Banco Postgres no Heroku

No Console Web do Heroku vamos iniciar a criação do banco Postgres, clicando na aplicação quarkus-intro e clicando em Configure Add-ons vamos iniciar a criação conforme imagem abaixo.

Agora que temos o Banco, precisaremos adicionar o Extension postgresql e configurar a String de Conexão na aplicação.

pom.xml

<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>

src/main/resources/application.properties

Uma das vantagens de utilizar um frameworks ORM é a possibilidade de trocar de banco de dados de uma forma transparente (ou quase), com o mínimo de alterações possível.

Após realizar o build e o deploy novamente da aplicação native-image temos o log no Boot.

2021–12–08 08:13:59,492 INFO [io.quarkus] (main) quarkus-intro 1.0.0-SNAPSHOT native (powered by Quarkus 2.4.2.Final) started in 0.366s.

--

--