Heroku + Docker + Bota de primavera

A seguir, o foco será minha experiência na execução do aplicativo Spring Boot dockerizado nas máquinas virtuais gratuitas do serviço em nuvem Heroku . Uma das principais vantagens desse provedor é que possibilita a criação de máquinas virtuais gratuitas com restrição de horário de funcionamento e, para isso, apenas o registro é suficiente. Mesmo os detalhes do pagamento não precisam ser confirmados, embora se você os confirmar, poderá receber bônus adicionais. Você pode ler mais sobre o preço deles aqui . Do meu ponto de vista, a política deles em relação aos recursos livres quase não tem análogos.

E assim, depois de criar um aplicativo no Heroku, há várias maneiras de implantar seu código nele

  • confirmar no repositório heroku git
  • vincular aplicativo ao repositório do github
  • usando o docker container

A seguir, consideraremos o último desses métodos. Para continuar, precisaremos dos seguintes aplicativos


A última dessas ferramentas nos dará a oportunidade de executar todas as operações de trabalho com a nuvem na linha de comando.

Começamos criando um aplicativo Spring Boot por meio do Spring Initializr . Como dependências, adicione o Spring Web Starter. Deve ser o suficiente.

No mesmo pacote em que a classe principal do aplicativo está localizada, adicionamos a classe mais simples do controlador REST para que o aplicativo mostre sinais de vida.

@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } } 

Adicionar ao arquivo application.properties

 server.port=${PORT:8080} 

Essa configuração é crítica para executar o contêiner no Heroku. O fato é que, na rede interna do serviço, o aplicativo é iniciado em alguma porta livre no momento do lançamento, cujo número é transmitido pela variável de ambiente PORT. Além disso, o aplicativo deve ter tempo para se conectar a essa porta nos primeiros 60 segundos após o lançamento, caso contrário, ele será interrompido.

Na seção de plug - ins do arquivo pom.xml, adicione o dockerfile-plugin do Spotify, que nos ajudará na montagem da imagem do docker do nosso aplicativo.

 <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> 

Essa configuração de plug-in começará a criar a imagem como parte do destino de instalação e enviará a imagem para o repositório do docker Heroku como parte do destino de implantação. A propósito, para poder executar a implantação maven, é necessário desativar a implantação do arquivo jar coletado (não precisamos carregá-lo em nenhum lugar). Você pode fazer isso usando a opção maven.deploy.skip na seção de propriedades do arquivo pom.xml.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

Em seguida, crie um Dockerfile na pasta raiz do projeto (ao lado de pom.xml)

 FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"] 

Como você pode ver, passamos o nome do arquivo jar montado aqui como argumento para a montagem (ARG JAR_FILE). O valor desse argumento é definido nas configurações do plugin maven.

O script entrypoint.sh também será colocado na raiz do projeto e será muito simples.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

Preste atenção aos parâmetros da JVM que limitam a memória e, especialmente, aos dois primeiros parâmetros. Eles incluem um modo especial de gerenciamento de memória, necessário quando um aplicativo java é iniciado dentro do contêiner do Docker. A memória disponível para o aplicativo em máquinas Heroku gratuitas é limitada a 512 MB. Exceder esse limite encerrará o aplicativo. Se você deseja usar o Java 9+, as duas primeiras opções precisam ser substituídas por uma -XX: + UseContainerSupport . Você pode ler mais aqui . Parece também que o suporte ao contêiner deixou de ser um recurso experimental no Java 8. Detalhes aqui.

Após concluir estas etapas, tente iniciar
 mvnw clean install 

Se tudo for feito corretamente, o aplicativo e a imagem da janela de encaixe devem ser compilados. Você pode verificar se a imagem foi criada usando o comando
 docker images 

Agora vamos configurar a nuvem e usar a já mencionada CLI Heroku para isso. Obviamente, para concluir essas etapas, você precisará registrar uma conta no Heroku.

Primeiro de tudo, precisamos fazer login. Para fazer isso, execute o comando
 heroku login 
e siga as instruções abaixo.

Depois disso, você precisa fazer login no repositório heroku Docker. Para fazer isso, execute o comando
 heroku container:login 
sem isso, não podemos enviar nossa imagem do docker.

Em seguida, criamos o aplicativo usando o comando
 heroku apps:create <app-name> 

Observe que o nome do aplicativo deve corresponder ao nome do artefato especificado em pom.xml . Talvez aqui você deva gastar algum tempo selecionando o nome do aplicativo, que ainda não é ocupado por ninguém.

Depois que o aplicativo é criado, execute
 mvnw clean deploy 

e aguarde a criação do aplicativo e pressione a imagem do docker. Observe que o envio só é possível se o nome da imagem corresponder ao modelo registry.heroku.com/<app-name>/web e um aplicativo com o nome <app-name> foi criado. Se você olhar as configurações do plugin maven, verá que tudo é feito exatamente dessa maneira.

A etapa final para a imagem a ser implantada e lançada é o comando
 heroku container:release web --app=<app-name> 

Depois disso, siga o link https: // <app-name> .herokuapp.com / check e depois de um tempo você verá o texto que será exibido pelo manipulador do controlador.

Outra maneira de abrir um aplicativo em execução em um navegador é usar o comando
 heroku open --app=<app-name> 

Se algo não funcionar, os logs podem ser visualizados na interface da Web Heroku ou com o comando
 heroku logs 

Isso é tudo! Espero que este guia tenha sido útil!

Alguns links úteis


1. Documentação da Heroku CLI devcenter.heroku.com/categories/command-line
2. Sobre os recursos de gerenciamento de memória no Java devcenter.heroku.com/articles/java-memory-issues
3. devcenter.heroku.com/categories/deploying-with-docker
4. Um exemplo de aplicativo Java da Heroku. Há um método de implantação diferente, mas é útil consultar github.com/heroku/java-getting-started
5. Guia do Heroku para iniciar um aplicativo Java (não via Docker) devcenter.heroku.com/articles/getting-started-with-java?singlepage=true
6. Bom material sobre o uso de Java no Docker habr.com/en/company/hh/blog/450954
7. Sobre as opções para iniciar o Java nos contêineres do Docker www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Source: https://habr.com/ru/post/pt459472/


All Articles