<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Claudio Silva Junior</title>
    <description>The latest articles on DEV Community by Claudio Silva Junior (@claudiocode).</description>
    <link>https://dev.to/claudiocode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F477417%2F368e1bfc-c711-4036-a9bd-7a43a42a1e23.jpeg</url>
      <title>DEV Community: Claudio Silva Junior</title>
      <link>https://dev.to/claudiocode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/claudiocode"/>
    <language>en</language>
    <item>
      <title>Como colocar uma api Spring Boot no DockerFile</title>
      <dc:creator>Claudio Silva Junior</dc:creator>
      <pubDate>Sun, 03 Apr 2022 05:39:42 +0000</pubDate>
      <link>https://dev.to/claudiocode/como-colocar-uma-api-spring-boot-no-dockerfile-1dp6</link>
      <guid>https://dev.to/claudiocode/como-colocar-uma-api-spring-boot-no-dockerfile-1dp6</guid>
      <description>&lt;p&gt;O objetivo é te ajudar a colocar uma api spring no docker, fazendo o build da api no contêiner com o &lt;strong&gt;maven&lt;/strong&gt; e o &lt;strong&gt;gradle&lt;/strong&gt; porque o modo de fazer o build muda dependendo do seu gerenciador de dependências favorito. A principal motivação a escrita desse post é que eu não encontrei esse conteudo de forma facil e objetiva.&lt;/p&gt;

&lt;p&gt;Nesse artigo eu não vou mostrar como criar uma api spring porque vou assumir que você sabe como funciona o básico do framework, por isso vou me concentrar em como colocar a api no docker e nas diferenças entre os gerenciadores de dependência.&lt;/p&gt;

&lt;p&gt;Nas duas formas não muda o modo de como a gente vai subir os containers com o docke-compose.&lt;/p&gt;

&lt;p&gt;Uma coisa importante é que você nunca deve compilar um projeto seja de que linguagem for na sua máquina para rodar em outra plataforma em produção, porque por exemplo você estiver usando um computador com um processador arm e for rodar esse projeto na nuvem que provavelmente vai estar rodando algum x86 simplesmente o seu projeto não vai rodar e mesmo que os dois forem da mesma plataforma muitas vezes por diferenças simples entre os hardwares o seu projeto pode não rodar por isso nesse artigo vamos compilar o projeto no Docker para garantir que o resultado seja o mesmo em todos os ambientes.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o Dockerfile para fazer o build com o Maven
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; A primeira coisa que vamos fazer é construir a sequencia de comandos que vai fazer o build do nosso amado .jar e para isso vamos pegar uma imagem do &lt;strong&gt;docker&lt;/strong&gt; com a versão do &lt;strong&gt;maven&lt;/strong&gt; e do &lt;strong&gt;jdk&lt;/strong&gt; que a gente precisa, no nosso caso nos vamos pegar a ultima lts do java e a ultima versão do maven e para isso vamos usar o seguinte comando e também vamos dar um apelido para essa parte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;maven:3-openjdk-17-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos agora passar para uma pasta onde será movido os arquivos do nosso projeto e vamos copiar os arquivos do nosso projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /builder&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos passar um comando para ele gerar o arquivo compilado da nossa api.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;mvn clean package &lt;span class="nt"&gt;-DskipTests&lt;/span&gt; &lt;span class="nt"&gt;--batch-mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Agora vamos pegar uma imagem mais leve do Java sem gerenciador de dependências e com uma distribuição de Linux mais leve vamos usar o Linux Alpine com o Java 17.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; openjdk:17-jdk-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento a gente precisa copiar o nosso arquivo compilado .jar para dentro dessa imagem para isso vamos usar o apelido que nós definimos logo acima e passar o caminho de pastas até onde o Spring salvou o nosso arquivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /builder/target/*.jar /app.jar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim basta a gente chamar o nosso arquivo compilado como a gente faria rodando na máquina usando o comando ENTRYPOINT do Docker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando o Dockerfile para fazer o build com o Gradle
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Nesse começo são os mesmos passos de quando a gente faz o build com o Maven vamos definir uma imagem com a versão do Gradle e do Java que queremos, vamos ir para a pasta que queremos copiar os arquivos e vamos copiar o nosso projeto para dentro da imagem para poder compila-lo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## definindo a imagem e o apelido&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;gradle:jdk17&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;

&lt;span class="c"&gt;## criando uma nova pasta e dando um cd para lá&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /builder&lt;/span&gt;

&lt;span class="c"&gt;## copiando os arquivos do projeto&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; build.gradle .&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; settings.gradle .&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src src&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vem a grande diferença o comando que gera o build que é bem simples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;gradle build &lt;span class="nt"&gt;--no-daemon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Com o Build Feito vamos selecionar outra imagem para rodar a api dessa vez vamos pegar uma versão slim do Debian que é bem leve também e novamente os passos se repetem. Vamos copiar o .jar para dentro da imagem e rodar o comando para iniciar a api.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;## definindo a imagem que executara o nosso binario&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; openjdk:17-slim-bullseye&lt;/span&gt;

&lt;span class="c"&gt;## copiando o binario da outra imagem para essa&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /builder/build/libs/*.jar /app.jar&lt;/span&gt;

&lt;span class="c"&gt;## execultando a aplicação&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Agora alguns macetes para evitar dores de cabeça
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Configurar caracteres especiais
&lt;/h4&gt;

&lt;p&gt;Se você estiver usando um derivado do Cent Os adicione o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LANG=en_US.UTF-8"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/locale.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você estiver usando um derivado do Debian adicione o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; locales &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; locale-gen en_US.UTF-8

&lt;span class="k"&gt;RUN &lt;/span&gt;locale-gen en_US.UTF-8
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; LANG en_US.UTF-8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Desabilitando o Daemon do Gradle
&lt;/h4&gt;

&lt;p&gt;No comando de build do DockerFile do Gradle a gente passou uma flag &lt;code&gt;--no-daemon&lt;/code&gt; que desabilita alguns processo que ficariam rodando em background e que não são necessários depois da compilação da nossa api.&lt;/p&gt;

&lt;h4&gt;
  
  
  Maven Flag para usar as propriedades de prod/dev
&lt;/h4&gt;

&lt;p&gt;No Maven você pode ter dois arquivos de propriedades um com a config de prod e outro com a de dev ou teste, mais para isso você tem que criar os arquivos no seguinte padrão &lt;code&gt;application-dev.properties&lt;/code&gt;, &lt;code&gt;application-prod.properties&lt;/code&gt;, &lt;code&gt;application-test.properties&lt;/code&gt; ou qualquer outro nome que você queira para isso basta antes do ponto adicionar o nome que representa essa configuração como nos exemplos dev, prod ou test.&lt;/p&gt;

&lt;p&gt;O comando de build ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;mvn clean package &lt;span class="nt"&gt;-Dspring-boot&lt;/span&gt;.run.profiles&lt;span class="o"&gt;=&lt;/span&gt;prod &lt;span class="nt"&gt;-DskipTests&lt;/span&gt; &lt;span class="nt"&gt;--batch-mode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Links dos projetos usados para os exemplos de codigo
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://github.com/Claudio-code/spring-security" rel="noopener noreferrer"&gt;Projeto usando o Maven&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Claudio-code/geolocation-search-with-mongodb-spring" rel="noopener noreferrer"&gt;Projeto usando o Gradle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero ter te ajudado, caso eu tenha errado em alguma coisa entre em contato comigo e me ajude melhorar.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
