Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Meu arquivo tem alguma diferença significativa?

Criei meu arquivo dockerfile:

# Etapa de construção (builder)
FROM eclipse-temurin:21-jdk-alpine as builder
WORKDIR /application
COPY . .

RUN ./mvnw clean package -DskipTests

# Etapa de execução (runtime)
FROM eclipse-temurin:21-jre-alpine
WORKDIR /application
COPY --from=builder /application/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

Ele funciona igual, mas pude perceber que tem muitos passos a menos. Em termos de otimizações, o que eu poderia fazer? Comparado ao do instrutor tem alguma diferença muito significativa?

4 respostas

Olá Jelson!

Analisando seu Dockerfile, você fez um bom trabalho em simplificar o processo de construção e execução da sua aplicação Java. Vamos discutir algumas otimizações e diferenças em relação ao Dockerfile do curso.

  1. Multi-stage build: Você já está utilizando essa prática, que é excelente para reduzir o tamanho da imagem final. O Dockerfile do curso, no entanto, vai além ao extrair explicitamente as dependências e componentes do arquivo .jar, o que pode ajudar a reduzir ainda mais o tamanho da imagem e otimizar o cache das camadas do Docker.

  2. Otimização de camadas: No Dockerfile do curso, há uma separação mais detalhada das camadas, copiando e configurando elementos específicos como dependências e loaders do Spring Boot. Isso pode melhorar o tempo de reconstrução da imagem, pois alterações em partes específicas do código não invalidam o cache de camadas que não foram alteradas.

  3. Execução: O curso utiliza o JarLauncher do Spring Boot, que é uma forma otimizada de executar aplicações encapsuladas em .jar, gerenciando melhor as dependências e a execução. No seu caso, você está executando o .jar diretamente, o que é totalmente funcional, mas pode não ser tão eficiente quanto o método do curso em termos de gerenciamento de dependências e inicialização.

Espero ter ajudado e bons estudos!

Então, testando as diferenças (no mesmo projeto), quando alterei o dockerfile para o do curso, tive problemas com esse trecho:

ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

recebo um erro:

 => ERROR [builder 8/9] COPY target/*.jar application.jar                                                                                                                                                   0.1s
------
 > [builder 8/9] COPY target/*.jar application.jar:
------
Dockerfile:9
--------------------
   7 |     RUN ./mvnw package -DskipTests
   8 |     ARG JAR_FILE=target/*.jar
   9 | >>> COPY ${JAR_FILE} application.jar
  10 |     RUN java -Djarmode=layertools -jar application.jar extract
  11 |
--------------------
ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount844656953/target: no such file or directory

o dockerfile (só altero a versão da imagem):

FROM eclipse-temurin:21-jdk-alpine as builder
WORKDIR application
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src
RUN ./mvnw package -DskipTests
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract


FROM eclipse-temurin:21-jre-alpine
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
solução!

Deve ter dado algum problema para gerar o jar do projeto. Roda um ./mvnw clean package no terminal e tente gerar a imagem novamente

Era isso mesmo, esqueci de fazer o build :) Muito obrigado Rodrigo, você é fera!