<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on Munish Thakur | DevOps Engineer</title><link>https://methakur.info/tags/docker/</link><description>Recent content in Docker on Munish Thakur | DevOps Engineer</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 01 Dec 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://methakur.info/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Building My Portfolio: From HTML to Hugo</title><link>https://methakur.info/blog/building-my-portfolio-with-hugo/</link><pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate><guid>https://methakur.info/blog/building-my-portfolio-with-hugo/</guid><description>&lt;p>When I decided to build my portfolio, I had a choice: keep it simple with plain HTML, or use it as an opportunity to demonstrate my DevOps skills. I chose the latter.&lt;/p>
&lt;h2 id="why-hugo">Why Hugo?&lt;/h2>
&lt;p>Hugo is a static site generator written in Go. Here&amp;rsquo;s why it made sense for a DevOps engineer:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Speed&lt;/strong>: Hugo builds are blazing fast (milliseconds, not minutes)&lt;/li>
&lt;li>&lt;strong>No runtime dependencies&lt;/strong>: The output is just HTML, CSS, and JS&lt;/li>
&lt;li>&lt;strong>DevOps-friendly&lt;/strong>: The Kubernetes documentation itself uses Hugo&lt;/li>
&lt;li>&lt;strong>Markdown-based&lt;/strong>: Write content in Markdown, focus on writing&lt;/li>
&lt;/ol>
&lt;h2 id="the-architecture">The Architecture&lt;/h2>
&lt;pre tabindex="0">&lt;code>┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Markdown Files │────▶│ Hugo Build │────▶│ Static Files │
└─────────────────┘ └──────────────┘ └─────────────────┘
 │
 ┌───────────────────────┼───────────────────────┐
 │ │ │
 ▼ ▼ ▼
 ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
 │ GitHub Pages │ │ Docker/Nginx │ │ Kubernetes │
 │ (Production) │ │ (Local Dev) │ │ (Proof of Work)│
 └─────────────────┘ └─────────────────┘ └─────────────────┘
&lt;/code>&lt;/pre>&lt;h2 id="the-devops-artifacts">The DevOps Artifacts&lt;/h2>
&lt;p>This repository isn&amp;rsquo;t just a portfolio—it&amp;rsquo;s a showcase of DevOps practices:&lt;/p></description></item><item><title>Docker Image Optimization: Lessons from Production</title><link>https://methakur.info/blog/docker-image-optimization/</link><pubDate>Thu, 28 Nov 2024 00:00:00 +0000</pubDate><guid>https://methakur.info/blog/docker-image-optimization/</guid><description>&lt;p>At Solytics Partners, I optimized Docker images and achieved a 35% size reduction and 75% faster build times. Here&amp;rsquo;s what I learned.&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Most Dockerfiles I inherited looked like this:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">FROM&lt;/span>&lt;span style="color:#f1fa8c"> python:3.11&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">WORKDIR&lt;/span>&lt;span style="color:#f1fa8c"> /app&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">COPY&lt;/span> . .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">RUN&lt;/span> pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">CMD&lt;/span> [&lt;span style="color:#f1fa8c">&amp;#34;python&amp;#34;&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#34;app.py&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This creates images that are:&lt;/p></description></item><item><title>Docker Image Optimization: The 75% Reduction Story</title><link>https://methakur.info/blog/docker-75-percent-reduction/</link><pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate><guid>https://methakur.info/blog/docker-75-percent-reduction/</guid><description>&lt;p>When I joined Solytics Partners as a DevOps Intern, one of my first tasks was optimizing our Docker images. Our Nimbus Console service was running a &lt;strong>3.1GB Docker image&lt;/strong>, and it was slowing down deployments significantly.&lt;/p>
&lt;p>I managed to reduce it by &lt;strong>60-75%&lt;/strong>, but not without learning some hard lessons about over-optimization.&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Our production image was massive:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">FROM&lt;/span>&lt;span style="color:#f1fa8c"> python:3.10 # Base image alone: ~900MB&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">RUN&lt;/span> apt-get install openjdk-11-jdk &lt;span style="color:#6272a4"># Java: +200MB&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">RUN&lt;/span> playwright install &lt;span style="color:#6272a4"># All browsers: +1GB&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">RUN&lt;/span> Rscript install_r.sh &lt;span style="color:#6272a4"># R environment: +500MB&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6272a4"># ... 100+ Python packages: +500MB&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>Total: 3.1GB&lt;/strong>&lt;/p></description></item><item><title>Fixing XMLSec/LXML Version Mismatch: When Installation Order Matters</title><link>https://methakur.info/blog/xmlsec-lxml-docker-fix/</link><pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate><guid>https://methakur.info/blog/xmlsec-lxml-docker-fix/</guid><description>&lt;p>Sometimes the most frustrating bugs are the ones with cryptic error messages. This was one of them.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ff79c6">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span style="color:#ff79c6">from&lt;/span> onelogin.saml2.auth &lt;span style="color:#ff79c6">import&lt;/span> OneLogin_Saml2_Auth
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>xmlsec&lt;span style="color:#ff79c6">.&lt;/span>Error: (&lt;span style="color:#bd93f9">100&lt;/span>, &lt;span style="color:#f1fa8c">&amp;#39;lxml &amp;amp; xmlsec libxml2 library version mismatch&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The application container was crashing on startup, and all I had was this error message.&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Our Django application needed SAML authentication, which required &lt;code>python3-saml&lt;/code>. This package depends on both &lt;code>lxml&lt;/code> and &lt;code>xmlsec&lt;/code>, which both depend on the system library &lt;code>libxml2&lt;/code>.&lt;/p></description></item></channel></rss>