Your Docker image is 1GB. Your actual Java application JAR is 200MB. Where is the other 800MB coming from? JDK. Maven. Source code. Build cache. Tools you needed to BUILD the app — but have absolutely no reason to be in your PRODUCTION image. This is the problem Docker Multi Stage Builds solve. Here is how it works 👇 Stage 1 — Builder → Use a full JDK image to compile your code → Run Maven to build and package the JAR → This stage is heavy — and that is fine Stage 2 — Runtime → Start fresh with a minimal JRE image → Copy only the JAR from Stage 1 using COPY --from → Nothing else — no JDK, no Maven, no source code Result? → Final image goes from 1GB to 200MB → Zero build tools in production → Dramatically smaller attack surface → Faster image pulls across all environments Docker builds all stages but only the final stage becomes the image that gets pushed and deployed. All the heavy build stuff is discarded automatically. In my latest video I showed this live with a Java Spring Boot Application — built the same app with single stage and multi stage Dockerfile and showed the image size difference side by side. The numbers speak for themselves. 🔗 Link in comments 👇 Found this useful? Repost ♻️ #Docker #DevOps #DevOpsInterview #DockerInterview #Dockerfile #Containerization #DevOpsCommunity #ayushbuildstech
Optimize Docker Images with Multi Stage Builds
More Relevant Posts
-
Excited to share my first ever Medium article! 🎉 I wrote a deep dive on Build Tools & Maven for Spring Boot developers. Here's what's covered: → What build tools actually are & why every Java dev needs to understand them → How Maven fetches dependencies from Maven Central Repository → Maven's full build lifecycle — phase by phase → How the Spring Boot executable JAR is created If you've ever copy-pasted a pom.xml without fully understanding it — this one's for you. Link: https://lnkd.in/ghuv7wKp #Java #SpringBoot #Maven #BuildTools #SpringFramework #JavaDeveloper #BackendDeveloper #SoftwareEngineer #SoftwareDevelopment #100DaysOfCode #LearningInPublic #OpenToWork #TechCommunity #Programming #Coding #Developer #Tech
To view or add a comment, sign in
-
🚀From Chaos to Clarity: My Journey from Core Java to Spring Boot Ever felt like you're spending more time managing configurations than actually building something meaningful? 😅 👉 BEFORE (Core Java) Endless XML configs, manual setup, dependency headaches… “Main developer hoon ya configuration manager 😂” 👉 AFTER (Spring Boot) Auto-configuration, embedded servers, faster development… “Life sorted 😄” 💡 What changed? Spring Boot didn’t just simplify development—it changed the way I think about building applications. Instead of focusing on setup, I now focus on logic, features, and user experience. 🔥 Bonus Insight (Important for Beginners): Spring Boot is powerful, but don’t skip Core Java fundamentals. Understanding concepts like OOP, collections, multithreading, and JVM helps you truly master Spring Boot instead of just using it. 📌 Key Takeaway: Tools like Spring Boot don’t replace fundamentals—they amplify them. If you're starting your backend journey, trust the process: 👉 Core Java → JDBC → Servlets → Spring Core → Spring MVC → Hibernate → JPA → Spring Boot → Projects → Advanced (Security + Microservices) #Java #SpringBoot #BackendDevelopment #CodingLife #Developers #Programming #SoftwareDevelopment #LearningJourney
To view or add a comment, sign in
-
-
🚀 Understanding Dependency Injection in Spring Boot As a Java Backend Developer, one concept that truly changed how I design applications is Dependency Injection (DI). 👉 What is Dependency Injection? Dependency Injection is a design pattern in which an object receives its dependencies from an external source rather than creating them itself. This helps in building loosely coupled, testable, and maintainable applications. Instead of: ❌ Creating objects manually inside a class We do: ✅ Let the framework (like Spring Boot) inject required dependencies automatically 💡 Types of Dependency Injection in Spring Boot 1️⃣ Constructor Injection (Recommended) Dependencies are provided through the class constructor. ✔ Promotes immutability ✔ Easier to test ✔ Ensures required dependencies are not null 2️⃣ Setter Injection Dependencies are set using setter methods. ✔ Useful for optional dependencies ✔ Provides flexibility 3️⃣ Field Injection Dependencies are injected directly into fields using annotations like @Autowired. ✔ Less boilerplate ❌ Not recommended for production (harder to test & maintain) 🔥 Why use Dependency Injection? ✔ Loose coupling ✔ Better unit testing ✔ Cleaner code architecture ✔ Easy to manage and scale applications 📌 In modern Spring Boot applications, Constructor Injection is considered the best practice. 💬 What type of Dependency Injection do you prefer and why? #Java #SpringBoot #BackendDevelopment #SoftwareEngineering #CleanCode #DependencyInjection
To view or add a comment, sign in
-
"Dockerizing a Java 24 Project with Docker Init" is here! A guide to Dockerizing a Java 24 project using Docker Init, including creating a Dockerfile, docker-compose file, and adding a simple controller. Read it on the Git-Weekly website: https://lnkd.in/dwwM5uN7
To view or add a comment, sign in
-
🚀 Evolution of Java — From OOP to Modern Scalable Systems Java didn’t just evolve… 👉 It transformed how we write, scale, and think about backend systems. 💡 Let’s take a quick journey through the most impactful versions: 🔹 Java 8 (2014) — LTS 👉 The turning point ✔️ Lambda Expressions ✔️ Streams API ✔️ Optional (goodbye NullPointerException 😅) ✔️ New Date & Time API 🔹 Java 11 (2018) — LTS 👉 Stability + modernization ✔️ New HttpClient API ✔️ String improvements (isBlank(), lines()) ✔️ var in lambda ✔️ Removed legacy modules → lighter JDK 🔹 Java 15 (2020) 👉 Developer productivity boost ✔️ Text Blocks (clean multi-line strings) ✔️ Sealed Classes (preview) ✔️ ZGC improvements (low latency apps) 🔹 Java 17 (2021) — LTS 👉 Enterprise-ready evolution ✔️ Sealed Classes (official) ✔️ Pattern Matching for instanceof ✔️ Improved switch (preview) ✔️ Better performance & security 🔹 Java 21 (2023) — LTS 👉 Game changer for scalability ✔️ Virtual Threads (Project Loom 🚀) ✔️ Pattern Matching for switch ✔️ Record Patterns ✔️ Sequenced Collections 🔹 Java 25 (2025) — LTS 👉 The future is being refined ✔️ Advanced concurrency improvements ✔️ Structured concurrency evolution ✔️ Performance & developer experience focus 🔥 What’s the real shift? 👉 From writing code ➡️ To building scalable, high-performance systems 💬 Ask yourself: Are you still coding like it’s Java 8… or leveraging the power of modern Java? 🚀 Which Java version (or feature) changed the way you code the most? #Java #Backend #SoftwareEngineering #Programming #SpringBoot #DevOps #Scalability #Tech
To view or add a comment, sign in
-
-
Most Spring Boot developers use 5 annotations and ignore the rest. That is exactly why their code ends up messy, hard to test, and painful to refactor. Spring Boot is not about memorizing annotations. It is about knowing which one to reach for and why. Here are the 15 that actually matter in real projects: → @SpringBootApplication bootstraps your entire app in one line → @RestController turns any class into a JSON API → @Service keeps business logic where it belongs → @Repository handles data access with proper exception translation → @Component is the fallback for everything else → @Autowired wires dependencies without boilerplate → @Configuration lets you define beans manually → @Bean registers objects you cannot annotate directly → @Transactional keeps your database operations safe → @RequestMapping maps HTTP requests to methods → @PathVariable reads dynamic URL segments → @RequestBody converts JSON into Java objects → @Valid triggers clean input validation → @ControllerAdvice centralizes exception handling → @ConditionalOnProperty powers feature flags and auto configuration Knowing these 15 is the difference between writing Spring Boot code and actually understanding the framework. Which one took you the longest to truly understand? Follow Amigoscode for more Java and Spring Boot content that helps you become a better engineer. #Java #SpringBoot #SoftwareDevelopment #Backend #Programming
To view or add a comment, sign in
-
☕ Optional — Writing Safer, Cleaner Code One of the most common runtime issues in Java applications is the infamous "NullPointerException". For years, developers relied heavily on manual null checks, often leading to cluttered and error-prone code. That’s where "Optional" comes in — a simple yet powerful feature introduced in Java 8 to handle the absence of values more gracefully. 🔍 What exactly is Optional? "Optional" is a container object that may or may not contain a non-null value. Instead of returning "null", methods can return an "Optional", making it explicit that the value might be missing. 💡 Why should we use it? - Reduces the risk of "NullPointerException" - Improves code readability and intent - Encourages a functional programming style - Helps avoid deeply nested null checks 🧠 Before Optional: if (user != null && user.getAddress() != null) { return user.getAddress().getCity(); } return "Unknown"; ✨ With Optional: return Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("Unknown"); ⚠️ Best Practices: - Don’t use "Optional" for fields in entities (like JPA models) - Avoid overusing it in method parameters - Use it mainly for return types where absence is possible 🚀 Key Takeaway: "Optional" isn’t just about avoiding nulls — it’s about writing expressive, intention-revealing code that is easier to read and maintain. Small improvements like these can significantly elevate code quality in real-world applications. Are you using "Optional" effectively in your projects? Or still sticking with traditional null checks? #Java #Optional #CleanCode #SoftwareDevelopment #BackendDevelopment #Java8 #Programming
To view or add a comment, sign in
-
💡 Types of Dependencies in Spring – Primitive, Collection & Reference While working with Dependency Injection in Spring, understanding the types of dependencies is essential for building flexible and loosely coupled applications. Spring mainly supports three types of dependencies: 🔹 Primitive Dependency This includes simple data types such as int, double, boolean, and String. These values are directly injected into a bean using configuration (XML or annotations). It is mainly used for basic configuration values. 🔹 Collection Dependency Spring allows injecting collections like List, Set, and Map. This is useful when a bean needs multiple values or a group of objects. For example, injecting a list of subjects or a map of key-value configurations. 🔹 Reference Dependency This is used to inject one object (bean) into another bean. It helps in achieving loose coupling by allowing one class to depend on another through Spring configuration instead of creating objects manually. In simple terms: ✔️ Primitive → Basic values ✔️ Collection → Group of values ✔️ Reference → Object-to-object dependency Understanding these dependency types helps in designing scalable, maintainable, and loosely coupled applications in Spring Framework. Mastering Dependency Injection is a key step toward becoming a strong Java backend developer 🚀 Thank you Sir Anand Kumar Buddarapu #Java #Spring #DependencyInjection #BackendDevelopment #Programming #TechLearning #SoftwareDevelopment
To view or add a comment, sign in
-
-
I just posted a new guide on how to trim the fat off your containers. We’re talking about taking a standard 1.2GB image and cutting it down to 400MB while making your builds way faster. The TL;DR: Use JRE-only base images (like Eclipse Temurin Alpine). Use Multi-Stage builds to keep Maven out of production. Use Layered JARs to maximize Docker caching. Read the full post here: https://lnkd.in/dD7YNAWa #Docker #SpringBoot #Java #Backend #DevOps #TechBlog
To view or add a comment, sign in
-
🚀 Containerizing Java Applications with Docker! 🚀 Today, I successfully created a Docker image for a Java Spring Boot application. Here’s a quick workflow that worked perfectly: Dockerfile Steps: 1️⃣ Use an official Java base image (openjdk:17-jdk) 2️⃣ Set the working directory (WORKDIR /app) 3️⃣ Copy pom.xml and the src/ folder into the container 4️⃣ Build the project inside Docker (mvn clean install -DskipTests) 5️⃣ Package the application as a .jar and expose the desired port 6️⃣ Define the entry point to run the Spring Boot app This approach ensures: ✅ Consistency across environments ✅ Faster deployments ✅ Easy scaling with container orchestration tools like Kubernetes 💡 Pro Tip: Always make your Docker image small and secure by using multi-stage builds and skipping unnecessary tests during build. Docker + Java = 🚀 Simplified DevOps and faster time-to-market! #Java #Docker #SpringBoot #DevOps #Microservices #CloudNative #Containerization #Kubernetes #JavaDeveloper #TechTips #SoftwareEngineering #Programming #BuildAutomation #CI_CD
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development