<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DevOps Daily</title>
    <link>https://devops-daily.com</link>
    <description>The latest DevOps news, tutorials, and guides</description>
    <language>en</language>
    <lastBuildDate>Sun, 23 Nov 2025 11:56:20 GMT</lastBuildDate>
    <atom:link href="https://devops-daily.com/feed.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title><![CDATA[How to Set Up AWS Cost Explorer and Budgets for Teams]]></title>
      <link>https://devops-daily.com/posts/how-to-set-up-aws-cost-explorer-and-budgets-for-teams</link>
      <description><![CDATA[Learn how to set up AWS Cost Explorer and Budgets to track cloud spending, prevent cost overruns, and keep your team informed about AWS expenses.]]></description>
      <pubDate>Sat, 22 Nov 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-set-up-aws-cost-explorer-and-budgets-for-teams</guid>
      <category><![CDATA[AWS]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[AWS]]></category><category><![CDATA[Cost Management]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[FinOps]]></category><category><![CDATA[Budgets]]></category>
      <content:encoded><![CDATA[<p>Cloud costs can spiral out of control quickly if you&#39;re not paying attention. AWS Cost Explorer and Budgets give you the tools to track spending, identify cost drivers, and set up alerts before things get expensive.</p>
<p>This guide walks you through setting up both services for your team, from initial configuration to creating useful budgets and reports.</p>
<h2 id="h2-what-you39ll-need" class="group relative scroll-mt-24">
        <a href="#h2-what-you39ll-need" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What You&#39;ll Need
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-you39ll-need"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before you start, make sure you have:</p>
<ul>
<li>AWS account with billing access (IAM permissions for <code>ce:*</code> and <code>budgets:*</code>)</li>
<li>Root account access or an IAM user with appropriate permissions</li>
<li>A clear understanding of your team&#39;s cost structure and spending patterns</li>
</ul>
<h2 id="h2-understanding-aws-cost-explorer" class="group relative scroll-mt-24">
        <a href="#h2-understanding-aws-cost-explorer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding AWS Cost Explorer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-aws-cost-explorer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>AWS Cost Explorer is a visualization tool that lets you analyze your AWS costs and usage over time. You can view data at different levels of granularity, filter by service, region, or tags, and create custom reports.</p>
<p>The service is free to use for basic features, though there&#39;s a charge for more advanced API calls and saving custom reports.</p>
<h2 id="h2-enabling-aws-cost-explorer" class="group relative scroll-mt-24">
        <a href="#h2-enabling-aws-cost-explorer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Enabling AWS Cost Explorer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-enabling-aws-cost-explorer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Cost Explorer isn&#39;t enabled by default on all AWS accounts. Here&#39;s how to turn it on:</p>
<ol>
<li>Log into the AWS Console with an account that has billing permissions</li>
<li>Navigate to the <strong>Billing and Cost Management</strong> dashboard</li>
<li>In the left sidebar, click <strong>Cost Explorer</strong></li>
<li>Click <strong>Enable Cost Explorer</strong></li>
</ol>
<p>AWS will take up to 24 hours to prepare your cost data. You&#39;ll receive an email when it&#39;s ready. During this time, AWS analyzes your historical billing data (up to 12 months) and creates the initial dataset.</p>
<h2 id="h2-setting-up-cost-explorer-for-your-team" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-cost-explorer-for-your-team" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Cost Explorer for Your Team
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-cost-explorer-for-your-team"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once enabled, you&#39;ll want to configure Cost Explorer to provide useful insights for your team.</p>
<h3 id="h3-create-custom-cost-reports" class="group relative scroll-mt-24">
        <a href="#h3-create-custom-cost-reports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Create Custom Cost Reports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-create-custom-cost-reports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Start by creating reports that match how your team thinks about costs:</p>
<ol>
<li>Go to <strong>Cost Explorer</strong> in the Billing console</li>
<li>Click <strong>Create report</strong></li>
<li>Choose a report type:<ul>
<li><strong>Cost and usage</strong> - Shows spending over time</li>
<li><strong>Reservation utilization</strong> - Tracks Reserved Instance usage</li>
<li><strong>Reservation coverage</strong> - Shows how much of your usage is covered by reservations</li>
</ul>
</li>
</ol>
<p>For most teams, start with a cost and usage report.</p>
<h3 id="h3-filter-by-service-and-time-period" class="group relative scroll-mt-24">
        <a href="#h3-filter-by-service-and-time-period" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Filter by Service and Time Period
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-filter-by-service-and-time-period"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Configure the report to show relevant data:</p>
<ul>
<li><strong>Time range</strong>: Select the period you want to analyze (last month, last 3 months, etc.)</li>
<li><strong>Granularity</strong>: Choose daily, monthly, or hourly views</li>
<li><strong>Group by</strong>: Organize costs by Service, Region, or Linked Account</li>
<li><strong>Filters</strong>: Add filters for specific services, tags, or usage types</li>
</ul>
<h3 id="h3-use-tags-for-better-cost-allocation" class="group relative scroll-mt-24">
        <a href="#h3-use-tags-for-better-cost-allocation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use Tags for Better Cost Allocation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-tags-for-better-cost-allocation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Tags are crucial for tracking costs by team, project, or environment. Set up a tagging strategy:</p>
<ol>
<li>Define required tags (e.g., <code>Team</code>, <code>Project</code>, <code>Environment</code>)</li>
<li>Apply tags to all AWS resources</li>
<li>Enable <strong>Cost Allocation Tags</strong> in the Billing console:<ul>
<li>Go to <strong>Billing</strong> &gt; <strong>Cost Allocation Tags</strong></li>
<li>Activate the tags you want to track</li>
<li>Wait 24 hours for tag data to appear in Cost Explorer</li>
</ul>
</li>
</ol>
<p>Once activated, you can group costs by these tags in Cost Explorer.</p>
<h2 id="h2-creating-aws-budgets" class="group relative scroll-mt-24">
        <a href="#h2-creating-aws-budgets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Creating AWS Budgets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-creating-aws-budgets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>While Cost Explorer helps you analyze past spending, AWS Budgets lets you set spending limits and get alerts when you approach them.</p>
<h3 id="h3-access-aws-budgets" class="group relative scroll-mt-24">
        <a href="#h3-access-aws-budgets" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Access AWS Budgets
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-access-aws-budgets"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Navigate to <strong>AWS Budgets</strong> from the Billing dashboard:</p>
<ol>
<li>Open the <strong>Billing and Cost Management</strong> console</li>
<li>Click <strong>Budgets</strong> in the left sidebar</li>
<li>Click <strong>Create budget</strong></li>
</ol>
<h3 id="h3-choose-a-budget-type" class="group relative scroll-mt-24">
        <a href="#h3-choose-a-budget-type" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choose a Budget Type
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-choose-a-budget-type"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS offers several budget types:</p>
<ul>
<li><strong>Cost budget</strong> - Track spending against a dollar amount</li>
<li><strong>Usage budget</strong> - Monitor specific service usage (e.g., EC2 hours)</li>
<li><strong>Reservation budget</strong> - Track Reserved Instance or Savings Plans utilization</li>
<li><strong>Savings Plans budget</strong> - Monitor Savings Plans coverage</li>
</ul>
<p>For most teams, start with a <strong>Cost budget</strong>.</p>
<h3 id="h3-set-up-a-monthly-cost-budget" class="group relative scroll-mt-24">
        <a href="#h3-set-up-a-monthly-cost-budget" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Set Up a Monthly Cost Budget
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-set-up-a-monthly-cost-budget"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Here&#39;s how to create a basic monthly budget:</p>
<ol>
<li>Select <strong>Cost budget</strong> and click <strong>Next</strong></li>
<li>Give your budget a name (e.g., &quot;Production Environment Monthly Budget&quot;)</li>
<li>Set the budget period to <strong>Monthly</strong></li>
<li>Choose between:<ul>
<li><strong>Fixed budget</strong> - Same amount each month</li>
<li><strong>Planned budget</strong> - Different amounts for different months</li>
</ul>
</li>
</ol>
<p>For a fixed budget, enter your monthly spending limit.</p>
<h3 id="h3-add-filters-to-scope-your-budget" class="group relative scroll-mt-24">
        <a href="#h3-add-filters-to-scope-your-budget" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Add Filters to Scope Your Budget
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-add-filters-to-scope-your-budget"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Don&#39;t create one budget for everything. Instead, create specific budgets for different parts of your infrastructure:</p>
<p>Apply filters to narrow the budget scope:</p>
<ul>
<li><strong>Services</strong> - Limit to specific services like EC2, RDS, or S3</li>
<li><strong>Tags</strong> - Track budgets by team or project</li>
<li><strong>Linked accounts</strong> - Monitor spending in specific AWS accounts</li>
</ul>
<p>For example, create separate budgets for:</p>
<ul>
<li>Development environment</li>
<li>Production environment</li>
<li>Specific team or project</li>
<li>High-cost services (EC2, RDS, data transfer)</li>
</ul>
<h3 id="h3-configure-budget-alerts" class="group relative scroll-mt-24">
        <a href="#h3-configure-budget-alerts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Configure Budget Alerts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-configure-budget-alerts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Alerts are what make budgets useful. Set up notifications at different thresholds:</p>
<ol>
<li><p>In the <strong>Configure alerts</strong> section, add alert thresholds</p>
</li>
<li><p>Set alerts at useful percentages:</p>
<ul>
<li>50% - Early warning</li>
<li>80% - Action needed</li>
<li>100% - Budget exceeded</li>
<li>110% - Serious overspend</li>
</ul>
</li>
<li><p>Enter email addresses for notifications</p>
</li>
<li><p>You can also configure SNS topics for integration with Slack, PagerDuty, or other tools</p>
</li>
</ol>
<h2 id="h2-best-practices-for-team-cost-management" class="group relative scroll-mt-24">
        <a href="#h2-best-practices-for-team-cost-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices for Team Cost Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices-for-team-cost-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-create-budgets-at-multiple-levels" class="group relative scroll-mt-24">
        <a href="#h3-1-create-budgets-at-multiple-levels" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Create Budgets at Multiple Levels
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-create-budgets-at-multiple-levels"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Don&#39;t rely on a single company-wide budget. Create budgets for:</p>
<ul>
<li>Each environment (dev, staging, production)</li>
<li>Each team or department</li>
<li>Each major project</li>
<li>High-cost services individually</li>
</ul>
<p>This gives you better visibility into where money is going.</p>
<h3 id="h3-2-set-up-a-tagging-policy" class="group relative scroll-mt-24">
        <a href="#h3-2-set-up-a-tagging-policy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Set Up a Tagging Policy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-set-up-a-tagging-policy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Enforce tagging from day one:</p>
<ul>
<li>Define required tags before deploying resources</li>
<li>Use AWS Config Rules to enforce tagging compliance</li>
<li>Review untagged resources regularly</li>
<li>Automate tagging with Infrastructure as Code tools</li>
</ul>
<h3 id="h3-3-review-cost-explorer-weekly" class="group relative scroll-mt-24">
        <a href="#h3-3-review-cost-explorer-weekly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Review Cost Explorer Weekly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-review-cost-explorer-weekly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Make cost review a regular habit:</p>
<ul>
<li>Check Cost Explorer every Monday</li>
<li>Look for unexpected spikes or trends</li>
<li>Identify resources that can be optimized</li>
<li>Share findings with your team</li>
</ul>
<h3 id="h3-4-use-forecasting" class="group relative scroll-mt-24">
        <a href="#h3-4-use-forecasting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Use Forecasting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-use-forecasting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cost Explorer includes forecasting based on historical data:</p>
<ol>
<li>In Cost Explorer, select a time range</li>
<li>Click <strong>Forecast</strong> to see predicted costs</li>
<li>Use this to adjust budgets before overspending occurs</li>
</ol>
<h3 id="h3-5-set-up-cost-anomaly-detection" class="group relative scroll-mt-24">
        <a href="#h3-5-set-up-cost-anomaly-detection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Set Up Cost Anomaly Detection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-5-set-up-cost-anomaly-detection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS offers anomaly detection that uses machine learning to spot unusual spending:</p>
<ol>
<li>Go to <strong>Cost Anomaly Detection</strong> in the Billing console</li>
<li>Create a monitor for your services</li>
<li>Configure alerts for anomalies</li>
<li>Review detected anomalies weekly</li>
</ol>
<h2 id="h2-setting-up-budget-alerts-for-slack" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-budget-alerts-for-slack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Budget Alerts for Slack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-budget-alerts-for-slack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To get budget alerts in Slack:</p>
<ol>
<li>Create an SNS topic for budget notifications</li>
<li>Create a Lambda function that posts to Slack webhooks</li>
<li>Subscribe the Lambda to your SNS topic</li>
<li>Configure your budget to send alerts to the SNS topic</li>
</ol>
<p>This keeps your team informed in real-time when budgets are approaching limits.</p>
<h2 id="h2-granting-team-access-to-cost-data" class="group relative scroll-mt-24">
        <a href="#h2-granting-team-access-to-cost-data" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Granting Team Access to Cost Data
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-granting-team-access-to-cost-data"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Not everyone needs full billing access. Use IAM to grant appropriate permissions:</p>
<h3 id="h3-create-a-cost-explorer-read-only-role" class="group relative scroll-mt-24">
        <a href="#h3-create-a-cost-explorer-read-only-role" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Create a Cost Explorer Read-Only Role
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-create-a-cost-explorer-read-only-role"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;Version&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;2012-10-17&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;Statement&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;Effect&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Allow&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;Action&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
        <span class="hljs-string">&quot;ce:Get*&quot;</span><span class="hljs-punctuation">,</span>
        <span class="hljs-string">&quot;ce:Describe*&quot;</span><span class="hljs-punctuation">,</span>
        <span class="hljs-string">&quot;ce:List*&quot;</span>
      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;Resource&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;*&quot;</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>This lets team members view cost data without modifying budgets or accessing other billing information.</p>
<h3 id="h3-create-a-budget-manager-role" class="group relative scroll-mt-24">
        <a href="#h3-create-a-budget-manager-role" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Create a Budget Manager Role
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-create-a-budget-manager-role"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For team leads who need to manage budgets:</p>
<pre><code class="hljs language-json"><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;Version&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;2012-10-17&quot;</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">&quot;Statement&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;Effect&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Allow&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;Action&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
        <span class="hljs-string">&quot;budgets:*&quot;</span><span class="hljs-punctuation">,</span>
        <span class="hljs-string">&quot;ce:*&quot;</span>
      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;Resource&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;*&quot;</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><h2 id="h2-monitoring-long-term-trends" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-long-term-trends" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring Long-Term Trends
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-long-term-trends"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Beyond daily monitoring, track long-term trends:</p>
<ol>
<li>Export cost data to S3 for analysis</li>
<li>Create monthly cost reports</li>
<li>Compare month-over-month changes</li>
<li>Identify seasonal patterns</li>
<li>Plan for growth</li>
</ol>
<p>Use the <strong>Cost and Usage Report</strong> feature to export detailed billing data to S3, then analyze it with tools like Amazon Athena or QuickSight.</p>
<h2 id="h2-common-pitfalls-to-avoid" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls-to-avoid" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Pitfalls to Avoid
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls-to-avoid"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-not-acting-on-alerts" class="group relative scroll-mt-24">
        <a href="#h3-not-acting-on-alerts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Not Acting on Alerts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-not-acting-on-alerts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Budget alerts are only useful if you respond to them. When an alert fires:</p>
<ul>
<li>Investigate immediately</li>
<li>Identify the cause</li>
<li>Take corrective action</li>
<li>Document what happened</li>
</ul>
<h3 id="h3-setting-budgets-too-high" class="group relative scroll-mt-24">
        <a href="#h3-setting-budgets-too-high" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Budgets Too High
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-setting-budgets-too-high"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your budget is set too high, you won&#39;t get early warnings. Start conservative and adjust based on actual usage.</p>
<h3 id="h3-ignoring-unutilized-resources" class="group relative scroll-mt-24">
        <a href="#h3-ignoring-unutilized-resources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Ignoring Unutilized Resources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ignoring-unutilized-resources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cost Explorer shows you what you&#39;re paying for. Use it to find:</p>
<ul>
<li>Idle EC2 instances</li>
<li>Unused Elastic IPs</li>
<li>Old snapshots</li>
<li>Unattached EBS volumes</li>
</ul>
<p>Schedule regular cleanup sessions to remove these resources.</p>
<h3 id="h3-not-using-savings-plans-or-reserved-instances" class="group relative scroll-mt-24">
        <a href="#h3-not-using-savings-plans-or-reserved-instances" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Not Using Savings Plans or Reserved Instances
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-not-using-savings-plans-or-reserved-instances"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you have predictable workloads, Reserved Instances and Savings Plans can reduce costs by 30-70%. Use Cost Explorer&#39;s recommendations to identify opportunities.</p>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once you have Cost Explorer and Budgets configured:</p>
<ol>
<li>Set up regular cost review meetings</li>
<li>Create a runbook for responding to budget alerts</li>
<li>Implement automated responses to common cost issues</li>
<li>Track cost optimization efforts over time</li>
<li>Share cost data with stakeholders regularly</li>
</ol>
<p>Cost management is an ongoing process. The tools AWS provides give you visibility, but you need to act on the insights they provide.</p>
<p>Start with simple budgets and reports, then refine them as you learn more about your spending patterns. Your future self (and your finance team) will thank you.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Deployment Strategies: Blue-Green, Canary, and Rolling Deployments Explained]]></title>
      <link>https://devops-daily.com/posts/deployment-strategies-guide</link>
      <description><![CDATA[Learn how to deploy applications safely using blue-green, canary, and rolling deployment strategies. Understand the theory, trade-offs, and decision-making behind each approach.]]></description>
      <pubDate>Mon, 17 Nov 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/deployment-strategies-guide</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Deployment]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[CI/CD]]></category><category><![CDATA[Blue-Green Deployment]]></category><category><![CDATA[Canary Deployment]]></category><category><![CDATA[Rolling Deployment]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Docker]]></category>
      <content:encoded><![CDATA[<p>Deploying a new version of your application shouldn&#39;t feel like jumping off a cliff. Yet for many teams, every deployment brings anxiety: Will the new version work? What if users encounter bugs? How quickly can we roll back if something goes wrong?</p>
<p>The way you deploy your application matters just as much as what you deploy. Different deployment strategies offer varying levels of risk, speed, and resource requirements. Some let you switch between versions instantly, while others gradually introduce changes to minimize impact. Understanding these strategies helps you choose the right approach for your specific needs.</p>
<p><strong>TLDR</strong>: This guide covers three core deployment strategies. Blue-green deployments run two identical environments and switch traffic between them for instant rollbacks. Canary deployments gradually roll out changes to a small subset of users before full deployment. Rolling deployments update instances one at a time to maintain availability throughout the process. Each strategy has distinct trade-offs in terms of cost, complexity, and risk mitigation.</p>
<h2 id="h2-why-deployment-strategy-matters" class="group relative scroll-mt-24">
        <a href="#h2-why-deployment-strategy-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Deployment Strategy Matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-deployment-strategy-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your deployment strategy directly impacts your application&#39;s availability, your team&#39;s confidence in shipping changes, and your ability to recover from problems. A naive approach, replacing all running instances at once, leaves you vulnerable to widespread outages if the new version has issues.</p>
<p>Consider a typical scenario: you deploy a new version to production, and within minutes, users start reporting errors. With some deployment strategies, you can revert to the previous version in seconds. With others, you&#39;ll need to redeploy the old version and wait for it to roll out, potentially leaving users affected for 10-15 minutes or longer.</p>
<p>The right strategy also affects your testing approach. Some methods let you test new versions with real production traffic before committing fully. Others require more confidence in your pre-production testing because once you deploy, you&#39;re committed.</p>
<p>Beyond technical concerns, your deployment strategy influences team culture and development velocity. Teams with confidence in their deployment process ship more frequently. Those worried about deployments batch changes together, increasing risk and making issues harder to diagnose when they occur.</p>
<h2 id="h2-the-evolution-of-deployment-practices" class="group relative scroll-mt-24">
        <a href="#h2-the-evolution-of-deployment-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Evolution of Deployment Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-evolution-of-deployment-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Traditional deployment approaches involved scheduled maintenance windows, often late at night or on weekends. Operations teams would take systems offline, manually update software, run verification scripts, and bring everything back online. This worked when deployments happened monthly or quarterly, but modern software development demands faster iteration.</p>
<p>The rise of continuous delivery and DevOps culture pushed teams to deploy more frequently, sometimes dozens or hundreds of times per day. This shift required new approaches that maintained availability during deployments and provided quick recovery options when issues arose.</p>
<p>Cloud computing and container orchestration platforms like Kubernetes made sophisticated deployment strategies accessible to organizations of all sizes. What once required custom infrastructure and extensive automation now comes built into standard platforms.</p>
<h2 id="h2-blue-green-deployment" class="group relative scroll-mt-24">
        <a href="#h2-blue-green-deployment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Blue-Green Deployment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-blue-green-deployment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Blue-green deployment maintains two identical production environments, conventionally called &quot;blue&quot; and &quot;green.&quot; At any given time, only one environment serves live traffic while the other sits idle or runs the previous version.</p>
<p>When you&#39;re ready to deploy, you deploy the new version to the idle environment, run your tests there, and then switch the router or load balancer to direct traffic to the newly updated environment. The switch typically takes seconds, and if anything goes wrong, you can switch back just as quickly.</p>
<pre><code>┌─────────┐      Active       ┌──────────────┐
│  Users  │ ────────────────&gt; │ Blue (v1.0)  │
└─────────┘                   └──────────────┘

                              ┌──────────────┐
                              │ Green (idle) │
                              └──────────────┘
                                     │
                                     │ Deploy v2.0
                                     ▼
┌─────────┐                   ┌──────────────┐
│  Users  │                   │ Blue (v1.0)  │
└─────────┘                   └──────────────┘
     │
     │        Switch traffic
     └─────────────────────────&gt; ┌──────────────┐
                                 │ Green (v2.0) │ Active
                                 └──────────────┘
</code></pre><p>The beauty of blue-green deployment lies in its simplicity and safety. You&#39;re not mixing versions or gradually shifting traffic, you&#39;re making a clean, atomic switch. This makes rollback equally simple: just switch back to the previous environment.</p>
<h3 id="h3-when-blue-green-makes-sense" class="group relative scroll-mt-24">
        <a href="#h3-when-blue-green-makes-sense" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Blue-Green Makes Sense
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-blue-green-makes-sense"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Blue-green deployment shines in scenarios where you need absolute confidence in your ability to revert quickly. Financial services, healthcare systems, and other high-stakes applications often choose this approach because the cost of extended downtime exceeds the infrastructure cost of maintaining dual environments.</p>
<p>Regulatory compliance sometimes mandates clear separation between versions and the ability to demonstrate exactly when and how deployments occurred. Blue-green provides this audit trail naturally, you can see precisely when traffic switched from one environment to another.</p>
<p>Teams with complex integration testing requirements benefit from blue-green because they can run extensive tests against the new environment before any users see it. You can verify database migrations, test third-party integrations, and validate performance under load, all while production continues running normally on the blue environment.</p>
<h3 id="h3-the-cost-consideration" class="group relative scroll-mt-24">
        <a href="#h3-the-cost-consideration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Cost Consideration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-cost-consideration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The primary drawback of blue-green deployment is resource duplication. You&#39;re maintaining two complete production environments, essentially doubling your infrastructure costs during deployments. For applications with expensive infrastructure, persistent data stores, or large-scale deployments, this becomes prohibitively expensive.</p>
<p>Some organizations mitigate this by keeping the idle environment powered down or scaled to minimal capacity when not in use, then scaling it up for deployments. This reduces cost but increases deployment time and complexity.</p>
<h3 id="h3-handling-stateful-components" class="group relative scroll-mt-24">
        <a href="#h3-handling-stateful-components" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Handling Stateful Components
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-handling-stateful-components"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Databases and other stateful components complicate blue-green deployments. You can&#39;t simply duplicate a database and have both versions running with different data. Most teams use a shared database approach where both blue and green environments connect to the same database cluster.</p>
<p>This creates a constraint: your database schema changes must be backward compatible with the previous application version. If you need to rename a column, you can&#39;t do it in a single deployment. Instead, you add the new column, update the application to use both, deploy that version, migrate data, then remove the old column in a subsequent deployment.</p>
<p>Session state presents similar challenges. If user sessions are stored in-memory on application servers, switching from blue to green will log everyone out. Teams typically solve this by using external session storage like Redis or database-backed sessions that persist across environment switches.</p>
<h2 id="h2-canary-deployment" class="group relative scroll-mt-24">
        <a href="#h2-canary-deployment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Canary Deployment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-canary-deployment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Canary deployment takes its name from the &quot;canary in a coal mine&quot; concept. Instead of switching all traffic at once, you route a small percentage of traffic to the new version while keeping most users on the stable version. You monitor the canary closely for errors, performance issues, or other problems.</p>
<p>If the canary looks healthy, you gradually increase the percentage of traffic it receives. If problems appear, you route all traffic back to the stable version with minimal user impact.</p>
<pre><code>                    ┌──────────────────┐
        5% traffic  │   v2.0 (Canary)  │
       ┌──────────&gt; │   (1 instance)   │
       │            └──────────────────┘
       │
┌─────────┐
│  Users  │
└─────────┘
       │
       │            ┌──────────────────┐
       └──────────&gt; │      v1.0        │
        95% traffic │   (9 instances)  │
                    └──────────────────┘
</code></pre><p>Canary deployment provides a middle ground between caution and speed. You&#39;re exposing real users to new code, getting actual production data about how it performs, but limiting the blast radius if something goes wrong.</p>
<h3 id="h3-the-progressive-rollout-philosophy" class="group relative scroll-mt-24">
        <a href="#h3-the-progressive-rollout-philosophy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Progressive Rollout Philosophy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-progressive-rollout-philosophy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The fundamental principle behind canary deployments is progressive validation. You start with a small percentage, maybe 5-10% of traffic, and watch closely. If metrics remain stable for a defined period, perhaps 15-30 minutes, you increase to 25%. Then 50%. Then 75%. Finally 100%.</p>
<p>The percentages and timing depend on your traffic volume and risk tolerance. A high-traffic service might be comfortable with 10% representing millions of requests, giving statistically significant data quickly. A lower-traffic service might need higher percentages or longer observation periods to gather meaningful data.</p>
<p>Some teams use more sophisticated targeting for their canaries. Instead of random percentage-based routing, they might route traffic from internal users, beta testers, or specific customer segments to the canary first. This lets them test with friendly audiences who understand they might encounter issues.</p>
<p>Geographic routing provides another approach: deploy the canary in one region or data center while keeping others on the stable version. If problems occur, impact is limited to a specific geography.</p>
<h3 id="h3-monitoring-requirements" class="group relative scroll-mt-24">
        <a href="#h3-monitoring-requirements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring Requirements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monitoring-requirements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canary deployments demand excellent observability. You need to compare metrics between the stable version and canary in real-time. Key metrics include error rates, response times, resource utilization, and business-specific indicators like conversion rates or transaction success rates.</p>
<p>Automated decision-making based on these metrics takes canary deployments to the next level. If error rates on the canary exceed the stable version by a threshold, say 10%, automatically roll back. If response times degrade beyond acceptable limits, halt the rollout.</p>
<p>This requires not just monitoring tools, but careful thought about which metrics matter and what thresholds indicate problems versus normal variation. False positives that unnecessarily halt deployments slow down your development process. False negatives that miss real issues defeat the purpose of canary testing.</p>
<h3 id="h3-when-canary-deployment-excels" class="group relative scroll-mt-24">
        <a href="#h3-when-canary-deployment-excels" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Canary Deployment Excels
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-canary-deployment-excels"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canary deployment works best for user-facing applications where you can easily measure impact through metrics. E-commerce platforms, social media applications, and content delivery systems are ideal candidates because you can track engagement, errors, and performance in real-time.</p>
<p>High-traffic applications benefit particularly from canaries because even a small percentage represents significant volume for statistical analysis. If you&#39;re serving millions of requests per hour, 5% gives you hundreds of thousands of data points quickly.</p>
<p>Organizations with strong DevOps practices and good monitoring infrastructure get the most value from canaries. The strategy requires automation, observability, and often custom tooling to implement effectively.</p>
<h3 id="h3-the-complexity-trade-off" class="group relative scroll-mt-24">
        <a href="#h3-the-complexity-trade-off" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Complexity Trade-off
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-complexity-trade-off"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Canary deployment introduces significant complexity compared to simpler strategies. You need infrastructure that can route traffic based on percentages or other criteria. You need monitoring systems that can segment metrics by version. You need automation to manage the progressive rollout and potential rollback.</p>
<p>Many teams underestimate this complexity and struggle to implement canary deployments effectively. The infrastructure alone often requires a service mesh like Istio, Linkerd, or AWS App Mesh, each of which brings its own operational overhead.</p>
<h2 id="h2-rolling-deployment" class="group relative scroll-mt-24">
        <a href="#h2-rolling-deployment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Rolling Deployment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-rolling-deployment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Rolling deployment updates your application gradually, replacing old instances with new ones in phases. Unlike blue-green, you don&#39;t maintain a full duplicate environment. Unlike canary, you&#39;re not trying to test with a small subset, you&#39;re methodically replacing everything.</p>
<p>The process typically works like this: stop one instance, deploy the new version, start it, verify it&#39;s healthy, then move to the next instance. You continue until all instances run the new version.</p>
<pre><code>Initial state (v1.0):
┌────┐ ┌────┐ ┌────┐ ┌────┐

Step 1: Update first instance
┌────┐ ┌────┐ ┌────┐ ┌────┐
│v2.0│ │v1.0│ │v1.0│ │v1.0│

Step 2: Update second instance
┌────┐ ┌────┐ ┌────┐ ┌────┐
│v2.0│ │v2.0│ │v1.0│ │v1.0│

Step 3: Update third instance
┌────┐ ┌────┐ ┌────┐ ┌────┐
│v2.0│ │v2.0│ │v2.0│ │v1.0│

Final state (v2.0):
┌────┐ ┌────┐ ┌────┐ ┌────┐
│v2.0│ │v2.0│ │v2.0│ │v2.0│
</code></pre><p>Rolling deployment represents the default approach for most modern orchestration platforms. Kubernetes, ECS, and other container platforms implement rolling updates as their standard deployment mechanism.</p>
<h3 id="h3-resource-efficiency" class="group relative scroll-mt-24">
        <a href="#h3-resource-efficiency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resource Efficiency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-resource-efficiency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The primary advantage of rolling deployments is resource efficiency. At any given time, you&#39;re running approximately your normal instance count. If you have four instances and replace them one at a time, you briefly have five instances during each transition, but you never need double the infrastructure like blue-green requires.</p>
<p>This makes rolling deployments accessible to organizations of all sizes and budgets. You don&#39;t need to justify the cost of duplicate infrastructure, you just need standard orchestration tooling.</p>
<h3 id="h3-gradual-risk-distribution" class="group relative scroll-mt-24">
        <a href="#h3-gradual-risk-distribution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Gradual Risk Distribution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gradual-risk-distribution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rolling deployments spread risk across time. If the new version has a problem, you discover it when the first instance starts serving traffic. The rollout pauses (if you&#39;ve configured health checks properly), and only a fraction of your capacity is affected.</p>
<p>This gradual exposure provides some of the benefits of canary deployments without the infrastructure complexity. You&#39;re naturally testing with a subset of traffic as each instance comes online.</p>
<p>However, this protection only works if you have proper health checks and automated rollback mechanisms. Without them, a rolling deployment with a broken version will methodically replace all your healthy instances with broken ones.</p>
<h3 id="h3-the-backward-compatibility-requirement" class="group relative scroll-mt-24">
        <a href="#h3-the-backward-compatibility-requirement" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Backward Compatibility Requirement
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-backward-compatibility-requirement"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rolling deployments create a period where multiple versions run simultaneously. This means your new version must be compatible with the old version, at least during the deployment window.</p>
<p>For stateless web applications serving independent requests, this usually isn&#39;t a problem. Each request is handled by whatever instance receives it, and users don&#39;t notice which version they&#39;re hitting.</p>
<p>For applications with shared state, distributed systems, or inter-service communication, compatibility becomes critical. If version 2.0 changes a message queue format, API contract, or database schema in an incompatible way, version 1.0 instances will break as soon as the changes take effect.</p>
<p>This leads to the expand-contract pattern for database changes: first expand the schema to support both old and new formats, deploy the application update, then contract the schema to remove old format support. This requires three deployments instead of one but maintains compatibility throughout.</p>
<h3 id="h3-deployment-velocity" class="group relative scroll-mt-24">
        <a href="#h3-deployment-velocity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deployment Velocity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-deployment-velocity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rolling deployments naturally throttle your deployment speed based on instance count and health check timing. If you have 20 instances and update them one at a time with 30-second health checks, deployment takes at least 10 minutes.</p>
<p>You can adjust parameters to speed this up. Updating multiple instances simultaneously increases speed but also increases risk. Shorter health check periods deploy faster but might not catch problems that take time to manifest.</p>
<p>Many teams find rolling deployments too slow for their needs and move to blue-green or canary strategies for faster feedback loops and quicker rollbacks.</p>
<h2 id="h2-choosing-the-right-strategy" class="group relative scroll-mt-24">
        <a href="#h2-choosing-the-right-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choosing the Right Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-choosing-the-right-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>No single deployment strategy fits all situations. The right choice depends on your application characteristics, organizational constraints, and risk tolerance.</p>
<p>Consider blue-green deployment when:</p>
<ul>
<li>You need instant rollback capability</li>
<li>Regulatory or compliance requirements demand clear audit trails</li>
<li>Your application requires extensive integration testing before user exposure</li>
<li>Infrastructure costs are acceptable relative to business risk</li>
<li>You have complex database migrations that benefit from testing against production data before cutover</li>
</ul>
<p>Consider canary deployment when:</p>
<ul>
<li>You have high traffic volumes that provide quick statistical validation</li>
<li>Strong monitoring and observability infrastructure is in place</li>
<li>You need to validate changes with real production traffic</li>
<li>You can tolerate the infrastructure complexity of traffic routing</li>
<li>Your team has experience with progressive delivery practices</li>
</ul>
<p>Consider rolling deployment when:</p>
<ul>
<li>Resource efficiency is a priority</li>
<li>Your application handles backward compatibility well</li>
<li>You need a straightforward approach with good platform support</li>
<li>Deployment speed is less critical than simplicity</li>
<li>Your team prefers operational simplicity over deployment sophistication</li>
</ul>
<p>Many organizations use different strategies for different applications or even different deployment scenarios for the same application. Routine bug fixes might use rolling deployments, while major feature releases get canary treatment, and critical security patches use blue-green for maximum safety and rollback capability.</p>
<h2 id="h2-hybrid-approaches-and-advanced-patterns" class="group relative scroll-mt-24">
        <a href="#h2-hybrid-approaches-and-advanced-patterns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Hybrid Approaches and Advanced Patterns
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-hybrid-approaches-and-advanced-patterns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Experienced teams often combine strategies to get benefits of multiple approaches. A common pattern is blue-green deployment with canary testing: maintain blue and green environments, but when switching, first route a small percentage of traffic to green while most stays on blue. If metrics look good, complete the switch.</p>
<p>Feature flags decouple deployment from release. You can deploy new code using any strategy but keep features disabled, then gradually enable them through configuration changes. This separates the technical risk of deployment from the business risk of new features.</p>
<p>Shadow deployments route production traffic to a new version without returning responses to users. The shadow version processes requests and you monitor its behavior, but user experience comes entirely from the stable version. This validates new code with real workloads without any user impact.</p>
<p>Progressive delivery encompasses all these techniques, treating deployment as a continuous process of gradually increasing exposure while monitoring impact and maintaining rollback capability at every stage.</p>
<h2 id="h2-infrastructure-and-tooling-considerations" class="group relative scroll-mt-24">
        <a href="#h2-infrastructure-and-tooling-considerations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure and Tooling Considerations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-infrastructure-and-tooling-considerations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your deployment strategy choice is constrained by available infrastructure. Cloud platforms like AWS, Azure, and Google Cloud provide managed services that implement various strategies. AWS CodeDeploy, Azure DevOps, and Google Cloud Deploy offer blue-green and canary deployments with varying levels of automation.</p>
<p>Container orchestration platforms like Kubernetes provide rolling deployment primitives out of the box. Blue-green requires additional configuration but is straightforward. Canary deployments benefit from service mesh integration (Istio, Linkerd) for traffic management.</p>
<p>Serverless platforms like AWS Lambda, Azure Functions, and Google Cloud Functions have their own deployment models. Lambda aliases and versioning enable blue-green and canary patterns natively.</p>
<p>The right tooling reduces deployment strategy complexity significantly. Platforms like Spinnaker, Argo CD, and Flagger provide deployment automation specifically designed for sophisticated strategies.</p>
<h2 id="h2-monitoring-and-observability-essentials" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-and-observability-essentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring and Observability Essentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-and-observability-essentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Regardless of strategy, successful deployments depend on detecting problems quickly. At minimum, track error rates, response times, throughput, and resource utilization. Structure your monitoring to compare metrics between versions during deployments.</p>
<p>Distributed tracing helps correlate user experience with specific application versions when multiple versions run simultaneously. Each trace should include version information to enable filtering and comparison.</p>
<p>Synthetic monitoring and health checks validate that new instances actually work before routing traffic to them. These should test critical paths and dependencies, not just that the application starts.</p>
<p>Business metrics often catch problems that technical metrics miss. If your e-commerce platform&#39;s new version has a broken checkout flow, you might not see increased error rates, but you&#39;ll see dropped conversion rates.</p>
<h2 id="h2-testing-your-deployment-strategy" class="group relative scroll-mt-24">
        <a href="#h2-testing-your-deployment-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Testing Your Deployment Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-testing-your-deployment-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before implementing a new deployment strategy in production, test it thoroughly in lower environments. Create scenarios that simulate production conditions and practice deployment procedures, including rollbacks.</p>
<p>Chaos engineering helps validate that your deployment strategy works under adverse conditions. Deliberately inject failures during deployments and verify that health checks catch them, rollback procedures work, and user impact is minimal.</p>
<p>Document deployment procedures and runbooks. Even with extensive automation, teams need clear documentation for troubleshooting when things go wrong.</p>
<p>Time your deployments to understand how long each strategy takes. This helps you plan deployment windows and set realistic expectations with stakeholders.</p>
<h2 id="h2-common-pitfalls" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Pitfalls
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Session state tied to specific instances breaks during deployments when those instances are replaced. Use distributed session storage to avoid this issue.</p>
<p>Database connection pool sizing can cause problems when all instances suddenly reconnect after a deployment. Stagger deployments and size pools appropriately to avoid overwhelming your database.</p>
<p>Cache invalidation across versions requires careful planning. Version your cache keys to prevent new code from reading data cached by old code in an incompatible format.</p>
<p>External dependencies and API contracts must maintain compatibility during deployments. Coordinate changes across services or use versioned APIs to prevent breaking integrations.</p>
<p>Health checks that only verify application startup miss problems that manifest under load or over time. Include integration tests and realistic traffic patterns in health validation.</p>
<h2 id="h2-the-human-factor" class="group relative scroll-mt-24">
        <a href="#h2-the-human-factor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Human Factor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-human-factor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Deployment strategy affects team culture and development velocity. Teams with confidence in their deployment process ship more frequently and take more measured risks. Those worried about deployments batch changes together, increasing risk and making issues harder to debug.</p>
<p>Automation reduces human error but requires investment in tooling and processes. The most sophisticated deployment strategy fails if manual steps introduce mistakes.</p>
<p>Clear communication during deployments, especially for user-facing changes, reduces confusion and improves incident response. Many teams use ChatOps to make deployments visible to the entire organization.</p>
<p>Post-deployment reviews help teams learn from both successes and failures. Document what went well, what went wrong, and how to improve future deployments.</p>
<p>Deployment strategies give you control over how changes reach production and how quickly you can respond when things go wrong. Blue-green offers instant rollback at the cost of double infrastructure. Canary provides gradual risk mitigation through phased rollout. Rolling deployment balances resource efficiency with safety through sequential updates. Choose based on your specific requirements for cost, risk tolerance, and operational complexity. Start with rolling deployments for routine updates, and introduce blue-green or canary when specific situations justify the additional investment. The best strategy is the one that matches your technical constraints, organizational capabilities, and risk profile while enabling your team to ship confidently and frequently.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 47, 2025]]></title>
      <link>https://devops-daily.com/news/2025-week-47</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2025-week-47</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-kubernetes-cni-drivers" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-cni-drivers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes CNI Drivers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-cni-drivers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ever wondered how we just create a pod in Kubernetes and it gets an IP address magically, can communicate with each other, and host nodes without issues? Networking is not that simple, so how does all</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17210978/kubernetes-cni-drivers"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-from-agent-ai-to-agentic-ai-building-self-healing-kubernetes-clusters-that-learn" class="group relative scroll-mt-24">
        <a href="#h3-from-agent-ai-to-agentic-ai-building-self-healing-kubernetes-clusters-that-learn" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 From Agent AI to Agentic AI: Building Self-Healing Kubernetes Clusters That Learn
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-from-agent-ai-to-agentic-ai-building-self-healing-kubernetes-clusters-that-learn"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In Part 1: AI-Driven Kubernetes Diagnostics, we built an AI agent that analyzes Kubernetes pod failures and suggests fixes. It works when you&#39;re at your desk, ready to approve each action. For the pur</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17210867/self-healing-kubernetes-clusters-agentic-ai"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubernetes-multi-cluster-architecture-benefits-and-strategies" class="group relative scroll-mt-24">
        <a href="#h3-kubernetes-multi-cluster-architecture-benefits-and-strategies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kubernetes Multi-Cluster Architecture: Benefits And Strategies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubernetes-multi-cluster-architecture-benefits-and-strategies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes multi-cluster architectures transform how organizations approach container orchestration by distributing workloads across multiple independent clusters rather than relying on single-cluster</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/kubernetes-multi-cluster/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419" class="group relative scroll-mt-24">
        <a href="#h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DxOperator from DH2i is now certified for Red Hat OpenShift 4.19
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes has emerged as a powerful foundation for deploying and managing cloud-native applications, and Red Hat OpenShift operators are the best way to streamline this. DH2i&#39;s DxOperator, the SQL Se</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/dxoperator-dh2i-now-certified-red-hat-openshift-419"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-kubernetes-officially-included-in-sylva-15" class="group relative scroll-mt-24">
        <a href="#h3-canonical-kubernetes-officially-included-in-sylva-15" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical Kubernetes officially included in Sylva 1.5
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-kubernetes-officially-included-in-sylva-15"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sylva 1.5 becomes the first release to include Kubernetes 1.32, bringing the latest open source cloud-native capabilities to the European telecommunications industry With the launch of Sylva 1.5, Cano</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-kubernetes-officially-included-in-sylva-1-5"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-longhornctl-the-command-line-interface-for-suse-storage" class="group relative scroll-mt-24">
        <a href="#h3-introducing-longhornctl-the-command-line-interface-for-suse-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing longhornctl: The Command-Line Interface for SUSE Storage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-longhornctl-the-command-line-interface-for-suse-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Why a CLI? In the world of Kubernetes storage, reliability is essential — but flexibility and automation are what make a system shine. SUSE Storage already provides a powerful UI and a CRD-driven cont</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/introducing-longhornctl-the-command-line-interface-for-suse-storage/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon NA 2025 Recap: The Dawn of the AI Native Era | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore top insights from KubeCon NA 2025. From the Kubernetes AI Conformance Program to Adobe’s Agent Economy and Apple Containerization, discover how the community and Harness are defining the futur</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/kubecon-2025-recap"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-yaml-in-kubernetes-the-2026-automation-era" class="group relative scroll-mt-24">
        <a href="#h3-beyond-yaml-in-kubernetes-the-2026-automation-era" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond YAML in Kubernetes: The 2026 Automation Era
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-yaml-in-kubernetes-the-2026-automation-era"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes continues to evolve, powering not only applications but entire AI and ML systems across clouds, edges, and enterprises. By 2026, DevOps engineers, SREs, cloud engineers, and platform teams </p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/beyond-yaml-kubernetes-2026-automation-era/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ingress-nginx-retirement-what-you-need-to-know" class="group relative scroll-mt-24">
        <a href="#h3-ingress-nginx-retirement-what-you-need-to-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ingress NGINX Retirement: What You Need to Know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ingress-nginx-retirement-what-you-need-to-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To prioritize the safety and security of the ecosystem, Kubernetes SIG Network and the Security Response Committee are announcing the upcoming retirement of Ingress NGINX. Best-effort maintenance will</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-releases-fips-enabled-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-canonical-releases-fips-enabled-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical releases FIPS-enabled Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-releases-fips-enabled-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today at KubeCon North America, Canonical, the publisher of Ubuntu, released support to enable FIPS mode in its Kubernetes distribution, providing everything needed to create and manage a scalable clu</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-releases-fips-enabled-kubernetes"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-introducing-openshift-service-mesh-32-with-istios-ambient-mode" class="group relative scroll-mt-24">
        <a href="#h3-introducing-openshift-service-mesh-32-with-istios-ambient-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing OpenShift Service Mesh 3.2 with Istio’s ambient mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-openshift-service-mesh-32-with-istios-ambient-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are thrilled to announce the general availability of Red Hat OpenShift Service Mesh 3.2. This release includes the general availability of Istio’s ambient mode—a new way of deploying service mesh w</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/introducing-openshift-service-mesh-32-istios-ambient-mode"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-amazon-ecs-improves-service-availability-during-rolling-deployments" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ecs-improves-service-availability-during-rolling-deployments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon ECS improves Service Availability during Rolling deployments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ecs-improves-service-availability-during-rolling-deployments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Elastic Container Service (Amazon ECS) now includes enhancements that improve service availability during rolling deployments. These enhancements help maintain availability when new application</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-ecs-service-availability-rolling-deployments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-making-the-most-of-your-docker-hardened-images-trial-part-1" class="group relative scroll-mt-24">
        <a href="#h3-making-the-most-of-your-docker-hardened-images-trial-part-1" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Making the Most of Your Docker Hardened Images Trial – Part 1
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-making-the-most-of-your-docker-hardened-images-trial-part-1"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>First steps: Run your first secure, production-ready image Container base images form the foundation of your application security. When those foundations contain vulnerabilities, every service built o</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/making-the-most-of-your-docker-hardened-images-trial-part-1/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster" class="group relative scroll-mt-24">
        <a href="#h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Investigating the Great AI Productivity Divide: Why Are Some Developers 5x Faster?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI-powered developer tools claim to boost your productivity, doing everything from intelligent auto-complete to (<a href="https://openai.com/index/introducing-codex/">https://openai.com/index/introducing-codex/</a>). But the productivity gains users report h</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/ai-productivity-divide-developers-5x-faster/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp" class="group relative scroll-mt-24">
        <a href="#h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cagent Comes to Docker Desktop with Built-In IDE Support through ACP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Desktop now includes cagent bundled out of the box. This means developers can start building AI agents without a separate installation step. For those unfamiliar with cagent: it’s Docker’s open</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack" class="group relative scroll-mt-24">
        <a href="#h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 MCP Horror Stories: The WhatsApp Data Exfiltration Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is Part 5 of our MCP Horror Stories series, where we examine real-world security incidents that highlight the critical vulnerabilities threatening AI infrastructure and demonstrate how Docker’s c</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/mcp-horror-stories-whatsapp-data-exfiltration-issue/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images" class="group relative scroll-mt-24">
        <a href="#h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Improving modern software supply chain security: From AI models to container images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The software supply chain has evolved dramatically in recent years. Today&#39;s applications integrate countless components—from open source libraries and container images to AI models and training datase</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/securing-modern-software-supply-chain-ai-models-container-images"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-2025-opentelemetry-community-awards-winners" class="group relative scroll-mt-24">
        <a href="#h3-announcing-2025-opentelemetry-community-awards-winners" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing 2025 OpenTelemetry Community Awards Winners
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-2025-opentelemetry-community-awards-winners"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are excited to announce the winners of the second OpenTelemetry Community Awards! These awards recognize individuals who have made a notable impact to the OpenTelemetry project over the past year, </p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2025/community-awards-winners/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-openfga-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-openfga-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenFGA Becomes a CNCF Incubating Project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-openfga-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept OpenFGA as a CNCF incubating project. What is OpenFGA? OpenFGA is an authorization engine that addresses the challenge of implementing </p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/openfga-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-lima-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-lima-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Lima becomes a CNCF incubating project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lima-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept Lima as a CNCF incubating project. Lima enables secure, isolated environments for running cloud native and AI workloads. What is Lima? </p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/lima-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kserve-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-kserve-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KServe becomes a CNCF incubating project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kserve-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept KServe as a CNCF incubating project. KServe joins a growing ecosystem of technologies tackling real-world challenges at the edge of clo</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/kserve-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-four-shades-of-progressive-delivery-blog" class="group relative scroll-mt-24">
        <a href="#h3-four-shades-of-progressive-delivery-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Four Shades of Progressive Delivery | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-four-shades-of-progressive-delivery-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore the four shades of Progressive Delivery to improve release safety, limit risk, accelerate learning, and drive sustainable software delivery. | Blog</p>
<p><strong>📅 Feb 27, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/learn-the-four-shades-of-progressive-delivery"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-making-experimentation-work-for-product-managers" class="group relative scroll-mt-24">
        <a href="#h3-making-experimentation-work-for-product-managers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Making experimentation work for product managers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-making-experimentation-work-for-product-managers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LaunchDarkly Experimentation is the missing puzzle piece in the PM workflow.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/experimentation-for-product-managers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-run-experiments-on-high-traffic-websites-amp-apps" class="group relative scroll-mt-24">
        <a href="#h3-how-to-run-experiments-on-high-traffic-websites-amp-apps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to run experiments on high-traffic websites &amp; apps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-run-experiments-on-high-traffic-websites-amp-apps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Running experiments on high-traffic websites creates a unique paradox.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/high-traffic-experimentation-best-practices/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-mabs-are-not-just-fancy-ab-tests" class="group relative scroll-mt-24">
        <a href="#h3-why-mabs-are-not-just-fancy-ab-tests" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why MABs are not just fancy A/B tests
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-mabs-are-not-just-fancy-ab-tests"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Know when it’s smarter to let a bandit optimize in real time.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/mabs-not-just-fancy-ab-tests/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-rto-vs-rpo-key-differences-for-modern-disaster-recovery" class="group relative scroll-mt-24">
        <a href="#h3-rto-vs-rpo-key-differences-for-modern-disaster-recovery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 RTO vs RPO: Key differences for modern disaster recovery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-rto-vs-rpo-key-differences-for-modern-disaster-recovery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Recovery Time Objective (RTO) and Recovery Point Objective (RPO) are fundamental metrics.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/rto-vs-rpo/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-highlights-from-git-252" class="group relative scroll-mt-24">
        <a href="#h3-highlights-from-git-252" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Highlights from Git 2.52
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-highlights-from-git-252"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The open source Git project just released Git 2.52. Here is GitHub’s look at some of the most interesting features and changes introduced since last time. The post Highlights from Git 2.52 appeared fi</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/open-source/git/highlights-from-git-2-52/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitlab-engineer-how-i-improved-my-onboarding-experience-with-ai" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-engineer-how-i-improved-my-onboarding-experience-with-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitLab engineer: How I improved my onboarding experience with AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-engineer-how-i-improved-my-onboarding-experience-with-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting a new job is exciting, and overwhelming. New teammates, new tools, and, in GitLab’s case, a lot of documentation. Six weeks ago, I joined GitLab’s Growth team as a fullstack engineer. Anyone </p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/gitlab-engineer-how-i-improved-my-onboarding-experience-with-ai/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-whats-new-in-git-2520" class="group relative scroll-mt-24">
        <a href="#h3-whats-new-in-git-2520" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 What’s new in Git 2.52.0?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-whats-new-in-git-2520"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Git project recently released Git 2.52. After a relatively short 8-week release cycle for 2.51, due to summer in the Northern Hemisphere, this release is back to the usual 12-week cycle. Let’s loo</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/whats-new-in-git-2-52-0/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-behind-the-queues-how-kueue-reimagines-scheduling-in-red-hat-openshift" class="group relative scroll-mt-24">
        <a href="#h3-behind-the-queues-how-kueue-reimagines-scheduling-in-red-hat-openshift" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Behind the queues: How Kueue reimagines scheduling in Red Hat OpenShift
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-behind-the-queues-how-kueue-reimagines-scheduling-in-red-hat-openshift"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In a modern cluster, the hardest problem isn’t running workloads—it&#39;s sharing resources fairly. Red Hat OpenShift clusters are seeing a surge of AI-accelerated workloads, from GPU-intensive training j</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/behind-queues-how-kueue-reimagines-scheduling-red-hat-openshift"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files" class="group relative scroll-mt-24">
        <a href="#h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Unlocking the full power of Copilot code review: Master your instructions files
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover practical tips, examples, and best practices for writing effective instructions files. Whether you’re new or experienced, you’ll find something to level up your code reviews. The post Unlocki</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-survey-sees-ai-coding-creating-need-for-more-software-engineers" class="group relative scroll-mt-24">
        <a href="#h3-survey-sees-ai-coding-creating-need-for-more-software-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Survey Sees AI Coding Creating Need for More Software Engineers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-survey-sees-ai-coding-creating-need-for-more-software-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A GitLab survey of 3,266 DevSecOps professionals shows AI is boosting code creation but increasing the need for skilled engineers, compliance challenges and human oversight.</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/survey-sees-ai-coding-creating-need-for-more-software-engineers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-availability-report-october-2025" class="group relative scroll-mt-24">
        <a href="#h3-github-availability-report-october-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Availability Report: October 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-availability-report-october-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In October, we experienced four incidents that resulted in degraded performance across GitHub services. The post GitHub Availability Report: October 2025 appeared first on The GitHub Blog.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/github-availability-report-october-2025/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-iac" class="group relative scroll-mt-24">
        <a href="#h2-iac" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🏗️ IaC
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iac"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-aws-transform-automates-landing-zone-acceleration-network-configuration" class="group relative scroll-mt-24">
        <a href="#h3-aws-transform-automates-landing-zone-acceleration-network-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Transform Automates Landing Zone Acceleration Network Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-transform-automates-landing-zone-acceleration-network-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Transform for VMware now allows customers to automatically generate network configurations that can be directly imported into the Landing Zone Accelerator on AWS solution (LZA). Building on AWS Tr</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/aws-transform-vmware-landingzone-configuration-generation"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automating-chaos-engineering-with-terraform-blog" class="group relative scroll-mt-24">
        <a href="#h3-automating-chaos-engineering-with-terraform-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automating Chaos Engineering with Terraform | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automating-chaos-engineering-with-terraform-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Automate chaos engineering with Terraform: version-controlled infrastructure, service discovery, security governance, and ChaosHub management for resilient systems. | Blog</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/automating-chaos-engineering-with-terraform"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-the-declarative-configuration-journey-why-it-took-5-years-to-ignore-health-check-endpoints-in-tracing" class="group relative scroll-mt-24">
        <a href="#h3-the-declarative-configuration-journey-why-it-took-5-years-to-ignore-health-check-endpoints-in-tracing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Declarative configuration journey: Why it took 5 years to ignore health check endpoints in tracing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-declarative-configuration-journey-why-it-took-5-years-to-ignore-health-check-endpoints-in-tracing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>One of the most persistent and popular feature requests for Java OpenTelemetry over the past couple of years has been the ability to efficiently drop spans for health check endpoints – or any other lo</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2025/declarative-config/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-agentic-ai-in-observability-building-resilient-accountable-it-systems" class="group relative scroll-mt-24">
        <a href="#h3-agentic-ai-in-observability-building-resilient-accountable-it-systems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Agentic AI in Observability: Building Resilient, Accountable IT Systems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-agentic-ai-in-observability-building-resilient-accountable-it-systems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As enterprise IT systems grow more complex, maintaining visibility, performance and resilience across distributed architectures has never been more critical. The post Agentic AI in Observability: Buil</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/agentic-ai-in-observability-building-resilient-accountable-it-systems/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-accelerate-your-autonomous-it-operations-journey-with-dynatrace-and-servicenow-integrations" class="group relative scroll-mt-24">
        <a href="#h3-accelerate-your-autonomous-it-operations-journey-with-dynatrace-and-servicenow-integrations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Accelerate your autonomous IT operations journey with Dynatrace and ServiceNow integrations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-accelerate-your-autonomous-it-operations-journey-with-dynatrace-and-servicenow-integrations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For many teams, the path to automation starts with connecting data and workflows across platforms. Dynatrace and ServiceNow make that possible. Through a growing set of integrations, customers can sea</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Dynatrace Blog</strong></p>
<p><a href="https://www.dynatrace.com/news/blog/accelerate-your-autonomous-it-operations-journey-with-dynatrace-and-servicenow-integrations/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-relic-successfully-completes-type-2-soc-1-attestation" class="group relative scroll-mt-24">
        <a href="#h3-new-relic-successfully-completes-type-2-soc-1-attestation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Relic successfully completes Type 2 SOC 1 attestation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-relic-successfully-completes-type-2-soc-1-attestation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>New Relic achieves Type 2 SOC 1 attestation with ISAE 3402 attestation.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/nerdlog/new-relic-successfully-completes-type-2-soc-1-attestation"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-relic-named-a-leader-in-idc-marketscape-for-worldwide-observability-report" class="group relative scroll-mt-24">
        <a href="#h3-new-relic-named-a-leader-in-idc-marketscape-for-worldwide-observability-report" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Relic Named a Leader in IDC MarketScape for Worldwide Observability Report
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-relic-named-a-leader-in-idc-marketscape-for-worldwide-observability-report"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover why New Relic was recognized as a Leader in the inaugural IDC MarketScape: Worldwide Observability 2025 Vendor Assessment (#US53004325, November 2025). Learn about our platform&#39;s key strength</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/how-to-relic/new-relic-a-leader-in-the-idcs-worldwide-observability-report"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sentry-has-a-bold-new-look" class="group relative scroll-mt-24">
        <a href="#h3-sentry-has-a-bold-new-look" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Sentry has a bold new look
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sentry-has-a-bold-new-look"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As you may have noticed, Sentry just got a major glow-up. For too long our product looked like boring enterprise software, while our brand screamed bold and irr...</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/sentry-has-a-bold-new-look/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace" class="group relative scroll-mt-24">
        <a href="#h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing agreement EventBridge notifications for AWS Marketplace
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Marketplace now delivers purchase agreement events via Amazon EventBridge, transitioning from our Amazon Simple Notification Service (SNS) notifications for Software as a Service and Professional </p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/agreement-eventbridge-notifications-aws-marketplace"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs" class="group relative scroll-mt-24">
        <a href="#h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A Star Wars dashboard deep dive: How to build your next visualization in less than 12 parsecs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hello there! Earlier this year I created a Star Wars-themed dashboard featuring all sorts of fun visualizations from a galaxy far, far away, including a map of the Kessel Run, an overview of the Mille</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/14/a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how" class="group relative scroll-mt-24">
        <a href="#h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Continuous profiling for native code: Understanding the what, why, and how
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s hard to imagine deploying any application today without observability. Logs have been around since the early days of mainframes, metrics became standard with early Unix systems, and tracing gaine</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/14/continuous-profiling-for-native-code-understanding-the-what-why-and-how/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters" class="group relative scroll-mt-24">
        <a href="#h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI’s biggest impact isn’t cranking out more code: Why DevEx matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developer experience (DevEx) is more than ping pong tables and free snacks. It’s the foundation for building great software. As AI reshapes the way we code, the real opportunity lies not in writing co</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Dynatrace Blog</strong></p>
<p><a href="https://www.dynatrace.com/news/blog/ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability" class="group relative scroll-mt-24">
        <a href="#h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Understand, diagnose, and optimize SQL queries: Introducing Grafana Cloud Database Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s widely acknowledged that most application performance problems stem not from the application itself, but from the underlying database. Slow or inefficient database queries are often the primary c</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/13/understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters" class="group relative scroll-mt-24">
        <a href="#h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GPU Observability: Get Deeper Insights into Your Droplets and DOKS Clusters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re introducing a new set of basic observability metrics for all GPU Droplets and DOKS clusters, giving you a powerful, simple way to monitor and optimize your AI workloads. Why GPU Observability Ma</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/now-available-gpu-doks-observability"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mark-your-calendars-qodana-events-in-november" class="group relative scroll-mt-24">
        <a href="#h3-mark-your-calendars-qodana-events-in-november" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Mark Your Calendars! Qodana Events in November
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mark-your-calendars-qodana-events-in-november"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>As 2025 starts racing to a close, the JetBrains Qodana team is ending the year with a series of events dedicated to what matters most in modern software development: secure workflows, high-quality cod</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/qodana/2025/11/mark-your-calendars-qodana-events-in-november/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-alliander-modernises-its-electricity-grid-with-red-hat-for-long-term-reliability-in-balance-with-rapid-innovation" class="group relative scroll-mt-24">
        <a href="#h3-alliander-modernises-its-electricity-grid-with-red-hat-for-long-term-reliability-in-balance-with-rapid-innovation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Alliander modernises its electricity grid with Red Hat for long-term reliability in balance with rapid innovation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-alliander-modernises-its-electricity-grid-with-red-hat-for-long-term-reliability-in-balance-with-rapid-innovation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Long‑lasting transformers and short‑lifecycle IT are not a natural pairing. Utilities run process installations designed to last for decades, while the control software ages far faster. Deferring repl</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/alliander-modernises-its-electricity-grid-red-hat-long-term-reliability-balance-rapid-innovation"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-power-of-a-multi-layered-security-strategy" class="group relative scroll-mt-24">
        <a href="#h3-the-power-of-a-multi-layered-security-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Power of a Multi-Layered Security Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-power-of-a-multi-layered-security-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Over time, tool sprawl has become the default state of enterprise security. Many organizations run dozens of security products across cloud workloads, on-premises systems and edge deployments. Various</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-power-of-a-multi-layered-security-strategy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond" class="group relative scroll-mt-24">
        <a href="#h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A CISO’s preview of open source and cybersecurity trends in 2026 and beyond
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Where is open source going next? What’s in store for open source in the coming years, particularly in relation to security? Here’s a CISO’s reflection on the state of open source, and the trends that </p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository" class="group relative scroll-mt-24">
        <a href="#h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Managing SUSE Workloads in AWS – When do you need a private repository?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This article applies to customers running on-demand/PAYG instances in AWS deployed from AMIs published by SUSE. The need to patch. Patching is an important part of managing any OS infrastructure with </p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/managing-suse-workloads-in-aws-when-do-you-need-a-private-repository/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on" class="group relative scroll-mt-24">
        <a href="#h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical expands total coverage for Ubuntu LTS releases to 15 years with Legacy add-on
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ubuntu Pro now supports LTS releases for up to 15 years through the Legacy add-on. More security, more stability, and greater control over upgrade timelines for enterprises.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam" class="group relative scroll-mt-24">
        <a href="#h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automated Package-Publication Incident IndonesianFoods in the NPM Ecosystem Linked to Crypto Reward-Farming Scam
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In November 2025, a large-scale surge of package publications on the NPM registry with similar structures and naming patterns was discovered. Understand the details of the incident.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/automated-package-publication-incident-indonesianfoods/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-postgresql-181-177-1611-1515-1420-and-1323-released" class="group relative scroll-mt-24">
        <a href="#h3-postgresql-181-177-1611-1515-1420-and-1323-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PostgreSQL 18.1, 17.7, 16.11, 15.15, 14.20, and 13.23 Released!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-postgresql-181-177-1611-1515-1420-and-1323-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The PostgreSQL Global Development Group has released an update to all supported versions of PostgreSQL, including 18.1, 17.7, 16.11, 15.15, 14.20, and 13.23. This release fixes 2 security vulnerabilit</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/postgresql-181-177-1611-1515-1420-and-1323-released-3171/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study" class="group relative scroll-mt-24">
        <a href="#h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Organizations Achieve 288% ROI with The Snyk AI Trust Platform, According to New Forrester TEI Study
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Organizations achieve 288% ROI with the Snyk AI Trust Platform, according to a new Forrester TEI study. Improve developer productivity, enhance security, and consolidate AppSec tools with Snyk.</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/forrester-tei-snyk-roi/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-ai-visibility-problem-when-speed-outruns-security-blog" class="group relative scroll-mt-24">
        <a href="#h3-the-ai-visibility-problem-when-speed-outruns-security-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The AI Visibility Problem: When Speed Outruns Security | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-ai-visibility-problem-when-speed-outruns-security-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Harness surveyed 500 security practitioners and decision makers responsible for securing AI-native applications from the United States, UK, Germany, and France to share findings on global security pra</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/the-ai-visibility-problem-when-speed-outruns-security"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-by-design-the-future-of-threat-modeling-for-ai-native-applications" class="group relative scroll-mt-24">
        <a href="#h3-secure-by-design-the-future-of-threat-modeling-for-ai-native-applications" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure by Design: The Future of Threat Modeling for AI-Native Applications
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-by-design-the-future-of-threat-modeling-for-ai-native-applications"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore how Snyk&#39;s Evo Threat Modeling Agent automates and contextualizes security for AI-native applications, addressing prompt injection, data exfiltration, data poisoning, and agentic vulnerabiliti</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/future-threat-modeling-ai-native-apps/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-database-features-in-rider" class="group relative scroll-mt-24">
        <a href="#h3-database-features-in-rider" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Database Features in Rider
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-database-features-in-rider"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Rider provides robust support for working with databases directly within the IDE – powered by DataGrip! Rider and DataGrip smooth development workflows by allowing you to manage and interact with a va</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/dotnet/2025/11/17/database-features-in-rider/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-pgadmin-4-v910-released" class="group relative scroll-mt-24">
        <a href="#h3-pgadmin-4-v910-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 pgAdmin 4 v9.10 Released
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-pgadmin-4-v910-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The pgAdmin Development Team is pleased to announce pgAdmin 4 version 9.10. This release of pgAdmin 4 includes 5 new features and 12 bug fixes/housekeeping changes. For more details, please see the re</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/pgadmin-4-v910-released-3173/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-call-for-new-members-postgresql-community-code-of-conduct-committee" class="group relative scroll-mt-24">
        <a href="#h3-call-for-new-members-postgresql-community-code-of-conduct-committee" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Call for new members PostgreSQL Community Code of Conduct Committee
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-call-for-new-members-postgresql-community-code-of-conduct-committee"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This message is being sent from the Community Code of Conduct Committee, with the approval of the Core Team. As part of the Community CoC policy, the Committee membership is to be refreshed on an annu</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/call-for-new-members-postgresql-community-code-of-conduct-committee-3174/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redisvl-momentum-amp-whats-next" class="group relative scroll-mt-24">
        <a href="#h3-redisvl-momentum-amp-whats-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 RedisVL momentum &amp; what’s next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redisvl-momentum-amp-whats-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Redis, a longtime favorite of developers, is seeing unprecedented velocity around AI use cases. RedisVL, initially a simple convenience layer for vector search, has quickly evolved into the AI-native </p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redisvl-momentum-and-whats-next/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-cost-of-multitenancy" class="group relative scroll-mt-24">
        <a href="#h3-the-cost-of-multitenancy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Cost of Multitenancy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-cost-of-multitenancy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DynamoDB and ScyllaDB share many similarities, but DynamoDB is a multi-tenant database, while ScyllaDB is single-tenant The recent DynamoDB outage is a stark reminder that even the most reliable and m</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2025/11/13/the-cost-of-multitenancy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cache-vs-database-how-architecture-impacts-performance" class="group relative scroll-mt-24">
        <a href="#h3-cache-vs-database-how-architecture-impacts-performance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cache vs. Database: How Architecture Impacts Performance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cache-vs-database-how-architecture-impacts-performance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Lessons learned comparing Memcached with ScyllaDB</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2025/11/12/cache-vs-database-how-architecture-impacts-performance/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-postgresql-conference-germany-2026" class="group relative scroll-mt-24">
        <a href="#h3-postgresql-conference-germany-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PostgreSQL Conference Germany 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-postgresql-conference-germany-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>PGConf.de 2026 is the next iteration of the PostgreSQL Conference Germany. It takes place in the &quot;Haus der Technik&quot; in Essen. <a href="https://2026.pgconf.de/">https://2026.pgconf.de/</a> The conference will take place on April 21 &amp; 22, 2</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/postgresql-conference-germany-2026-3170/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-methodical-approach-to-agent-evaluation-building-a-robust-quality-gate" class="group relative scroll-mt-24">
        <a href="#h3-a-methodical-approach-to-agent-evaluation-building-a-robust-quality-gate" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A methodical approach to agent evaluation: Building a robust quality gate
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-methodical-approach-to-agent-evaluation-building-a-robust-quality-gate"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI is shifting from single-response models to complex, multi-step agents that can reason, use tools, and complete sophisticated tasks. This increased capability means you need an evolution in how you </p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/developers-practitioners/a-methodical-approach-to-agent-evaluation/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-dhivaru-and-two-new-connectivity-hubs" class="group relative scroll-mt-24">
        <a href="#h3-introducing-dhivaru-and-two-new-connectivity-hubs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing Dhivaru and two new connectivity hubs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-dhivaru-and-two-new-connectivity-hubs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today, we’re announcing Dhivaru, a new Trans-Indian Ocean subsea cable system that will connect the Maldives, Christmas Island and Oman. This investment will build on the Australia Connect initiative,</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/networking/introducing-dhivaru-new-subsea-cable/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-celebrating-our-2025-google-cloud-partner-all-stars" class="group relative scroll-mt-24">
        <a href="#h3-celebrating-our-2025-google-cloud-partner-all-stars" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Celebrating our 2025 Google Cloud Partner All-stars
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-celebrating-our-2025-google-cloud-partner-all-stars"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At Google Cloud, we have the honor of partnering with some of the most brilliant and inventive individuals across the world. Each year, the Google Cloud Partner All-stars program honors these remarkab</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/partners/2025-google-cloud-partner-all-stars/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-frontline-intelligence-analysis-of-unc1549-ttps-custom-tools-and-malware-targeting-the-aerospace-and-defense-ecosystem" class="group relative scroll-mt-24">
        <a href="#h3-frontline-intelligence-analysis-of-unc1549-ttps-custom-tools-and-malware-targeting-the-aerospace-and-defense-ecosystem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Frontline Intelligence: Analysis of UNC1549 TTPs, Custom Tools, and Malware Targeting the Aerospace and Defense Ecosystem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-frontline-intelligence-analysis-of-unc1549-ttps-custom-tools-and-malware-targeting-the-aerospace-and-defense-ecosystem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Written by: Mohamed El-Banna, Daniel Lee, Mike Stokkel, Josh Goddard Overview Last year, Mandiant published a blog post highlighting suspected Iran-nexus espionage activity targeting the aerospace, av</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/topics/threat-intelligence/analysis-of-unc1549-ttps-targeting-aerospace-defense/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-replicate-is-joining-cloudflare" class="group relative scroll-mt-24">
        <a href="#h3-replicate-is-joining-cloudflare" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Replicate is joining Cloudflare
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-replicate-is-joining-cloudflare"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Bringing Replicate’s tools into Cloudflare will continue to make our Workers Platform the best place on the Internet to build and deploy any AI or agentic workflow.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/replicate-joins-cloudflare/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-google-code-wiki-aims-to-solve-documentations-oldest-problem" class="group relative scroll-mt-24">
        <a href="#h3-google-code-wiki-aims-to-solve-documentations-oldest-problem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Google Code Wiki Aims to Solve Documentation’s Oldest Problem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-google-code-wiki-aims-to-solve-documentations-oldest-problem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Google introduces Code Wiki, an AI-powered platform that automatically generates and maintains documentation for code repositories. With Gemini integration, live diagrams, and interactive code-aware c</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/google-code-wiki-aims-to-solve-documentations-oldest-problem/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-sre-weekly-issue-497" class="group relative scroll-mt-24">
        <a href="#h3-sre-weekly-issue-497" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 SRE Weekly Issue #497
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-sre-weekly-issue-497"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>View on sreweekly.com A message from our sponsor, Costory: You didn’t sign up to do FinOps.Costory automatically explains why your cloud costs change, and reports it straight to Slack.Built for SREs w</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 SRE Weekly</strong></p>
<p><a href="https://sreweekly.com/sre-weekly-issue-497/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm" class="group relative scroll-mt-24">
        <a href="#h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Lambda announces Provisioned Mode for SQS event source mapping (ESM)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Lambda announces Provisioned Mode for SQS event-source-mappings (ESMs) that subscribe to Amazon SQS, a feature that allows you to optimize the throughput of your SQS ESM by provisioning event poll</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/aws-lambda-provisioned-mode-sqs-esm"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-finding-the-grain-of-sand-in-a-heap-of-salt" class="group relative scroll-mt-24">
        <a href="#h3-finding-the-grain-of-sand-in-a-heap-of-salt" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Finding the grain of sand in a heap of Salt
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-finding-the-grain-of-sand-in-a-heap-of-salt"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We explore the fundamentals of Saltstack and how we use it at Cloudflare. We also explain how we built the infrastructure to reduce release delays due to Salt failures on the edge by over 5%.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/finding-the-grain-of-sand-in-a-heap-of-salt/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-kroah-hartman-linux-kernel-maintainer-on-cra-open-source-impact" class="group relative scroll-mt-24">
        <a href="#h3-kroah-hartman-linux-kernel-maintainer-on-cra-open-source-impact" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Kroah-Hartman: Linux Kernel Maintainer on CRA Open Source Impact
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kroah-hartman-linux-kernel-maintainer-on-cra-open-source-impact"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>ATLANTA — Technology companies and developers are finally realizing that they’ll need to deal with the European Union’s (EU) Cyber The post Kroah-Hartman: Linux Kernel Maintainer on CRA Open Source Im</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/kroah-hartman-linux-kernel-maintainer-on-cra-open-source-impact/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-devops-for-genai-toronto-edition-hackathon-unlocking-new-ai-market-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-devops-for-genai-toronto-edition-hackathon-unlocking-new-ai-market-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DevOps for GenAI Toronto Edition Hackathon: Unlocking New AI Market Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-devops-for-genai-toronto-edition-hackathon-unlocking-new-ai-market-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Toronto’s vibrant tech community is abuzz as the DevOps for GenAI Hackathon returns with John Willis, this time with ambitious new themes that reflect both global trends and uniquely Canadian innovati</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/devops-for-genai-toronto-edition-hackathon-unlocking-new-ai-market-opportunities/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-keeping-gpus-ticking-like-clockwork" class="group relative scroll-mt-24">
        <a href="#h3-keeping-gpus-ticking-like-clockwork" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keeping GPUs Ticking Like Clockwork
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keeping-gpus-ticking-like-clockwork"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For this week’s episode of The New Stack Agents, I sat down with Suresh Vasudevan, the CEO of Clockwork. I’ve The post Keeping GPUs Ticking Like Clockwork appeared first on The New Stack.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/keeping-gpus-ticking-like-clockwork/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-microsoft-evp-embrace-ai-agents-to-rewire-business-processes-now" class="group relative scroll-mt-24">
        <a href="#h3-microsoft-evp-embrace-ai-agents-to-rewire-business-processes-now" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Microsoft EVP: Embrace AI Agents to Rewire Business Processes Now
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microsoft-evp-embrace-ai-agents-to-rewire-business-processes-now"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In September, Rajesh Jha the executive VP overseeing Microsoft’s AI-powered assistant Copilot appeared on Microsoft’s “Worklab” podcast, to discuss the The post Microsoft EVP: Embrace AI Agents to Rew</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/microsoft-evp-embrace-ai-agents-to-rewire-business-processes-now/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-prepare-for-the-future-of-programming" class="group relative scroll-mt-24">
        <a href="#h3-how-to-prepare-for-the-future-of-programming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Prepare for the Future of Programming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-prepare-for-the-future-of-programming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Start a start-up? Scratch that. Call your mom. Go back to school? Don’t go back to school. Learn to code? Don’t learn to code. Forget coding. Only prompt engineering matters now. Actually, I heard it’</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/education/2025/11/17/how-to-prepare-for-the-future-of-programming/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-five-great-devops-job-opportunities" class="group relative scroll-mt-24">
        <a href="#h3-five-great-devops-job-opportunities" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Five Great DevOps Job Opportunities
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-five-great-devops-job-opportunities"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DevOps.com is now providing a weekly DevOps jobs report through which opportunities for DevOps professionals will be highlighted as part of an effort to better serve our audience. Our goal in these ch</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/five-great-devops-job-opportunities-164/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-why-diffusion-models-could-change-developer-workflows-in-2026" class="group relative scroll-mt-24">
        <a href="#h3-why-diffusion-models-could-change-developer-workflows-in-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Why Diffusion Models Could Change Developer Workflows in 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-diffusion-models-could-change-developer-workflows-in-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developers spend much of their time editing, refactoring, and debugging rather than producing entirely new code. Code creation tends to involve non-sequential back-and-forth refinement rather than typ</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/ai/2025/11/why-diffusion-models-could-change-developer-workflows-in-2026/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-unlock-enterprise-grade-virtualization-at-the-edge-with-two-node-red-hat-openshift-and-arctera39s-infoscale" class="group relative scroll-mt-24">
        <a href="#h3-unlock-enterprise-grade-virtualization-at-the-edge-with-two-node-red-hat-openshift-and-arctera39s-infoscale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Unlock enterprise-grade virtualization at the edge with two-node Red Hat OpenShift and Arctera&#39;s InfoScale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-unlock-enterprise-grade-virtualization-at-the-edge-with-two-node-red-hat-openshift-and-arctera39s-infoscale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>From remote offices to factory floors, organizations are extending their virtualization capabilities to where data is generated and consumed, unlocking new opportunities for innovation and efficiency.</p>
<p><strong>📅 Nov 17, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/unlock-enterprise-grade-virtualization-edge-two-node-red-hat-openshift-and-arcteras-infoscale"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-data-ingestion-using-logstash-postgresql-to-elasticsearch" class="group relative scroll-mt-24">
        <a href="#h3-data-ingestion-using-logstash-postgresql-to-elasticsearch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Data Ingestion Using Logstash: PostgreSQL to Elasticsearch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-data-ingestion-using-logstash-postgresql-to-elasticsearch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What Is Logstash? Logstash is an open-source data processing pipeline from Elastic. It is being used to ingest, transform, and ship data to different sources, including Elasticsearch, Kafka, flat file</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17209521/logstash-postgresql-to-elasticsearch"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-sdlc-transformation-part-1-where-to-start" class="group relative scroll-mt-24">
        <a href="#h3-ai-sdlc-transformation-part-1-where-to-start" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI SDLC Transformation, Part 1: Where to Start?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-sdlc-transformation-part-1-where-to-start"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most engineering leaders today feel the same tension: everyone talks about “AI in software delivery,” but few know where to start. Should you launch pilots? Train teams? Complement Jira or some other </p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17208779/ai-sdlc-transformation-where-to-start"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-october-2025-version-1106" class="group relative scroll-mt-24">
        <a href="#h3-october-2025-version-1106" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 October 2025 (version 1.106)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-october-2025-version-1106"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what is new in the Visual Studio Code October 2025 Release (1.106). Read the full article</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_106"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 46, 2025]]></title>
      <link>https://devops-daily.com/news/2025-week-46</link>
      <description><![CDATA[⚡ Curated updates from Kubernetes, cloud native tooling, CI/CD, IaC, observability, and security - handpicked for DevOps professionals!]]></description>
      <pubDate>Sun, 16 Nov 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2025-week-46</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>📌 <strong>Handpicked by DevOps Daily</strong> - Your weekly dose of curated DevOps news and updates!</p>
</blockquote>
<hr>
<h2 id="h2-kubernetes" class="group relative scroll-mt-24">
        <a href="#h2-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ⚓ Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419" class="group relative scroll-mt-24">
        <a href="#h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 DxOperator from DH2i is now certified for Red Hat OpenShift 4.19
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dxoperator-from-dh2i-is-now-certified-for-red-hat-openshift-419"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes has emerged as a powerful foundation for deploying and managing cloud-native applications, and Red Hat OpenShift operators are the best way to streamline this. DH2i&#39;s DxOperator, the SQL Se</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/dxoperator-dh2i-now-certified-red-hat-openshift-419"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-red-hat-advanced-cluster-security-49-security-built-with-your-workflows-in-mind" class="group relative scroll-mt-24">
        <a href="#h3-red-hat-advanced-cluster-security-49-security-built-with-your-workflows-in-mind" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Red Hat Advanced Cluster Security 4.9: Security built with your workflows in mind
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-red-hat-advanced-cluster-security-49-security-built-with-your-workflows-in-mind"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’ve been dedicated to advancing Red Hat Advanced Cluster Security for Kubernetes in line with the rapid evolution of Kubernetes security. With version 4.9, we’re introducing key integrations and upd</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/red-hat-advanced-cluster-security-kubernetes-49-release"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-kubernetes-officially-included-in-sylva-15" class="group relative scroll-mt-24">
        <a href="#h3-canonical-kubernetes-officially-included-in-sylva-15" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical Kubernetes officially included in Sylva 1.5
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-kubernetes-officially-included-in-sylva-15"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sylva 1.5 becomes the first release to include Kubernetes 1.32, bringing the latest open source cloud-native capabilities to the European telecommunications industry With the launch of Sylva 1.5, Cano</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-kubernetes-officially-included-in-sylva-1-5"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-introducing-longhornctl-the-command-line-interface-for-suse-storage" class="group relative scroll-mt-24">
        <a href="#h3-introducing-longhornctl-the-command-line-interface-for-suse-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Introducing longhornctl: The Command-Line Interface for SUSE Storage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-introducing-longhornctl-the-command-line-interface-for-suse-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Why a CLI? In the world of Kubernetes storage, reliability is essential - but flexibility and automation are what make a system shine. SUSE Storage already provides a powerful UI and a CRD-driven cont</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/introducing-longhornctl-the-command-line-interface-for-suse-storage/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon NA 2025 Recap: The Dawn of the AI Native Era | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-na-2025-recap-the-dawn-of-the-ai-native-era-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore top insights from KubeCon NA 2025. From the Kubernetes AI Conformance Program to Adobe’s Agent Economy and Apple Containerization, discover how the community and Harness are defining the futur</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/kubecon-2025-recap"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-beyond-yaml-in-kubernetes-the-2026-automation-era" class="group relative scroll-mt-24">
        <a href="#h3-beyond-yaml-in-kubernetes-the-2026-automation-era" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Beyond YAML in Kubernetes: The 2026 Automation Era
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-beyond-yaml-in-kubernetes-the-2026-automation-era"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Kubernetes continues to evolve, powering not only applications but entire AI and ML systems across clouds, edges, and enterprises. By 2026, DevOps engineers, SREs, cloud engineers, and platform teams</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Pulumi Blog</strong></p>
<p><a href="https://www.pulumi.com/blog/beyond-yaml-kubernetes-2026-automation-era/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ingress-nginx-retirement-what-you-need-to-know" class="group relative scroll-mt-24">
        <a href="#h3-ingress-nginx-retirement-what-you-need-to-know" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Ingress NGINX Retirement: What You Need to Know
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ingress-nginx-retirement-what-you-need-to-know"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To prioritize the safety and security of the ecosystem, Kubernetes SIG Network and the Security Response Committee are announcing the upcoming retirement of Ingress NGINX. Best-effort maintenance will</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-releases-fips-enabled-kubernetes" class="group relative scroll-mt-24">
        <a href="#h3-canonical-releases-fips-enabled-kubernetes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical releases FIPS-enabled Kubernetes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-releases-fips-enabled-kubernetes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Today at KubeCon North America, Canonical, the publisher of Ubuntu, released support to enable FIPS mode in its Kubernetes distribution, providing everything needed to create and manage a scalable clu</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-releases-fips-enabled-kubernetes"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kubecon-2025-redefining-kubernetes-and-ai-observability" class="group relative scroll-mt-24">
        <a href="#h3-kubecon-2025-redefining-kubernetes-and-ai-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KubeCon 2025: Redefining Kubernetes and AI observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kubecon-2025-redefining-kubernetes-and-ai-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover how New Relic delivers one-step Kubernetes and AI observability with OpenTelemetry, eBPF, and AI-powered insights-live at KubeCon 2025.</p>
<p><strong>📅 Nov 10, 2025</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/how-to-relic/kubecon-2025-redefining-kubernetes-and-ai-observability"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-secure-ai-agent-deployment-to-gke" class="group relative scroll-mt-24">
        <a href="#h3-secure-ai-agent-deployment-to-gke" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Secure AI agent deployment to GKE
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-secure-ai-agent-deployment-to-gke"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Building AI agents is exciting, but deploying them securely to production shouldn&#39;t be complicated. In this tutorial, you will learn how GitLab&#39;s native Google Cloud integration makes it straightforwa</p>
<p><strong>📅 Nov 10, 2025</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/secure-ai-agent-deployment-to-gke/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-the-2025-steering-committee-election-results" class="group relative scroll-mt-24">
        <a href="#h3-announcing-the-2025-steering-committee-election-results" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing the 2025 Steering Committee Election Results
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-the-2025-steering-committee-election-results"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The 2025 Steering Committee Election is now complete. The Kubernetes Steering Committee consists of 7 seats, 4 of which were up for election in 2025. Incoming committee members serve a term of 2 years</p>
<p><strong>📅 Nov 9, 2025</strong> • <strong>📰 Kubernetes Blog</strong></p>
<p><a href="https://kubernetes.io/blog/2025/11/09/steering-committee-results-2025/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cloud-native" class="group relative scroll-mt-24">
        <a href="#h2-cloud-native" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ☁️ Cloud Native
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloud-native"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-amazon-ecs-improves-service-availability-during-rolling-deployments" class="group relative scroll-mt-24">
        <a href="#h3-amazon-ecs-improves-service-availability-during-rolling-deployments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Amazon ECS improves Service Availability during Rolling deployments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-amazon-ecs-improves-service-availability-during-rolling-deployments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Amazon Elastic Container Service (Amazon ECS) now includes enhancements that improve service availability during rolling deployments. These enhancements help maintain availability when new application</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-ecs-service-availability-rolling-deployments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-making-the-most-of-your-docker-hardened-images-trial-part-1" class="group relative scroll-mt-24">
        <a href="#h3-making-the-most-of-your-docker-hardened-images-trial-part-1" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Making the Most of Your Docker Hardened Images Trial – Part 1
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-making-the-most-of-your-docker-hardened-images-trial-part-1"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>First steps: Run your first secure, production-ready image Container base images form the foundation of your application security. When those foundations contain vulnerabilities, every service built o</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/making-the-most-of-your-docker-hardened-images-trial-part-1/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster" class="group relative scroll-mt-24">
        <a href="#h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Investigating the Great AI Productivity Divide: Why Are Some Developers 5x Faster?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-investigating-the-great-ai-productivity-divide-why-are-some-developers-5x-faster"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AI-powered developer tools claim to boost your productivity, doing everything from intelligent auto-complete to (<a href="https://openai.com/index/introducing-codex/">https://openai.com/index/introducing-codex/</a>). But the productivity gains users report h</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/ai-productivity-divide-developers-5x-faster/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-when-memory-overflows-too-many-applicationcontexts-in-spring-integration-tests" class="group relative scroll-mt-24">
        <a href="#h3-when-memory-overflows-too-many-applicationcontexts-in-spring-integration-tests" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 When Memory Overflows: Too Many ApplicationContexts in Spring Integration Tests
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-when-memory-overflows-too-many-applicationcontexts-in-spring-integration-tests"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In Spring, the ApplicationContext is the central container object that manages all beans (i.e., components, services, repositories, etc.). Its tasks include reading the configuration (Java Config, XML</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17208746/spring-integration-tests-many-applicationcontexts"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp" class="group relative scroll-mt-24">
        <a href="#h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cagent Comes to Docker Desktop with Built-In IDE Support through ACP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Desktop now includes cagent bundled out of the box. This means developers can start building AI agents without a separate installation step. For those unfamiliar with cagent: it’s Docker’s open</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/cagent-comes-to-docker-desktop-with-built-in-ide-support-through-acp/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack" class="group relative scroll-mt-24">
        <a href="#h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 MCP Horror Stories: The WhatsApp Data Exfiltration Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-mcp-horror-stories-the-whatsapp-data-exfiltration-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is Part 5 of our MCP Horror Stories series, where we examine real-world security incidents that highlight the critical vulnerabilities threatening AI infrastructure and demonstrate how Docker’s c</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Docker Blog</strong></p>
<p><a href="https://www.docker.com/blog/mcp-horror-stories-whatsapp-data-exfiltration-issue/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images" class="group relative scroll-mt-24">
        <a href="#h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Improving modern software supply chain security: From AI models to container images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-improving-modern-software-supply-chain-security-from-ai-models-to-container-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The software supply chain has evolved dramatically in recent years. Today&#39;s applications integrate countless components-from open source libraries and container images to AI models and training datase</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 OpenShift Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/securing-modern-software-supply-chain-ai-models-container-images"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-announcing-2025-opentelemetry-community-awards-winners" class="group relative scroll-mt-24">
        <a href="#h3-announcing-2025-opentelemetry-community-awards-winners" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing 2025 OpenTelemetry Community Awards Winners
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-2025-opentelemetry-community-awards-winners"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We are excited to announce the winners of the second OpenTelemetry Community Awards! These awards recognize individuals who have made a notable impact to the OpenTelemetry project over the past year,</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 OpenTelemetry Blog</strong></p>
<p><a href="https://opentelemetry.io/blog/2025/community-awards-winners/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-openfga-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-openfga-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 OpenFGA Becomes a CNCF Incubating Project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-openfga-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept OpenFGA as a CNCF incubating project. What is OpenFGA? OpenFGA is an authorization engine that addresses the challenge of implementing</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/openfga-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-lima-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-lima-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Lima becomes a CNCF incubating project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lima-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept Lima as a CNCF incubating project. Lima enables secure, isolated environments for running cloud native and AI workloads. What is Lima?</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/lima-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-kserve-becomes-a-cncf-incubating-project" class="group relative scroll-mt-24">
        <a href="#h3-kserve-becomes-a-cncf-incubating-project" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 KServe becomes a CNCF incubating project
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kserve-becomes-a-cncf-incubating-project"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CNCF Technical Oversight Committee (TOC) has voted to accept KServe as a CNCF incubating project. KServe joins a growing ecosystem of technologies tackling real-world challenges at the edge of clo</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 CNCF Blog</strong></p>
<p><a href="https://www.cncf.io/blog/2025/11/11/kserve-becomes-a-cncf-incubating-project/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-total-cost-of-ownership-and-unit-costs-creating-a-strategic-lens-for-it-investment-decisions" class="group relative scroll-mt-24">
        <a href="#h3-total-cost-of-ownership-and-unit-costs-creating-a-strategic-lens-for-it-investment-decisions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Total Cost of Ownership and Unit Costs: Creating a Strategic Lens for IT Investment Decisions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-total-cost-of-ownership-and-unit-costs-creating-a-strategic-lens-for-it-investment-decisions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Expanding technology portfolios make it harder than ever for organizations to understand and optimize the value of their IT investments. Despite the promise of digital transformation, many initiatives</p>
<p><strong>📅 Nov 10, 2025</strong> • <strong>📰 Kubecost Blog</strong></p>
<p><a href="https://www.apptio.com/blog/total-cost-of-ownership-and-unit-costs-creating-a-strategic-lens-for-it-investment-decisions/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-cicd" class="group relative scroll-mt-24">
        <a href="#h2-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔄 CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-four-shades-of-progressive-delivery-blog" class="group relative scroll-mt-24">
        <a href="#h3-four-shades-of-progressive-delivery-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Four Shades of Progressive Delivery | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-four-shades-of-progressive-delivery-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explore the four shades of Progressive Delivery to improve release safety, limit risk, accelerate learning, and drive sustainable software delivery. | Blog</p>
<p><strong>📅 Feb 27, 2026</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/learn-the-four-shades-of-progressive-delivery"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="group relative scroll-mt-24">
        <a href="#h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Delivering adaptive AI with LaunchDarkly and Snowflake Cortex
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-delivering-adaptive-ai-with-launchdarkly-and-snowflake-cortex"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>LaunchDarkly &amp; Snowflake enable AI delivery with real-time config and runtime safety.</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/adaptive-ai-launchdarkly-snowflake-cortex/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-new-experimentation-tools-for-pms-who-test-learn-and-move-fast" class="group relative scroll-mt-24">
        <a href="#h3-new-experimentation-tools-for-pms-who-test-learn-and-move-fast" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 New Experimentation tools for PMs who test, learn, and move fast
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-new-experimentation-tools-for-pms-who-test-learn-and-move-fast"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Test, learn, and ship faster with new Experimentation tools.</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/new-experimentation-tools-for-pms/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-less-clutter-more-control-manage-flag-permissions-at-scale" class="group relative scroll-mt-24">
        <a href="#h3-less-clutter-more-control-manage-flag-permissions-at-scale" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Less clutter, more control: Manage flag permissions at scale
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-less-clutter-more-control-manage-flag-permissions-at-scale"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Preset Role Scope and Flag Lifecycle Settings can help you issue cleaner, faster releases.</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/preset-role-scope-flag-lifecycle-settings/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files" class="group relative scroll-mt-24">
        <a href="#h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Unlocking the full power of Copilot code review: Master your instructions files
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Discover practical tips, examples, and best practices for writing effective instructions files. Whether you’re new or experienced, you’ll find something to level up your code reviews. The post Unlocki</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/ai-and-ml/unlocking-the-full-power-of-copilot-code-review-master-your-instructions-files/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-survey-sees-ai-coding-creating-need-for-more-software-engineers" class="group relative scroll-mt-24">
        <a href="#h3-survey-sees-ai-coding-creating-need-for-more-software-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Survey Sees AI Coding Creating Need for More Software Engineers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-survey-sees-ai-coding-creating-need-for-more-software-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A GitLab survey of 3,266 DevSecOps professionals shows AI is boosting code creation but increasing the need for skilled engineers, compliance challenges and human oversight.</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/survey-sees-ai-coding-creating-need-for-more-software-engineers/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-github-availability-report-october-2025" class="group relative scroll-mt-24">
        <a href="#h3-github-availability-report-october-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitHub Availability Report: October 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-availability-report-october-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In October, we experienced four incidents that resulted in degraded performance across GitHub services. The post GitHub Availability Report: October 2025 appeared first on The GitHub Blog.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/company-news/github-availability-report-october-2025/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-typescript-python-and-the-ai-feedback-loop-changing-software-development" class="group relative scroll-mt-24">
        <a href="#h3-typescript-python-and-the-ai-feedback-loop-changing-software-development" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 TypeScript, Python, and the AI feedback loop changing software development
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-typescript-python-and-the-ai-feedback-loop-changing-software-development"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>An interview with the leader of GitHub Next, Idan Gazit, on TypeScript, Python, and what comes next. The post TypeScript, Python, and the AI feedback loop changing software development appeared first</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 GitHub Blog</strong></p>
<p><a href="https://github.blog/news-insights/octoverse/typescript-python-and-the-ai-feedback-loop-changing-software-development/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-achieve-cmmc-level-2-with-gitlab-dedicated-for-government" class="group relative scroll-mt-24">
        <a href="#h3-achieve-cmmc-level-2-with-gitlab-dedicated-for-government" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Achieve CMMC Level 2 with GitLab Dedicated for Government
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-achieve-cmmc-level-2-with-gitlab-dedicated-for-government"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For Defense Industrial Base (DIB) companies, the U.S. Department of Defense&#39;s release of the Cybersecurity Maturity Model Certification (CMMC) Final Rule and new guidance on “FedRAMP equivalency” has</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 GitLab Blog</strong></p>
<p><a href="https://about.gitlab.com/blog/achieve-cmmc-level-2-fast-with-gitlab-dedicated-for-government/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-observability" class="group relative scroll-mt-24">
        <a href="#h2-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📊 Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace" class="group relative scroll-mt-24">
        <a href="#h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Announcing agreement EventBridge notifications for AWS Marketplace
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-announcing-agreement-eventbridge-notifications-for-aws-marketplace"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Marketplace now delivers purchase agreement events via Amazon EventBridge, transitioning from our Amazon Simple Notification Service (SNS) notifications for Software as a Service and Professional</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/agreement-eventbridge-notifications-aws-marketplace"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gitops-in-the-wild-scaling-continuous-delivery-in-hybrid-cloud-environments" class="group relative scroll-mt-24">
        <a href="#h3-gitops-in-the-wild-scaling-continuous-delivery-in-hybrid-cloud-environments" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GitOps in the Wild: Scaling Continuous Delivery in Hybrid Cloud Environments
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitops-in-the-wild-scaling-continuous-delivery-in-hybrid-cloud-environments"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>A deep dive into scaling GitOps for hybrid and multi-cloud environments, exploring architecture, governance, security, observability and real-world enterprise practices.</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/gitops-in-the-wild-scaling-continuous-delivery-in-hybrid-cloud-environments/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs" class="group relative scroll-mt-24">
        <a href="#h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A Star Wars dashboard deep dive: How to build your next visualization in less than 12 parsecs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Hello there! Earlier this year I created a Star Wars-themed dashboard featuring all sorts of fun visualizations from a galaxy far, far away, including a map of the Kessel Run, an overview of the Mille</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/14/a-star-wars-dashboard-deep-dive-how-to-build-your-next-visualization-in-less-than-12-parsecs/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how" class="group relative scroll-mt-24">
        <a href="#h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Continuous profiling for native code: Understanding the what, why, and how
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-continuous-profiling-for-native-code-understanding-the-what-why-and-how"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s hard to imagine deploying any application today without observability. Logs have been around since the early days of mainframes, metrics became standard with early Unix systems, and tracing gaine</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/14/continuous-profiling-for-native-code-understanding-the-what-why-and-how/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-chronosphere-adds-ai-remediation-guidance-to-observability-platform" class="group relative scroll-mt-24">
        <a href="#h3-chronosphere-adds-ai-remediation-guidance-to-observability-platform" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Chronosphere Adds AI Remediation Guidance to Observability Platform
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-chronosphere-adds-ai-remediation-guidance-to-observability-platform"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Chronosphere this week previewed artificial intelligence (AI) capabilities that are embedded into its observability platform that, in addition to helping identify the root cause of an issue, also prov</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/chronosphere-adds-ai-remediation-guidance-to-observability-platform/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters" class="group relative scroll-mt-24">
        <a href="#h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI’s biggest impact isn’t cranking out more code: Why DevEx matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Developer experience (DevEx) is more than ping pong tables and free snacks. It’s the foundation for building great software. As AI reshapes the way we code, the real opportunity lies not in writing co</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Dynatrace Blog</strong></p>
<p><a href="https://www.dynatrace.com/news/blog/ais-biggest-impact-isnt-cranking-out-more-code-why-devex-matters/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability" class="group relative scroll-mt-24">
        <a href="#h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Understand, diagnose, and optimize SQL queries: Introducing Grafana Cloud Database Observability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>It’s widely acknowledged that most application performance problems stem not from the application itself, but from the underlying database. Slow or inefficient database queries are often the primary c</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/13/understand-diagnose-and-optimize-sql-queries-introducing-grafana-cloud-database-observability/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters" class="group relative scroll-mt-24">
        <a href="#h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 GPU Observability: Get Deeper Insights into Your Droplets and DOKS Clusters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gpu-observability-get-deeper-insights-into-your-droplets-and-doks-clusters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We’re introducing a new set of basic observability metrics for all GPU Droplets and DOKS clusters, giving you a powerful, simple way to monitor and optimize your AI workloads. Why GPU Observability Ma</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 DigitalOcean Blog</strong></p>
<p><a href="https://www.digitalocean.com/blog/now-available-gpu-doks-observability"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-modern-retailers-playbook-for-in-store-it" class="group relative scroll-mt-24">
        <a href="#h3-the-modern-retailers-playbook-for-in-store-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Modern Retailer’s Playbook for In-Store IT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-modern-retailers-playbook-for-in-store-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Unlock flawless in-store experiences with intelligent observability. Prevent POS issues, optimize inventory, and delight customers with real-time insights for retail IT.</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 New Relic Blog</strong></p>
<p><a href="https://newrelic.com/blog/how-to-relic/the-modern-retailers-playbook-for-in-store-it"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-performance-testing-best-practices-how-to-prepare-for-peak-demand-with-grafana-cloud-k6" class="group relative scroll-mt-24">
        <a href="#h3-performance-testing-best-practices-how-to-prepare-for-peak-demand-with-grafana-cloud-k6" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Performance testing best practices: How to prepare for peak demand with Grafana Cloud k6
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-performance-testing-best-practices-how-to-prepare-for-peak-demand-with-grafana-cloud-k6"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For many organizations, periods of high customer activity are anything but relaxing. Events like Black Friday, product launches, or major sales can put intense strain on the software and infrastructur</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Grafana Blog</strong></p>
<p><a href="https://grafana.com/blog/2025/11/12/performance-testing-best-practices-how-to-prepare-for-peak-demand-with-grafana-cloud-k6/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-using-sentry-logs-to-debug-a-dynamic-sampling-issue" class="group relative scroll-mt-24">
        <a href="#h3-using-sentry-logs-to-debug-a-dynamic-sampling-issue" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Using Sentry Logs to Debug a Dynamic Sampling Issue
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-sentry-logs-to-debug-a-dynamic-sampling-issue"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Some of the team at Sentry spent this past quarter fixing bugs, more than 800 to be exact. Among them was a complex issue causing transaction spikes in our own ...</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Sentry Blog</strong></p>
<p><a href="https://blog.sentry.io/using-sentry-logs-to-debug-a-dynamic-sampling-issue/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-monitoring-website-changes-with-zabbix-browser-item" class="group relative scroll-mt-24">
        <a href="#h3-monitoring-website-changes-with-zabbix-browser-item" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Monitoring Website Changes with Zabbix Browser Item
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-monitoring-website-changes-with-zabbix-browser-item"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In today’s digital era, information is an asset and most of it is obtained from websites. The ability to… The post Monitoring Website Changes with Zabbix Browser Item appeared first on Zabbix Blog.</p>
<p><strong>📅 Nov 11, 2025</strong> • <strong>📰 Zabbix Blog</strong></p>
<p><a href="https://blog.zabbix.com/monitoring-website-changes-with-zabbix-browser-item/31684/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-security" class="group relative scroll-mt-24">
        <a href="#h2-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🔐 Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="group relative scroll-mt-24">
        <a href="#h3-threats-making-wavs-incident-response-to-a-cryptomining-attack" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Threats Making WAVs - Incident Response to a Cryptomining Attack
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-threats-making-wavs-incident-response-to-a-cryptomining-attack"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Guardicore security researchers describe and uncover a full analysis of a cryptomining attack, which hid a cryptominer inside WAV files. The report includes the full attack vectors, from detection, in</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/threats-making-wavs-incident-reponse-cryptomining-attack"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-dissecting-flock-safety-the-cameras-tracking-you-are-a-security-nightmare" class="group relative scroll-mt-24">
        <a href="#h3-dissecting-flock-safety-the-cameras-tracking-you-are-a-security-nightmare" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Dissecting Flock Safety: The Cameras Tracking You Are a Security Nightmare
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dissecting-flock-safety-the-cameras-tracking-you-are-a-security-nightmare"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Comments</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Hacker News</strong></p>
<p><a href="https://www.youtube.com/watch?v=uB0gr7Fh6lY"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-portmaster-an-open-source-firewall-for-the-desktop" class="group relative scroll-mt-24">
        <a href="#h3-portmaster-an-open-source-firewall-for-the-desktop" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Portmaster, an Open Source Firewall for the Desktop
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-portmaster-an-open-source-firewall-for-the-desktop"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Security should never be taken for granted, no matter what operating system you use. You might have a Linux desktop The post Portmaster, an Open Source Firewall for the Desktop appeared first on The N</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/portmaster-an-open-source-firewall-for-the-desktop/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-power-of-a-multi-layered-security-strategy" class="group relative scroll-mt-24">
        <a href="#h3-the-power-of-a-multi-layered-security-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Power of a Multi-Layered Security Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-power-of-a-multi-layered-security-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Over time, tool sprawl has become the default state of enterprise security. Many organizations run dozens of security products across cloud workloads, on-premises systems and edge deployments. Various</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/the-power-of-a-multi-layered-security-strategy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-iot-services-expand-support-of-vpc-endpoints-and-ipv6-connectivity" class="group relative scroll-mt-24">
        <a href="#h3-aws-iot-services-expand-support-of-vpc-endpoints-and-ipv6-connectivity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS IoT Services expand support of VPC endpoints and IPv6 connectivity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-iot-services-expand-support-of-vpc-endpoints-and-ipv6-connectivity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS IoT Core, AWS IoT Device Management, and AWS IoT Device Defender have expanded support for Virtual Private Cloud (VPC) endpoints and IPv6. Developers can now use AWS PrivateLink to establish VPC e</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/aws-iot-services-vpc-endpoints-ipv6-connectivity"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond" class="group relative scroll-mt-24">
        <a href="#h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A CISO’s preview of open source and cybersecurity trends in 2026 and beyond
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Where is open source going next? What’s in store for open source in the coming years, particularly in relation to security? Here’s a CISO’s reflection on the state of open source, and the trends that</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/a-cisos-preview-of-open-source-and-cybersecurity-trends-in-2026-and-beyond"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository" class="group relative scroll-mt-24">
        <a href="#h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Managing SUSE Workloads in AWS – When do you need a private repository?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-managing-suse-workloads-in-aws-when-do-you-need-a-private-repository"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This article applies to customers running on-demand/PAYG instances in AWS deployed from AMIs published by SUSE. The need to patch. Patching is an important part of managing any OS infrastructure with</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 SUSE Blog</strong></p>
<p><a href="https://www.suse.com/c/managing-suse-workloads-in-aws-when-do-you-need-a-private-repository/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on" class="group relative scroll-mt-24">
        <a href="#h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Canonical expands total coverage for Ubuntu LTS releases to 15 years with Legacy add-on
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ubuntu Pro now supports LTS releases for up to 15 years through the Legacy add-on. More security, more stability, and greater control over upgrade timelines for enterprises.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Ubuntu Blog</strong></p>
<p><a href="https://ubuntu.com//blog/canonical-expands-total-coverage-for-ubuntu-lts-releases-to-15-years-with-legacy-add-on"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam" class="group relative scroll-mt-24">
        <a href="#h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Automated Package-Publication Incident IndonesianFoods in the NPM Ecosystem Linked to Crypto Reward-Farming Scam
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-automated-package-publication-incident-indonesianfoods-in-the-npm-ecosystem-linked-to-crypto-reward-farming-scam"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In November 2025, a large-scale surge of package publications on the NPM registry with similar structures and naming patterns was discovered. Understand the details of the incident.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/automated-package-publication-incident-indonesianfoods/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-postgresql-181-177-1611-1515-1420-and-1323-released" class="group relative scroll-mt-24">
        <a href="#h3-postgresql-181-177-1611-1515-1420-and-1323-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PostgreSQL 18.1, 17.7, 16.11, 15.15, 14.20, and 13.23 Released!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-postgresql-181-177-1611-1515-1420-and-1323-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The PostgreSQL Global Development Group has released an update to all supported versions of PostgreSQL, including 18.1, 17.7, 16.11, 15.15, 14.20, and 13.23. This release fixes 2 security vulnerabilit</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/postgresql-181-177-1611-1515-1420-and-1323-released-3171/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study" class="group relative scroll-mt-24">
        <a href="#h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Organizations Achieve 288% ROI with The Snyk AI Trust Platform, According to New Forrester TEI Study
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-organizations-achieve-288-roi-with-the-snyk-ai-trust-platform-according-to-new-forrester-tei-study"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Organizations achieve 288% ROI with the Snyk AI Trust Platform, according to a new Forrester TEI study. Improve developer productivity, enhance security, and consolidate AppSec tools with Snyk.</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Snyk Blog</strong></p>
<p><a href="https://snyk.io/blog/forrester-tei-snyk-roi/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-ai-visibility-problem-when-speed-outruns-security-blog" class="group relative scroll-mt-24">
        <a href="#h3-the-ai-visibility-problem-when-speed-outruns-security-blog" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The AI Visibility Problem: When Speed Outruns Security | Blog
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-ai-visibility-problem-when-speed-outruns-security-blog"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Harness surveyed 500 security practitioners and decision makers responsible for securing AI-native applications from the United States, UK, Germany, and France to share findings on global security pra</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 Harness Blog</strong></p>
<p><a href="https://www.harness.io/blog/the-ai-visibility-problem-when-speed-outruns-security"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-databases" class="group relative scroll-mt-24">
        <a href="#h2-databases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          💾 Databases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-databases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-a-new-top-score-advancing-text-to-sql-on-the-bird-benchmark" class="group relative scroll-mt-24">
        <a href="#h3-a-new-top-score-advancing-text-to-sql-on-the-bird-benchmark" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 A new top score: Advancing Text-to-SQL on the BIRD benchmark
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-a-new-top-score-advancing-text-to-sql-on-the-bird-benchmark"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the fast-evolving world of agentic development, natural language is becoming the standard for interaction. This shift is deeply connected to the power of operational databases, where a more accurat</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/databases/how-to-get-gemini-to-deeply-understand-your-database/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-waze-keeps-traffic-flowing-with-1m-real-time-reads-per-second-on-memorystore" class="group relative scroll-mt-24">
        <a href="#h3-waze-keeps-traffic-flowing-with-1m-real-time-reads-per-second-on-memorystore" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Waze keeps traffic flowing with 1M+ real-time reads per second on Memorystore
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-waze-keeps-traffic-flowing-with-1m-real-time-reads-per-second-on-memorystore"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: Waze (a division of Google parent company Alphabet) depends on vast volumes of dynamic, real-time user session data to power its core navigation features, but scaling that data to suppo</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/databases/how-waze-keeps-traffic-flowing-with-memorystore/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-redisvl-momentum-amp-whats-next" class="group relative scroll-mt-24">
        <a href="#h3-redisvl-momentum-amp-whats-next" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 RedisVL momentum &amp; what’s next
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-redisvl-momentum-amp-whats-next"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Redis, a longtime favorite of developers, is seeing unprecedented velocity around AI use cases. RedisVL, initially a simple convenience layer for vector search, has quickly evolved into the AI-native</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Redis Blog</strong></p>
<p><a href="https://redis.io/blog/redisvl-momentum-and-whats-next/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-cost-of-multitenancy" class="group relative scroll-mt-24">
        <a href="#h3-the-cost-of-multitenancy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Cost of Multitenancy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-cost-of-multitenancy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DynamoDB and ScyllaDB share many similarities, but DynamoDB is a multi-tenant database, while ScyllaDB is single-tenant The recent DynamoDB outage is a stark reminder that even the most reliable and m</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2025/11/13/the-cost-of-multitenancy/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cache-vs-database-how-architecture-impacts-performance" class="group relative scroll-mt-24">
        <a href="#h3-cache-vs-database-how-architecture-impacts-performance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Cache vs. Database: How Architecture Impacts Performance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cache-vs-database-how-architecture-impacts-performance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Lessons learned comparing Memcached with ScyllaDB</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 ScyllaDB Blog</strong></p>
<p><a href="https://www.scylladb.com/2025/11/12/cache-vs-database-how-architecture-impacts-performance/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-postgresql-conference-germany-2026" class="group relative scroll-mt-24">
        <a href="#h3-postgresql-conference-germany-2026" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 PostgreSQL Conference Germany 2026
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-postgresql-conference-germany-2026"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>PGConf.de 2026 is the next iteration of the PostgreSQL Conference Germany. It takes place in the &quot;Haus der Technik&quot; in Essen. <a href="https://2026.pgconf.de/">https://2026.pgconf.de/</a> The conference will take place on April 21 &amp; 22, 2</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/postgresql-conference-germany-2026-3170/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-cloudnativepg-1280-rc1-released" class="group relative scroll-mt-24">
        <a href="#h3-cloudnativepg-1280-rc1-released" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 CloudNativePG 1.28.0 RC1 Released!
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cloudnativepg-1280-rc1-released"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The CloudNativePG Community is thrilled to announce the first release candidate of CloudNativePG 1.28! This preview release provides an opportunity to explore new features and enhancements before the</p>
<p><strong>📅 Nov 10, 2025</strong> • <strong>📰 PostgreSQL News</strong></p>
<p><a href="https://www.postgresql.org/about/news/cloudnativepg-1280-rc1-released-3168/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-platforms" class="group relative scroll-mt-24">
        <a href="#h2-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          🌐 Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-join-us-at-aws-reinvent-2025" class="group relative scroll-mt-24">
        <a href="#h3-join-us-at-aws-reinvent-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Join us at AWS re:Invent 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-join-us-at-aws-reinvent-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Visit us at booth #1339!</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 LaunchDarkly Blog</strong></p>
<p><a href="https://launchdarkly.com/blog/launchdarkly-aws-reinvent-2025/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="group relative scroll-mt-24">
        <a href="#h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Keep Your Tech Flame Alive: Trailblazer Rachel Bayley
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-your-tech-flame-alive-trailblazer-rachel-bayley"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In this Akamai FLAME Trailblazer blog post, Rachel Bayley encourages women to step into the unknown and to be their authentic selves.</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/culture/2024/may/keep-your-tech-flame-alive-trailblazer-rachel-bayley"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-oracle-of-delphi-will-steal-your-credentials" class="group relative scroll-mt-24">
        <a href="#h3-the-oracle-of-delphi-will-steal-your-credentials" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Oracle of Delphi Will Steal Your Credentials
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-oracle-of-delphi-will-steal-your-credentials"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our deception technology is able to reroute attackers into honeypots, where they believe that they found their real target. The attacks brute forced passwords for RDP credentials to connect to the vic</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-oracle-of-delphi-steal-your-credentials"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="group relative scroll-mt-24">
        <a href="#h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 The Nansh0u Campaign – Hackers Arsenal Grows Stronger
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-nansh0u-campaign-hackers-arsenal-grows-stronger"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>In the beginning of April, three attacks detected in the Guardicore Global Sensor Network (GGSN) caught our attention. All three had source IP addresses originating in South-Africa and hosted by Volum</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Linode Blog</strong></p>
<p><a href="https://www.akamai.com/blog/security/the-nansh0u-campaign-hackers-arsenal-grows-stronger"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-snapchat-open-sources-cross-platform-ui-framework" class="group relative scroll-mt-24">
        <a href="#h3-snapchat-open-sources-cross-platform-ui-framework" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Snapchat Open Sources Cross-Platform UI Framework
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-snapchat-open-sources-cross-platform-ui-framework"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For eight years, Snapchat has used Valdi, a cross-platform UI framework, in-house. Now, it has open sourced the framework. Valdi The post Snapchat Open Sources Cross-Platform UI Framework appeared fir</p>
<p><strong>📅 Nov 15, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/snapchat-open-sources-cross-platform-ui-framework/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm" class="group relative scroll-mt-24">
        <a href="#h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AWS Lambda announces Provisioned Mode for SQS event source mapping (ESM)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-aws-lambda-announces-provisioned-mode-for-sqs-event-source-mapping-esm"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>AWS Lambda announces Provisioned Mode for SQS event-source-mappings (ESMs) that subscribe to Amazon SQS, a feature that allows you to optimize the throughput of your SQS ESM by provisioning event poll</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 CloudFormation Updates</strong></p>
<p><a href="https://aws.amazon.com/about-aws/whats-new/2025/11/aws-lambda-provisioned-mode-sqs-esm"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-zeotap-how-bigquery-ml-and-vector-search-help-customers-build-their-own-ai-models" class="group relative scroll-mt-24">
        <a href="#h3-zeotap-how-bigquery-ml-and-vector-search-help-customers-build-their-own-ai-models" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Zeotap: How BigQuery ML and vector search help customers build their own AI models
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-zeotap-how-bigquery-ml-and-vector-search-help-customers-build-their-own-ai-models"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s note: The post is part of a series that highlights how organizations leverage Google Cloud’s unique data science capabilities over alternative cloud data platforms. Google Cloud&#39;s vector embe</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/data-analytics/using-bigquery-ml-to-solve-for-the-lookalike-problem-at-zeotap/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-google-cloud-networking-under-the-hood-how-protective-reroute-increases-resilience" class="group relative scroll-mt-24">
        <a href="#h3-google-cloud-networking-under-the-hood-how-protective-reroute-increases-resilience" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Google Cloud Networking under the hood: How Protective ReRoute increases resilience
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-google-cloud-networking-under-the-hood-how-protective-reroute-increases-resilience"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Cloud infrastructure reliability is foundational, yet even the most sophisticated global networks can suffer from a critical issue: slow or failed recovery from routing outages. In massive, planetary-</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Google Cloud Blog</strong></p>
<p><a href="https://cloud.google.com/blog/products/networking/how-protective-reroute-improves-network-resilience/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-hyperconnected-ai-development-creates-a-multi-system-secret-sprawl" class="group relative scroll-mt-24">
        <a href="#h3-how-hyperconnected-ai-development-creates-a-multi-system-secret-sprawl" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How Hyperconnected AI Development Creates a Multi-System Secret Sprawl
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-hyperconnected-ai-development-creates-a-multi-system-secret-sprawl"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you’ve been building artificial intelligence (AI) tools lately, you’ve probably noticed something: Your development workflow has become incredibly connected. Tools such as model context protocol (M</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DevOps.com</strong></p>
<p><a href="https://devops.com/how-hyperconnected-ai-development-creates-a-multi-system-secret-sprawl/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-friday-five-november-14-2025" class="group relative scroll-mt-24">
        <a href="#h3-friday-five-november-14-2025" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Friday Five - November 14, 2025
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-friday-five-november-14-2025"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>KubeCon + CloudNativeCon NewsroomAt KubeCon + CloudNativeCon, Red Hat is redefining the modern application platform to unite your IT estate: from legacy VMs to next-generation AI workloads. Check out</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/friday-five-november-14-2025-red-hat"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-finding-the-grain-of-sand-in-a-heap-of-salt" class="group relative scroll-mt-24">
        <a href="#h3-finding-the-grain-of-sand-in-a-heap-of-salt" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Finding the grain of sand in a heap of Salt
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-finding-the-grain-of-sand-in-a-heap-of-salt"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We explore the fundamentals of Saltstack and how we use it at Cloudflare. We also explain how we built the infrastructure to reduce release delays due to Salt failures on the edge by over 5%.</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Cloudflare Blog</strong></p>
<p><a href="https://blog.cloudflare.com/finding-the-grain-of-sand-in-a-heap-of-salt/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-microsoft-ignite-2025-turn-complexity-into-a-strategic-asset-in-the-age-of-ai" class="group relative scroll-mt-24">
        <a href="#h3-microsoft-ignite-2025-turn-complexity-into-a-strategic-asset-in-the-age-of-ai" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Microsoft Ignite 2025: Turn complexity into a strategic asset in the age of AI
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microsoft-ignite-2025-turn-complexity-into-a-strategic-asset-in-the-age-of-ai"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Editor’s Note Microsoft Ignite represents more than just another industry conference. It’s where the future of enterprise technology takes shape. This year’s event showcases the intersection of cloud</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Dynatrace Blog</strong></p>
<p><a href="https://www.dynatrace.com/news/blog/microsoft-ignite-2025-turn-complexity-into-a-strategic-asset-in-the-age-of-ai/"><strong>🔗 Read more</strong></a></p>
<hr>
<h2 id="h2-misc" class="group relative scroll-mt-24">
        <a href="#h2-misc" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📰 Misc
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-misc"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-only-three-kinds-of-ai-products-work" class="group relative scroll-mt-24">
        <a href="#h3-only-three-kinds-of-ai-products-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Only three kinds of AI products work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-only-three-kinds-of-ai-products-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Comments</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Hacker News</strong></p>
<p><a href="https://www.seangoedecke.com/ai-products/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-fpga-based-ibm-pc-xt" class="group relative scroll-mt-24">
        <a href="#h3-fpga-based-ibm-pc-xt" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 FPGA Based IBM-PC-XT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-fpga-based-ibm-pc-xt"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Comments</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Hacker News</strong></p>
<p><a href="https://bit-hack.net/2025/11/10/fpga-based-ibm-pc-xt/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-de-bruijn-numerals" class="group relative scroll-mt-24">
        <a href="#h3-de-bruijn-numerals" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 De Bruijn Numerals
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-de-bruijn-numerals"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Comments</p>
<p><strong>📅 Nov 16, 2025</strong> • <strong>📰 Hacker News</strong></p>
<p><a href="https://text.marvinborner.de/2023-08-22-22.html"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-code-doesnt-survive-in-production-heres-why" class="group relative scroll-mt-24">
        <a href="#h3-ai-code-doesnt-survive-in-production-heres-why" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI Code Doesn’t Survive in Production: Here’s Why
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-code-doesnt-survive-in-production-heres-why"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I see a new demo every day that looks something like this: A single prompt generates a complete application. A The post AI Code Doesn’t Survive in Production: Here’s Why appeared first on The New Stac</p>
<p><strong>📅 Nov 15, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/ai-code-doesnt-survive-in-production-heres-why/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-visual-studio-2026-first-look-evolution-not-revolution" class="group relative scroll-mt-24">
        <a href="#h3-visual-studio-2026-first-look-evolution-not-revolution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Visual Studio 2026 First Look: Evolution, Not Revolution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-visual-studio-2026-first-look-evolution-not-revolution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>I’ve never entirely understood the Microsoft roadmap. I certainly enjoyed using Visual Studio 2022 (VS 2022) for C# and .NET The post Visual Studio 2026 First Look: Evolution, Not Revolution appeared</p>
<p><strong>📅 Nov 15, 2025</strong> • <strong>📰 The New Stack</strong></p>
<p><a href="https://thenewstack.io/visual-studio-2026-first-look-evolution-not-revolution/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-jetbrains-is-heading-to-vslive-orlando" class="group relative scroll-mt-24">
        <a href="#h3-jetbrains-is-heading-to-vslive-orlando" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 JetBrains Is Heading to VSLive! Orlando
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-jetbrains-is-heading-to-vslive-orlando"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Next week we’ll be in Orlando, Florida for Visual Studio Live!, and if you work with .NET, we’d like to meet you. You’ll find the JetBrains booth (#118) in the conference expo area throughout the week</p>
<p><strong>📅 Nov 15, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/dotnet/2025/11/15/jetbrains-is-heading-to-vslive-orlando/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-data-ingestion-using-logstash-postgresql-to-elasticsearch" class="group relative scroll-mt-24">
        <a href="#h3-data-ingestion-using-logstash-postgresql-to-elasticsearch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Data Ingestion Using Logstash: PostgreSQL to Elasticsearch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-data-ingestion-using-logstash-postgresql-to-elasticsearch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>What Is Logstash? Logstash is an open-source data processing pipeline from Elastic. It is being used to ingest, transform, and ship data to different sources, including Elasticsearch, Kafka, flat file</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17209521/logstash-postgresql-to-elasticsearch"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-intellij-idea-20253-spring-7" class="group relative scroll-mt-24">
        <a href="#h3-intellij-idea-20253-spring-7" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 IntelliJ IDEA 2025.3 💚 Spring 7
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-intellij-idea-20253-spring-7"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Major Spring Framework releases don’t come around often – and when they do, they tend to reshape how we build applications for years to come. Spring Framework 7 is one of those releases. It simplifies</p>
<p><strong>📅 Nov 14, 2025</strong> • <strong>📰 JetBrains Blog</strong></p>
<p><a href="https://blog.jetbrains.com/idea/2025/11/intellij-idea-2025-3-spring-7/"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-ai-sdlc-transformation-part-1-where-to-start" class="group relative scroll-mt-24">
        <a href="#h3-ai-sdlc-transformation-part-1-where-to-start" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 AI SDLC Transformation, Part 1: Where to Start?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ai-sdlc-transformation-part-1-where-to-start"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most engineering leaders today feel the same tension: everyone talks about “AI in software delivery,” but few know where to start. Should you launch pilots? Train teams? Complement Jira or some other</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17208779/ai-sdlc-transformation-where-to-start"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-how-to-simply-manage-releases-with-git" class="group relative scroll-mt-24">
        <a href="#h3-how-to-simply-manage-releases-with-git" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 How to Simply Manage Releases With Git
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-to-simply-manage-releases-with-git"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This post briefly outlines a simple yet clean process for managing the releases of an application via Git/GitHub. Its goal is to provide a straightforward recipe, while it&#39;s assumed that these practic</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 DZone DevOps</strong></p>
<p><a href="https://feeds.dzone.com/link/23568/17208695/simply-manage-releases-with-git"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-listening-learning-and-leading-how-customer-feedback-shapes-the-future-of-red-hat-learning-subscription" class="group relative scroll-mt-24">
        <a href="#h3-listening-learning-and-leading-how-customer-feedback-shapes-the-future-of-red-hat-learning-subscription" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 Listening, learning, and leading: How customer feedback shapes the future of Red Hat Learning Subscription
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-listening-learning-and-leading-how-customer-feedback-shapes-the-future-of-red-hat-learning-subscription"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>At Red Hat, innovation begins with listening. In October 2025, the Red Hat Learning Think Tank forum brought together a group of passionate learners and leaders to listen, learn, and collaborate on Re</p>
<p><strong>📅 Nov 13, 2025</strong> • <strong>📰 Red Hat Blog</strong></p>
<p><a href="https://www.redhat.com/en/blog/listening-learning-and-leading-how-customer-feedback-shapes-future-red-hat-learning-subscription"><strong>🔗 Read more</strong></a></p>
<h3 id="h3-october-2025-version-1106" class="group relative scroll-mt-24">
        <a href="#h3-october-2025-version-1106" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          📄 October 2025 (version 1.106)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-october-2025-version-1106"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Learn what is new in the Visual Studio Code October 2025 Release (1.106). Read the full article</p>
<p><strong>📅 Nov 12, 2025</strong> • <strong>📰 VS Code Blog</strong></p>
<p><a href="https://code.visualstudio.com/updates/v1_106"><strong>🔗 Read more</strong></a></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[DevOps Weekly Digest - Week 45, 2025]]></title>
      <link>https://devops-daily.com/news/2025-week-45</link>
      <description><![CDATA[Welcome to the DevOps Weekly Digest - your curated source for the latest DevOps news, tools, and insights.]]></description>
      <pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/news/2025-week-45</guid>
      <category><![CDATA[DevOps News]]></category>
      <content:encoded><![CDATA[<blockquote>
<p>Handpicked by DevOps Daily.</p>
</blockquote>
<h2 id="h2-welcome-to-devops-weekly-digest" class="group relative scroll-mt-24">
        <a href="#h2-welcome-to-devops-weekly-digest" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Welcome to DevOps Weekly Digest 🚀
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-welcome-to-devops-weekly-digest"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Welcome to the inaugural edition of the <strong>DevOps Weekly Digest</strong>! This is your new go-to resource for staying up-to-date with the rapidly evolving DevOps ecosystem.</p>
<h3 id="h3-what-to-expect" class="group relative scroll-mt-24">
        <a href="#h3-what-to-expect" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What to Expect
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-what-to-expect"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Every week, we&#39;ll bring you:</p>
<ul>
<li><strong>Curated Updates</strong> from 250+ trusted DevOps sources</li>
<li><strong>AI-Powered Summaries</strong> of the most important news</li>
<li><strong>Organized Categories</strong> covering Kubernetes, Cloud Native, CI/CD, IaC, Observability, Security, and more</li>
<li><strong>Quality Over Quantity</strong> - only the most relevant, actionable content</li>
</ul>
<h3 id="h3-our-coverage" class="group relative scroll-mt-24">
        <a href="#h3-our-coverage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Our Coverage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-our-coverage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We monitor the entire DevOps landscape, including:</p>
<p><strong>Kubernetes &amp; Cloud Native</strong></p>
<ul>
<li>Official Kubernetes releases and updates</li>
<li>CNCF project announcements</li>
<li>Service mesh innovations (Istio, Linkerd, Cilium)</li>
<li>Container runtime developments</li>
</ul>
<p><strong>CI/CD &amp; Automation</strong></p>
<ul>
<li>GitLab, GitHub, Jenkins updates</li>
<li>GitOps tools (Argo, Flux, Tekton)</li>
<li>Pipeline automation innovations</li>
<li>Progressive delivery platforms</li>
</ul>
<p><strong>Infrastructure as Code</strong></p>
<ul>
<li>Terraform, Pulumi, Ansible releases</li>
<li>Cloud provider IaC updates</li>
<li>Configuration management trends</li>
</ul>
<p><strong>Observability</strong></p>
<ul>
<li>Prometheus, Grafana, and OpenTelemetry news</li>
<li>APM and monitoring platform updates</li>
<li>Logging and tracing innovations</li>
</ul>
<p><strong>Security</strong></p>
<ul>
<li>Container and Kubernetes security</li>
<li>Secrets management updates</li>
<li>Policy enforcement tools</li>
<li>Vulnerability scanning advances</li>
</ul>
<p><strong>Cloud Platforms</strong></p>
<ul>
<li>AWS, GCP, Azure announcements</li>
<li>Multi-cloud and hybrid cloud solutions</li>
<li>Serverless and edge computing</li>
</ul>
<p><strong>And Much More</strong></p>
<ul>
<li>Database technologies</li>
<li>Message queues and event streaming</li>
<li>Platform engineering tools</li>
<li>Developer experience improvements</li>
</ul>
<h3 id="h3-how-it-works" class="group relative scroll-mt-24">
        <a href="#h3-how-it-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How It Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-it-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Our automated system:</p>
<ol>
<li><strong>Crawls</strong> 250+ DevOps RSS feeds and websites daily</li>
<li><strong>Filters</strong> content from the past 7 days</li>
<li><strong>Classifies</strong> articles using AI to ensure relevance</li>
<li><strong>Summarizes</strong> each item to save you time</li>
<li><strong>Organizes</strong> content by category for easy browsing</li>
<li><strong>Limits</strong> items per source and category to maintain quality</li>
</ol>
<h3 id="h3-stay-connected" class="group relative scroll-mt-24">
        <a href="#h3-stay-connected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Stay Connected
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stay-connected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This digest is automatically generated and published every week. You can:</p>
<ul>
<li>📰 <strong>Subscribe</strong> via our <a href="/feed.xml">RSS feed</a></li>
<li>🔖 <strong>Bookmark</strong> the <a href="/news">news page</a> for quick access</li>
<li>🔗 <strong>Share</strong> individual digests with your team</li>
<li>💬 <strong>Report</strong> any issues or suggest improvements</li>
</ul>
<h3 id="h3-coming-next-week" class="group relative scroll-mt-24">
        <a href="#h3-coming-next-week" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Coming Next Week
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-coming-next-week"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Starting next week, you&#39;ll receive comprehensive weekly digests packed with:</p>
<ul>
<li>Latest Kubernetes releases and security patches</li>
<li>New CNCF project graduations and updates</li>
<li>Major cloud provider announcements</li>
<li>CI/CD tool releases and features</li>
<li>Security vulnerabilities and fixes</li>
<li>Industry insights and best practices</li>
</ul>
<h3 id="h3-feedback-welcome" class="group relative scroll-mt-24">
        <a href="#h3-feedback-welcome" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Feedback Welcome
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-feedback-welcome"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We&#39;re constantly improving this digest to serve you better. If you have suggestions for sources we should monitor, categories we should add, or any other feedback, please <a href="https://github.com/The-DevOps-Daily/devops-daily/issues/new?title=Issue+with+news%3A+DevOps+Weekly+Digest+-+Week+45%2C+2025&body=I+found+an+issue+with+this+news%3A%0A%0A**URL%3A**+https%3A%2F%2Fdevops-daily.com%2Fnews%2F2025-week-45%0A**News+Slug%3A**+2025-week-45%0A%0A**Description%3A**%0A%3C%21--+Please+describe+the+issue+you+found+--%3E%0A%0A**Expected+behavior%3A**%0A%3C%21--+What+should+happen+instead%3F+--%3E%0A%0A**Additional+context%3A**%0A%3C%21--+Any+other+context+about+the+problem+--%3E&labels=content-issue%2Cnews">let us know</a>.</p>
<hr>
<p><em>The DevOps Weekly Digest is an automated curation powered by AI, bringing you the most relevant updates from across the DevOps ecosystem. Quality sources, intelligent filtering, and actionable insights - all in one place.</em></p>
<p><strong>See you next week with our first full digest!</strong> 🎉</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Ping Response: Request Timed Out vs Destination Host Unreachable]]></title>
      <link>https://devops-daily.com/posts/ping-timeout-vs-destination-unreachable</link>
      <description><![CDATA[Understand the difference between ping timeout and destination unreachable errors, what they mean for network troubleshooting, and how to diagnose connectivity issues.]]></description>
      <pubDate>Sat, 30 Aug 2025 14:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/ping-timeout-vs-destination-unreachable</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[Ping]]></category><category><![CDATA[ICMP]]></category><category><![CDATA[Troubleshooting]]></category><category><![CDATA[Network Diagnostics]]></category>
      <content:encoded><![CDATA[<p><strong>TLDR:</strong> &quot;Request timed out&quot; means your ping packet was sent but no response came back - the host might be down, blocking ICMP, or unreachable beyond your network. &quot;Destination host unreachable&quot; means a router along the path actively told you it cannot reach the destination - this is usually a routing problem or the destination network doesn&#39;t exist. Timeout is silence; unreachable is an explicit error message.</p>
<p>When you ping a host and it fails, the error message tells you a lot about where the problem is. The two most common responses - timeout and unreachable - indicate very different issues.</p>
<h2 id="h2-request-timed-out" class="group relative scroll-mt-24">
        <a href="#h2-request-timed-out" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Request Timed Out
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-request-timed-out"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you see &quot;Request timed out,&quot; your computer sent the ICMP echo request but never received a reply:</p>
<pre><code class="hljs language-bash">$ ping 192.168.1.100
PING 192.168.1.100 (192.168.1.100): 56 data bytes
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 0
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 1
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 2
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 3
</code></pre><p>Here&#39;s what&#39;s happening:</p>
<pre><code>Your Computer          Network          Target Host
      |                                      |
      |----ICMP Echo Request---------------&gt;|
      |                                      |
      |                  ... silence ...     |
      |                                      |
      |&lt;------ (no response) ---------------|
      |                                      |
   [timeout]
</code></pre><p>Your packet was sent, but nothing came back. This happens when:</p>
<h3 id="h3-the-host-is-down" class="group relative scroll-mt-24">
        <a href="#h3-the-host-is-down" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Host Is Down
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-the-host-is-down"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The target machine is powered off or unreachable. Your packet arrives at the network segment but there&#39;s no host to respond:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pinging a host that&#x27;s turned off</span>
ping 192.168.1.50
<span class="hljs-comment"># Request timeout - host exists on the network but is powered down</span>
</code></pre><h3 id="h3-firewall-blocking-icmp" class="group relative scroll-mt-24">
        <a href="#h3-firewall-blocking-icmp" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Firewall Blocking ICMP
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-firewall-blocking-icmp"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The host is up but configured to drop ICMP echo requests. Many servers disable ping for security:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On the target server (Linux)</span>
<span class="hljs-comment"># Block all ICMP echo requests</span>
<span class="hljs-built_in">sudo</span> iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

<span class="hljs-comment"># Now pings to this server time out</span>
<span class="hljs-comment"># The server receives packets but silently drops them</span>
</code></pre><p>Windows firewall does this too:</p>
<pre><code class="hljs language-powershell"><span class="hljs-comment"># Windows - disable ICMP echo requests</span>
<span class="hljs-built_in">New-NetFirewallRule</span> <span class="hljs-literal">-DisplayName</span> <span class="hljs-string">&quot;Block Ping&quot;</span> `
    <span class="hljs-literal">-Direction</span> Inbound <span class="hljs-literal">-Protocol</span> ICMPv4 <span class="hljs-literal">-IcmpType</span> <span class="hljs-number">8</span> <span class="hljs-literal">-Action</span> Block
</code></pre><h3 id="h3-network-congestion-or-packet-loss" class="group relative scroll-mt-24">
        <a href="#h3-network-congestion-or-packet-loss" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Network Congestion or Packet Loss
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-network-congestion-or-packet-loss"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If the network is overloaded, packets might get dropped without any error message:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># High packet loss</span>
ping google.com
PING google.com (142.250.80.46): 56 data bytes
64 bytes from 142.250.80.46: icmp_seq=0 ttl=116 <span class="hljs-keyword">time</span>=15.2 ms
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 1
64 bytes from 142.250.80.46: icmp_seq=2 ttl=116 <span class="hljs-keyword">time</span>=14.8 ms
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 3
</code></pre><p>Some packets get through, others don&#39;t - indicates congestion or wireless interference.</p>
<h3 id="h3-routing-black-hole" class="group relative scroll-mt-24">
        <a href="#h3-routing-black-hole" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Routing Black Hole
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-routing-black-hole"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Your packet reaches a router that forwards it, but somewhere downstream it gets lost with no error sent back:</p>
<pre><code>Your PC -&gt; Router 1 -&gt; Router 2 -&gt; Router 3 -&gt; [black hole]
                                                No response,
                                                no error
</code></pre><h2 id="h2-destination-host-unreachable" class="group relative scroll-mt-24">
        <a href="#h2-destination-host-unreachable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Destination Host Unreachable
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-destination-host-unreachable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you see &quot;Destination host unreachable,&quot; a router is actively telling you it cannot deliver the packet:</p>
<pre><code class="hljs language-bash">$ ping 10.50.99.99
PING 10.50.99.99 (10.50.99.99): 56 data bytes
From 192.168.1.1 icmp_seq=0 Destination Host Unreachable
From 192.168.1.1 icmp_seq=1 Destination Host Unreachable
From 192.168.1.1 icmp_seq=2 Destination Host Unreachable
</code></pre><p>Notice the &quot;From 192.168.1.1&quot; - this is your gateway router telling you it cannot reach the destination:</p>
<pre><code>Your Computer          Gateway Router       Target Network
      |                      |                    |
      |--ICMP Echo--------&gt;  |                    |
      |                      |                    |
      |                      X  Can&#x27;t route       |
      |                      |  to 10.50.99.99    |
      |                      |                    |
      |&lt;--ICMP Unreachable-- |                    |
      |  (from router)       |                    |
</code></pre><p>The router sends back an ICMP &quot;Destination Unreachable&quot; message. This is helpful - it tells you where the problem is.</p>
<h3 id="h3-no-route-to-network" class="group relative scroll-mt-24">
        <a href="#h3-no-route-to-network" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          No Route to Network
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-no-route-to-network"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The destination network doesn&#39;t exist in the router&#39;s routing table:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pinging a nonexistent network</span>
ping 172.99.99.99
<span class="hljs-comment"># Destination Host Unreachable - no route to 172.99.0.0/16</span>
</code></pre><p>Check routing tables to confirm:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Linux/macOS - show routing table</span>
route -n
<span class="hljs-comment"># or</span>
ip route show

<span class="hljs-comment"># Windows</span>
route <span class="hljs-built_in">print</span>
</code></pre><p>If there&#39;s no route to the destination network, your router can&#39;t forward the packet.</p>
<h3 id="h3-host-unreachable-on-local-network" class="group relative scroll-mt-24">
        <a href="#h3-host-unreachable-on-local-network" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Host Unreachable on Local Network
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-host-unreachable-on-local-network"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re pinging a host on your local subnet and get &quot;unreachable,&quot; the host doesn&#39;t respond to ARP requests:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Pinging a host on the same subnet (192.168.1.0/24)</span>
ping 192.168.1.200
<span class="hljs-comment"># Destination Host Unreachable</span>

<span class="hljs-comment"># Check ARP table</span>
arp -a
<span class="hljs-comment"># 192.168.1.200 is not in the ARP table - host isn&#x27;t on the network</span>
</code></pre><p>The computer tried to resolve the MAC address via ARP but got no response, so it knows the host isn&#39;t reachable.</p>
<h3 id="h3-network-interface-down" class="group relative scroll-mt-24">
        <a href="#h3-network-interface-down" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Network Interface Down
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-network-interface-down"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your own network interface is down or misconfigured:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Interface is down</span>
ping google.com
<span class="hljs-comment"># connect: Network is unreachable</span>

<span class="hljs-comment"># Check interface status</span>
ip <span class="hljs-built_in">link</span> show

<span class="hljs-comment"># Bring it up</span>
<span class="hljs-built_in">sudo</span> ip <span class="hljs-built_in">link</span> <span class="hljs-built_in">set</span> eth0 up
</code></pre><p>The error comes immediately because your own system knows it can&#39;t send packets.</p>
<h2 id="h2-comparing-the-two" class="group relative scroll-mt-24">
        <a href="#h2-comparing-the-two" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Comparing the Two
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-comparing-the-two"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s a decision tree for diagnosing:</p>
<pre><code>Ping fails
    |
    |
    ├─&gt; &quot;Request timed out&quot;
    |       |
    |       ├─&gt; Check if host is powered on
    |       ├─&gt; Check if firewall blocks ICMP
    |       ├─&gt; Check for packet loss (wireless, congestion)
    |       └─&gt; Verify host is reachable beyond your network
    |
    └─&gt; &quot;Destination host unreachable&quot;
            |
            ├─&gt; Check &quot;From&quot; IP address
            |       |
            |       ├─&gt; Your gateway? Routing problem
            |       ├─&gt; Your computer? Interface down
            |       └─&gt; Intermediate router? Network path broken
            |
            ├─&gt; Check routing table
            ├─&gt; Check ARP table (for local subnet)
            └─&gt; Verify network cable/WiFi connection
</code></pre><h2 id="h2-detailed-troubleshooting-examples" class="group relative scroll-mt-24">
        <a href="#h2-detailed-troubleshooting-examples" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Detailed Troubleshooting Examples
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-detailed-troubleshooting-examples"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-example-1-request-timeout" class="group relative scroll-mt-24">
        <a href="#h3-example-1-request-timeout" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 1: Request Timeout
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-1-request-timeout"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 0
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 1
</code></pre><p><strong>Diagnosis steps:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># 1. Check if you have a route to 8.8.8.8</span>
ip route get 8.8.8.8
<span class="hljs-comment"># Output: 8.8.8.8 via 192.168.1.1 dev wlan0 src 192.168.1.10</span>

<span class="hljs-comment"># 2. Ping your gateway to verify local network works</span>
ping 192.168.1.1
<span class="hljs-comment"># 64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=1.2 ms</span>
<span class="hljs-comment"># Gateway responds - local network is fine</span>

<span class="hljs-comment"># 3. Try another public IP</span>
ping 1.1.1.1
<span class="hljs-comment"># Request timeout - same issue</span>

<span class="hljs-comment"># 4. Try DNS resolution</span>
nslookup google.com
<span class="hljs-comment"># Works - DNS is fine</span>

<span class="hljs-comment"># Conclusion: Your ISP might be blocking ICMP, or there&#x27;s packet loss</span>
<span class="hljs-comment"># Try TCP-based connectivity test</span>
curl -I https://google.com
<span class="hljs-comment"># Works - internet is up, just ICMP is blocked/filtered</span>
</code></pre><h3 id="h3-example-2-destination-unreachable" class="group relative scroll-mt-24">
        <a href="#h3-example-2-destination-unreachable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 2: Destination Unreachable
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-2-destination-unreachable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">$ ping 10.0.50.100
PING 10.0.50.100 (10.0.50.100): 56 data bytes
From 192.168.1.1 icmp_seq=0 Destination Host Unreachable
</code></pre><p><strong>Diagnosis steps:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># 1. Check who sent the unreachable message</span>
<span class="hljs-comment"># &quot;From 192.168.1.1&quot; - this is your gateway</span>

<span class="hljs-comment"># 2. Check your routing table</span>
route -n | grep 10.0.50
<span class="hljs-comment"># No route found</span>

<span class="hljs-comment"># 3. Check if there should be a route</span>
<span class="hljs-comment"># Is 10.0.50.0/24 supposed to be accessible from your network?</span>
<span class="hljs-comment"># Maybe you need to be on VPN?</span>

<span class="hljs-comment"># 4. Connect to VPN and try again</span>
<span class="hljs-comment"># (After VPN connection)</span>
route -n | grep 10.0.50
<span class="hljs-comment"># 10.0.50.0/24 via 10.8.0.1 dev tun0</span>

ping 10.0.50.100
<span class="hljs-comment"># 64 bytes from 10.0.50.100: icmp_seq=0 ttl=64 time=45.2 ms</span>
<span class="hljs-comment"># Now it works!</span>

<span class="hljs-comment"># Conclusion: Network required VPN connection</span>
</code></pre><h3 id="h3-example-3-mixed-timeout-and-unreachable" class="group relative scroll-mt-24">
        <a href="#h3-example-3-mixed-timeout-and-unreachable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 3: Mixed Timeout and Unreachable
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-3-mixed-timeout-and-unreachable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Sometimes you see both:</p>
<pre><code class="hljs language-bash">$ ping 192.168.1.150
PING 192.168.1.150 (192.168.1.150): 56 data bytes
From 192.168.1.10 icmp_seq=0 Destination Host Unreachable
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 1
From 192.168.1.10 icmp_seq=2 Destination Host Unreachable
Request <span class="hljs-built_in">timeout</span> <span class="hljs-keyword">for</span> icmp_seq 3
</code></pre><p>This pattern indicates:</p>
<ul>
<li>Initially, ARP lookup fails (unreachable)</li>
<li>Then ARP cache times out and ping just waits (timeout)</li>
<li>Then ARP tries again (unreachable)</li>
</ul>
<p>The host definitely isn&#39;t on the network.</p>
<h2 id="h2-icmp-types-behind-the-scenes" class="group relative scroll-mt-24">
        <a href="#h2-icmp-types-behind-the-scenes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ICMP Types Behind the Scenes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-icmp-types-behind-the-scenes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Understanding the actual ICMP messages helps:</p>
<pre><code>Request Timed Out:
- Your computer sends: ICMP Type 8 (Echo Request)
- Target should send: ICMP Type 0 (Echo Reply)
- You receive: Nothing (timeout)

Destination Unreachable:
- Your computer sends: ICMP Type 8 (Echo Request)
- Router sends back: ICMP Type 3 (Destination Unreachable)
  - Code 0: Network unreachable
  - Code 1: Host unreachable
  - Code 2: Protocol unreachable
  - Code 3: Port unreachable
  - etc.
</code></pre><p>You can see these with <code>tcpdump</code> or Wireshark:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Capture ICMP traffic</span>
<span class="hljs-built_in">sudo</span> tcpdump -i any icmp -n

<span class="hljs-comment"># In another terminal</span>
ping 192.168.1.100

<span class="hljs-comment"># Output shows the ICMP types:</span>
<span class="hljs-comment"># &gt; 192.168.1.10 &gt; 192.168.1.100: ICMP echo request, id 1234, seq 0</span>
<span class="hljs-comment"># &lt; 192.168.1.1 &gt; 192.168.1.10: ICMP 192.168.1.100 host unreachable</span>
</code></pre><h2 id="h2-when-ping-works-but-service-doesn39t" class="group relative scroll-mt-24">
        <a href="#h2-when-ping-works-but-service-doesn39t" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Ping Works But Service Doesn&#39;t
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-ping-works-but-service-doesn39t"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Sometimes ping succeeds but you still can&#39;t connect to a service:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Ping works</span>
ping database.example.com
<span class="hljs-comment"># 64 bytes from database.example.com (10.0.1.50): icmp_seq=0 ttl=64 time=1.2 ms</span>

<span class="hljs-comment"># But connection fails</span>
telnet database.example.com 5432
<span class="hljs-comment"># telnet: Unable to connect to remote host: Connection refused</span>
</code></pre><p>This means:</p>
<ul>
<li>Host is reachable (ping works)</li>
<li>ICMP is allowed</li>
<li>But the specific service port (5432) is blocked or not running</li>
</ul>
<p>Ping only tests ICMP connectivity, not TCP/UDP services.</p>
<h2 id="h2-practical-tips" class="group relative scroll-mt-24">
        <a href="#h2-practical-tips" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Tips
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-tips"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>For timeouts:</strong></p>
<ol>
<li>Verify the host IP is correct</li>
<li>Check if the host is powered on</li>
<li>Try pinging from a different location</li>
<li>Use <code>traceroute</code> to see how far packets get</li>
<li>Consider that ICMP might be intentionally blocked</li>
</ol>
<p><strong>For unreachable:</strong></p>
<ol>
<li>Note which router sent the error</li>
<li>Check routing tables</li>
<li>Verify network cables and WiFi connection</li>
<li>Check if VPN is required</li>
<li>Verify the destination network exists</li>
</ol>
<p><strong>Better diagnostics than ping:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See the path packets take</span>
traceroute google.com

<span class="hljs-comment"># Test specific TCP port connectivity</span>
nc -zv google.com 443
<span class="hljs-comment"># or</span>
telnet google.com 443

<span class="hljs-comment"># Test with actual HTTP request</span>
curl -v https://google.com

<span class="hljs-comment"># Full network path with MTR (better than traceroute)</span>
mtr google.com
</code></pre><p>The key difference is that &quot;request timed out&quot; means silence (packet sent, no reply), while &quot;destination unreachable&quot; means active rejection (router explicitly saying it cannot reach the destination). Understanding this distinction helps you troubleshoot network issues faster.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The 5-Minute Kubernetes Cluster Health Check]]></title>
      <link>https://devops-daily.com/posts/5-minute-kubernetes-cluster-health-check</link>
      <description><![CDATA[Learn how to quickly assess your Kubernetes cluster's health with essential commands and catch issues before they become critical problems.]]></description>
      <pubDate>Tue, 12 Aug 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/5-minute-kubernetes-cluster-health-check</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Monitoring]]></category><category><![CDATA[Troubleshooting]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[kubectl]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can check your Kubernetes cluster&#39;s health in under 5 minutes using five key commands: checking node status, monitoring resource usage, reviewing pod health across namespaces, investigating problem pods, and examining cluster events. This quick routine helps catch issues before they escalate into critical problems.</p>
<p>Kubernetes is great until it&#39;s not. One bad node, a pod stuck in CrashLoopBackOff, or a resource spike can ruin your day. The good news? You don&#39;t need to spend an hour digging through dashboards to spot trouble early. With a few quick commands, you can get a solid read on your cluster&#39;s health in under 5 minutes.</p>
<p>Here&#39;s how to do it effectively.</p>
<h2 id="h2-make-sure-your-nodes-are-happy" class="group relative scroll-mt-24">
        <a href="#h2-make-sure-your-nodes-are-happy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Make Sure Your Nodes Are Happy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-make-sure-your-nodes-are-happy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Start by checking the overall status of your cluster nodes. This gives you the foundation-level health of your infrastructure.</p>
<pre><code class="hljs language-bash">kubectl get nodes -o wide
</code></pre><p>This command displays all nodes in your cluster along with their detailed information. You&#39;ll see each node&#39;s status, roles, age, version, internal and external IPs, OS image, kernel version, and container runtime.</p>
<p>What you want to see:</p>
<ul>
<li><strong>STATUS</strong> should be <code>Ready</code> for all nodes</li>
<li>No mystery nodes suddenly showing up in your cluster</li>
<li>Roles, IPs, and ages that make sense for your environment</li>
</ul>
<p>If you spot <code>NotReady</code>, that&#39;s your cue to dig deeper. A node in this state might be experiencing network issues, resource exhaustion, or kubelet problems.</p>
<h2 id="h2-check-resource-usage-at-a-glance" class="group relative scroll-mt-24">
        <a href="#h2-check-resource-usage-at-a-glance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check Resource Usage at a Glance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-check-resource-usage-at-a-glance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Next, get a quick overview of resource consumption across your nodes to identify potential bottlenecks.</p>
<pre><code class="hljs language-bash">kubectl top nodes
</code></pre><p>This command shows CPU and memory usage for each node in your cluster. It provides both absolute values and percentages, making it easy to spot resource pressure.</p>
<p>Keep an eye out for:</p>
<ul>
<li>CPU or memory regularly above 80% on any node</li>
<li>One node doing all the heavy lifting while others are barely working</li>
<li>Sudden spikes that don&#39;t match your expected workload patterns</li>
</ul>
<p>No <code>metrics-server</code> running? Install it with this command:</p>
<pre><code class="hljs language-bash">kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
</code></pre><p>The metrics-server is essential for resource monitoring and is required for horizontal pod autoscaling to work properly.</p>
<h2 id="h2-look-at-all-pods-across-all-namespaces" class="group relative scroll-mt-24">
        <a href="#h2-look-at-all-pods-across-all-namespaces" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Look at All Pods Across All Namespaces
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-look-at-all-pods-across-all-namespaces"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Get a bird&#39;s-eye view of all pods running in your cluster to quickly identify any that are misbehaving.</p>
<pre><code class="hljs language-bash">kubectl get pods --all-namespaces
</code></pre><p>This command lists every pod across all namespaces, showing their current status, restart count, and age. It&#39;s like taking the pulse of your entire application ecosystem.</p>
<p>Healthy pods should be <code>Running</code> or <code>Completed</code>. If you see states like <code>CrashLoopBackOff</code>, <code>ImagePullBackOff</code>, <code>Pending</code>, or <code>Error</code>, note the namespace and pod name for further investigation.</p>
<p>Also watch the <strong>RESTARTS</strong> column closely. If a pod has restarted a dozen times in the last hour, something&#39;s definitely off. Frequent restarts often indicate:</p>
<ul>
<li>Application crashes due to bugs or configuration issues</li>
<li>Failing health checks (readiness or liveness probes)</li>
<li>Resource limits being exceeded</li>
<li>Dependencies being unavailable</li>
</ul>
<h2 id="h2-zoom-in-on-problem-pods" class="group relative scroll-mt-24">
        <a href="#h2-zoom-in-on-problem-pods" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Zoom In on Problem Pods
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-zoom-in-on-problem-pods"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you spot problematic pods, dig deeper to understand what&#39;s causing the issues.</p>
<pre><code class="hljs language-bash">kubectl describe pod &lt;pod-name&gt; -n &lt;namespace&gt;
</code></pre><p>Replace <code>&lt;pod-name&gt;</code> and <code>&lt;namespace&gt;</code> with the actual values from your problem pods. This command provides detailed information about the pod&#39;s configuration, current state, and recent events.</p>
<p>Check for these common issues:</p>
<ul>
<li><strong>Events at the bottom</strong> (often the smoking gun that reveals the root cause)</li>
<li><strong>Failing readiness or liveness probes</strong> that prevent the pod from receiving traffic</li>
<li><strong>Image pull errors</strong> indicating registry access problems or incorrect image names</li>
<li><strong>Resource limit issues</strong> where the pod exceeds its memory or CPU constraints</li>
</ul>
<p>The events section is particularly valuable because it shows a chronological history of what happened to the pod, including scheduling decisions, volume mounts, and error conditions.</p>
<h2 id="h2-check-the-cluster39s-event-log" class="group relative scroll-mt-24">
        <a href="#h2-check-the-cluster39s-event-log" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check the Cluster&#39;s Event Log
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-check-the-cluster39s-event-log"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Get insight into what&#39;s been happening across your entire cluster by examining recent events.</p>
<pre><code class="hljs language-bash">kubectl get events --sort-by=.metadata.creationTimestamp
</code></pre><p>This command shows cluster-wide events sorted by when they occurred, giving you a timeline of recent activity. Events provide context about system-level operations and can reveal patterns or issues that affect multiple components.</p>
<p>Events will tell you what&#39;s been happening behind the scenes:</p>
<ul>
<li>Failed volume mounts that prevent pods from starting</li>
<li>DNS resolution errors affecting service communication</li>
<li>Scheduling issues when pods can&#39;t be placed on nodes</li>
<li>Node pressure warnings indicating resource constraints</li>
</ul>
<h2 id="h2-try-k9s-for-a-better-view" class="group relative scroll-mt-24">
        <a href="#h2-try-k9s-for-a-better-view" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Try k9s for a Better View
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-try-k9s-for-a-better-view"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you want something more interactive than command-line tools, give <strong><a href="https://k9scli.io/">k9s</a></strong> a try. It&#39;s a terminal-based UI for Kubernetes that provides real-time cluster information in an intuitive interface.</p>
<p>k9s lets you browse resources, view logs, and drill into problems without typing long commands. You can navigate between different resource types using simple keystrokes, filter resources, and even perform actions like scaling deployments or deleting pods.</p>
<p>Once you try k9s, it&#39;s hard to go back to plain kubectl for exploratory tasks. It&#39;s particularly useful when you need to quickly jump between different namespaces or resource types during troubleshooting.</p>
<p>Five minutes a day is all it takes to stay ahead of most cluster problems. Make this health check part of your daily routine and you&#39;ll catch issues before they blow up and before your pager goes off at 3 a.m. Regular monitoring helps you understand your cluster&#39;s normal behavior, making it easier to spot anomalies when they occur.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Right-Sizing Kubernetes Resources with VPA and Karpenter]]></title>
      <link>https://devops-daily.com/posts/right-sizing-kubernetes-resources-vpa-karpenter</link>
      <description><![CDATA[Overprovisioned CPU and memory in Kubernetes increases costs and reduces efficiency. Learn how to use Vertical Pod Autoscaler, Karpenter, and monitoring tools to balance performance and resource usage.]]></description>
      <pubDate>Sun, 10 Aug 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/right-sizing-kubernetes-resources-vpa-karpenter</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Autoscaling]]></category><category><![CDATA[Karpenter]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Setting CPU and memory requests too high in Kubernetes wastes money and reduces cluster efficiency. This guide shows you how to identify overprovisioned workloads, use Vertical Pod Autoscaler (VPA) to right-size your pods, and implement Karpenter for smarter node scaling. You&#39;ll also learn to monitor costs and validate your improvements with real metrics.</p>
<p>When you set resource requests too conservatively in Kubernetes, your cluster reserves more capacity than workloads actually need. This leads to underutilized nodes and higher cloud bills. The problem gets worse at scale - imagine 200 pods each requesting 2 CPU cores but only using 200m. That&#39;s 400 reserved cores when actual demand is closer to 40 cores.</p>
<p>The solution involves right-sizing both your pods and nodes. You&#39;ll use monitoring data to understand actual usage, apply VPA to adjust pod requests automatically, and leverage Karpenter to provision nodes that match your workload requirements.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before you start, make sure you have:</p>
<ul>
<li>A Kubernetes cluster (version 1.20 or higher) with metrics-server installed</li>
<li>kubectl configured with admin access to your cluster</li>
<li>Prometheus and Grafana deployed for monitoring (or similar observability stack)</li>
<li>Basic understanding of Kubernetes resource requests and limits</li>
</ul>
<p>You&#39;ll also need the ability to install cluster-wide components like VPA and Karpenter.</p>
<h2 id="h2-identifying-overprovisioned-workloads" class="group relative scroll-mt-24">
        <a href="#h2-identifying-overprovisioned-workloads" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Identifying Overprovisioned Workloads
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-identifying-overprovisioned-workloads"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The first step is understanding how your current workloads use resources compared to what they request. You can start with kubectl to get a quick snapshot of resource usage across your cluster.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check current resource usage for all nodes</span>
kubectl top nodes

<span class="hljs-comment"># View pod resource usage across all namespaces</span>
kubectl top pods --all-namespaces --sort-by=cpu

<span class="hljs-comment"># Get detailed resource requests vs usage for a specific namespace</span>
kubectl describe nodes | grep -A 15 <span class="hljs-string">&quot;Allocated resources&quot;</span>
</code></pre><p>These commands show you the gap between requested and actual resource usage. If you see pods consistently using 50Mi of memory while requesting 1Gi, or using 100m CPU while requesting 1000m, those are prime candidates for right-sizing.</p>
<p>For deeper analysis, you&#39;ll want historical data from Prometheus. Here are some key queries to run in your Grafana dashboard:</p>
<pre><code class="hljs language-promql"># CPU utilization percentage (actual usage vs requests)
(rate(container_cpu_usage_seconds_total{container!=&quot;&quot;}[5m]) * 100) /
(container_spec_cpu_quota{container!=&quot;&quot;} / container_spec_cpu_period{container!=&quot;&quot;})

# Memory utilization percentage
(container_memory_working_set_bytes{container!=&quot;&quot;} * 100) /
container_spec_memory_limit_bytes{container!=&quot;&quot;}

# Top 10 pods with the highest request-to-usage ratio (biggest waste)
topk(10,
  (container_spec_cpu_quota{container!=&quot;&quot;} / container_spec_cpu_period{container!=&quot;&quot;}) /
  rate(container_cpu_usage_seconds_total{container!=&quot;&quot;}[5m])
)
</code></pre><p>Run these queries over a 2-week period to account for traffic variations and identify consistent patterns. Workloads running at 10-20% utilization with stable traffic are good candidates for optimization.</p>
<h2 id="h2-installing-and-configuring-vpa" class="group relative scroll-mt-24">
        <a href="#h2-installing-and-configuring-vpa" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installing and Configuring VPA
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-installing-and-configuring-vpa"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Vertical Pod Autoscaler analyzes your workloads and recommends optimal CPU and memory values. Start by installing VPA in your cluster.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone the VPA repository</span>
git <span class="hljs-built_in">clone</span> https://github.com/kubernetes/autoscaler.git
<span class="hljs-built_in">cd</span> autoscaler/vertical-pod-autoscaler

<span class="hljs-comment"># Deploy VPA components</span>
./hack/vpa-up.sh
</code></pre><p>This script installs three main components: the VPA recommender (analyzes usage), the updater (applies changes), and the admission controller (validates recommendations).</p>
<p>Next, create a VPA configuration for a workload you want to optimize. Start with recommendation mode to see suggested values before making changes.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># vpa-web-service.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">autoscaling.k8s.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">VerticalPodAutoscaler</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">web-service-vpa</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">production</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">targetRef:</span>
    <span class="hljs-attr">apiVersion:</span> <span class="hljs-string">&#x27;apps/v1&#x27;</span>
    <span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">web-service</span>
  <span class="hljs-attr">updatePolicy:</span>
    <span class="hljs-attr">updateMode:</span> <span class="hljs-string">&#x27;Off&#x27;</span> <span class="hljs-comment"># Only provide recommendations, don&#x27;t auto-update</span>
  <span class="hljs-attr">resourcePolicy:</span>
    <span class="hljs-attr">containerPolicies:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">containerName:</span> <span class="hljs-string">web-app</span>
        <span class="hljs-comment"># Set boundaries to prevent extreme recommendations</span>
        <span class="hljs-attr">maxAllowed:</span>
          <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;2&#x27;</span>
          <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;4Gi&#x27;</span>
        <span class="hljs-attr">minAllowed:</span>
          <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;100m&#x27;</span>
          <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;128Mi&#x27;</span>
        <span class="hljs-attr">controlledResources:</span> [<span class="hljs-string">&#x27;cpu&#x27;</span>, <span class="hljs-string">&#x27;memory&#x27;</span>]
</code></pre><p>Apply the VPA configuration and wait for recommendations to generate:</p>
<pre><code class="hljs language-bash">kubectl apply -f vpa-web-service.yaml

<span class="hljs-comment"># Wait a few minutes, then check recommendations</span>
kubectl describe vpa web-service-vpa -n production
</code></pre><p>The output shows recommended values for CPU and memory under the <code>Status</code> section. VPA typically suggests values based on the 90th percentile of usage over the past 8 days, which provides a safety buffer while eliminating waste.</p>
<h2 id="h2-applying-vpa-recommendations-safely" class="group relative scroll-mt-24">
        <a href="#h2-applying-vpa-recommendations-safely" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Applying VPA Recommendations Safely
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-applying-vpa-recommendations-safely"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once you have solid recommendations, you can apply them gradually. Start with non-critical workloads and monitor for any issues.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Update your deployment with VPA recommendations</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">apps/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">web-service</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">production</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">replicas:</span> <span class="hljs-number">3</span>
  <span class="hljs-attr">selector:</span>
    <span class="hljs-attr">matchLabels:</span>
      <span class="hljs-attr">app:</span> <span class="hljs-string">web-service</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">app:</span> <span class="hljs-string">web-service</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">containers:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">web-app</span>
          <span class="hljs-attr">image:</span> <span class="hljs-string">nginx:1.21</span>
          <span class="hljs-attr">resources:</span>
            <span class="hljs-attr">requests:</span>
              <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;250m&#x27;</span> <span class="hljs-comment"># Reduced from 1000m based on VPA recommendation</span>
              <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;512Mi&#x27;</span> <span class="hljs-comment"># Reduced from 2Gi based on VPA recommendation</span>
            <span class="hljs-attr">limits:</span>
              <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;500m&#x27;</span> <span class="hljs-comment"># Set limits 2x requests for burst capacity</span>
              <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;1Gi&#x27;</span>
</code></pre><p>After updating requests, monitor your workloads for at least a week. Watch for:</p>
<ul>
<li>Increased pod restarts or OOMKilled events</li>
<li>Higher response times or error rates</li>
<li>Pods getting evicted under memory pressure</li>
</ul>
<p>If everything runs smoothly, you can switch VPA to automatic mode:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Update VPA to automatically apply changes</span>
kubectl patch vpa web-service-vpa -n production --<span class="hljs-built_in">type</span>=<span class="hljs-string">&#x27;merge&#x27;</span> -p=<span class="hljs-string">&#x27;{&quot;spec&quot;:{&quot;updatePolicy&quot;:{&quot;updateMode&quot;:&quot;Auto&quot;}}}&#x27;</span>
</code></pre><p>In Auto mode, VPA will restart pods when it detects they need different resource allocations. Make sure you have proper PodDisruptionBudgets in place to maintain availability during updates.</p>
<h2 id="h2-setting-up-karpenter-for-node-optimization" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-karpenter-for-node-optimization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Karpenter for Node Optimization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-karpenter-for-node-optimization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>While VPA optimizes individual pods, Karpenter optimizes your entire node infrastructure. Instead of fixed node groups, Karpenter provisions nodes dynamically based on your workload requirements.</p>
<p>First, install Karpenter in your cluster. The exact steps depend on your cloud provider, but here&#39;s the process for AWS EKS:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install Karpenter using Helm</span>
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter \
  --version <span class="hljs-string">&quot;0.32.0&quot;</span> \
  --namespace <span class="hljs-string">&quot;karpenter&quot;</span> \
  --create-namespace \
  --<span class="hljs-built_in">set</span> <span class="hljs-string">&quot;settings.clusterName=<span class="hljs-variable">${CLUSTER_NAME}</span>&quot;</span> \
  --<span class="hljs-built_in">set</span> <span class="hljs-string">&quot;settings.interruptionQueueName=<span class="hljs-variable">${CLUSTER_NAME}</span>&quot;</span> \
  --<span class="hljs-built_in">wait</span>
</code></pre><p>Next, create a NodePool that defines what types of nodes Karpenter can provision:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># karpenter-nodepool.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">karpenter.sh/v1beta1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">NodePool</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">general-purpose</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-comment"># Template for nodes Karpenter will create</span>
  <span class="hljs-attr">template:</span>
    <span class="hljs-attr">metadata:</span>
      <span class="hljs-attr">labels:</span>
        <span class="hljs-attr">node-type:</span> <span class="hljs-string">general-purpose</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-comment"># Instance requirements - Karpenter will pick the best fit</span>
      <span class="hljs-attr">requirements:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">kubernetes.io/arch</span>
          <span class="hljs-attr">operator:</span> <span class="hljs-string">In</span>
          <span class="hljs-attr">values:</span> [<span class="hljs-string">&#x27;amd64&#x27;</span>]
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">karpenter.sh/capacity-type</span>
          <span class="hljs-attr">operator:</span> <span class="hljs-string">In</span>
          <span class="hljs-attr">values:</span> [<span class="hljs-string">&#x27;spot&#x27;</span>, <span class="hljs-string">&#x27;on-demand&#x27;</span>] <span class="hljs-comment"># Allow both for cost optimization</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">node.kubernetes.io/instance-type</span>
          <span class="hljs-attr">operator:</span> <span class="hljs-string">In</span>
          <span class="hljs-attr">values:</span> [<span class="hljs-string">&#x27;m6i.large&#x27;</span>, <span class="hljs-string">&#x27;m6i.xlarge&#x27;</span>, <span class="hljs-string">&#x27;m6i.2xlarge&#x27;</span>, <span class="hljs-string">&#x27;r6i.large&#x27;</span>, <span class="hljs-string">&#x27;r6i.xlarge&#x27;</span>]

      <span class="hljs-comment"># Node configuration</span>
      <span class="hljs-attr">nodeClassRef:</span>
        <span class="hljs-attr">apiVersion:</span> <span class="hljs-string">karpenter.k8s.aws/v1beta1</span>
        <span class="hljs-attr">kind:</span> <span class="hljs-string">EC2NodeClass</span>
        <span class="hljs-attr">name:</span> <span class="hljs-string">general-purpose</span>

      <span class="hljs-comment"># Taints to control which pods can schedule here</span>
      <span class="hljs-attr">taints:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-attr">key:</span> <span class="hljs-string">karpenter.sh/unschedulable</span>
          <span class="hljs-attr">value:</span> <span class="hljs-string">&#x27;true&#x27;</span>
          <span class="hljs-attr">effect:</span> <span class="hljs-string">NoSchedule</span>

  <span class="hljs-comment"># Scaling and disruption policies</span>
  <span class="hljs-attr">limits:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-number">1000</span> <span class="hljs-comment"># Maximum CPU across all nodes in this pool</span>
  <span class="hljs-attr">disruption:</span>
    <span class="hljs-attr">consolidationPolicy:</span> <span class="hljs-string">WhenUnderutilized</span>
    <span class="hljs-attr">consolidateAfter:</span> <span class="hljs-string">30s</span>
</code></pre><p>Create the corresponding EC2NodeClass for AWS-specific configuration:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># karpenter-nodeclass.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">karpenter.k8s.aws/v1beta1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">EC2NodeClass</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">general-purpose</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-comment"># AMI and instance configuration</span>
  <span class="hljs-attr">amiFamily:</span> <span class="hljs-string">AL2</span>
  <span class="hljs-attr">subnetSelectorTerms:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">tags:</span>
        <span class="hljs-attr">karpenter.sh/discovery:</span> <span class="hljs-string">&#x27;${CLUSTER_NAME}&#x27;</span>
  <span class="hljs-attr">securityGroupSelectorTerms:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">tags:</span>
        <span class="hljs-attr">karpenter.sh/discovery:</span> <span class="hljs-string">&#x27;${CLUSTER_NAME}&#x27;</span>

  <span class="hljs-comment"># Instance store configuration</span>
  <span class="hljs-attr">userData:</span> <span class="hljs-string">|
    #!/bin/bash
    /etc/eks/bootstrap.sh ${CLUSTER_NAME}
</span>
  <span class="hljs-comment"># Tags for cost tracking</span>
  <span class="hljs-attr">tags:</span>
    <span class="hljs-attr">Team:</span> <span class="hljs-string">platform</span>
    <span class="hljs-attr">Environment:</span> <span class="hljs-string">production</span>
</code></pre><p>Apply both configurations:</p>
<pre><code class="hljs language-bash">kubectl apply -f karpenter-nodepool.yaml
kubectl apply -f karpenter-nodeclass.yaml
</code></pre><p>Karpenter will now monitor unschedulable pods and provision appropriately-sized nodes. When you deploy workloads with right-sized resource requests (thanks to VPA), Karpenter will select smaller, more cost-effective instances.</p>
<h2 id="h2-monitoring-cost-impact" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-cost-impact" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring Cost Impact
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-cost-impact"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To validate your optimizations, you need visibility into resource costs. Kubecost provides detailed insights into how much each workload costs and how much capacity you&#39;re wasting.</p>
<p>Install Kubecost in your cluster:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Add the Kubecost Helm repository</span>
helm repo add kubecost https://kubecost.github.io/cost-analyzer/

<span class="hljs-comment"># Install Kubecost with Prometheus integration</span>
helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost \
  --create-namespace \
  --<span class="hljs-built_in">set</span> kubecostToken=<span class="hljs-string">&quot;your-token-here&quot;</span> \
  --<span class="hljs-built_in">set</span> prometheus.server.global.external_labels.cluster_id=<span class="hljs-string">&quot;<span class="hljs-variable">${CLUSTER_NAME}</span>&quot;</span>
</code></pre><p>Access the Kubecost UI by port-forwarding:</p>
<pre><code class="hljs language-bash">kubectl port-forward -n kubecost deployment/kubecost-cost-analyzer 9090:9090
</code></pre><p>In the Kubecost dashboard, focus on these key metrics:</p>
<ul>
<li><strong>Efficiency scores</strong>: Shows the percentage of requested resources actually being used</li>
<li><strong>Idle costs</strong>: Money spent on provisioned but unused resources</li>
<li><strong>Right-sizing recommendations</strong>: Suggestions for adjusting requests and limits</li>
<li><strong>Namespace costs</strong>: Helps identify which teams or applications drive costs</li>
</ul>
<p>Track these metrics before and after implementing VPA and Karpenter to quantify your savings.</p>
<h2 id="h2-real-world-optimization-example" class="group relative scroll-mt-24">
        <a href="#h2-real-world-optimization-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Optimization Example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-optimization-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Let&#39;s walk through optimizing a typical microservice deployment. You start with a Node.js API that was conservatively configured:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Before optimization</span>
<span class="hljs-attr">resources:</span>
  <span class="hljs-attr">requests:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;1000m&#x27;</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;2Gi&#x27;</span>
  <span class="hljs-attr">limits:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;2000m&#x27;</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;4Gi&#x27;</span>
</code></pre><p>After running this workload for two weeks, your monitoring shows:</p>
<ul>
<li>Average CPU usage: 150m (15% of requests)</li>
<li>Average memory usage: 400Mi (20% of requests)</li>
<li>Peak CPU usage: 300m</li>
<li>Peak memory usage: 800Mi</li>
</ul>
<p>Based on this data, VPA recommends:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># VPA recommendations (with safety buffer)</span>
<span class="hljs-attr">resources:</span>
  <span class="hljs-attr">requests:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;200m&#x27;</span> <span class="hljs-comment"># Covers 99th percentile usage</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;512Mi&#x27;</span> <span class="hljs-comment"># Accounts for memory spikes</span>
  <span class="hljs-attr">limits:</span>
    <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;400m&#x27;</span> <span class="hljs-comment"># 2x requests for burst capacity</span>
    <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;1Gi&#x27;</span> <span class="hljs-comment"># Prevents OOM while allowing growth</span>
</code></pre><p>The cost impact for 20 replicas of this service:</p>
<ul>
<li><strong>Before</strong>: 20 CPU cores, 40Gi memory requested</li>
<li><strong>After</strong>: 4 CPU cores, 10Gi memory requested</li>
<li><strong>Savings</strong>: 80% reduction in resource allocation</li>
</ul>
<p>With Karpenter managing nodes, this workload now runs on smaller instances, further reducing costs by eliminating the need for oversized nodes.</p>
<h2 id="h2-setting-resource-quotas-and-guardrails" class="group relative scroll-mt-24">
        <a href="#h2-setting-resource-quotas-and-guardrails" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Resource Quotas and Guardrails
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-resource-quotas-and-guardrails"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>As you roll out right-sizing across your organization, implement quotas to prevent teams from reverting to oversized requests:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># namespace-quota.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">ResourceQuota</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">backend-team-quota</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">backend</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">hard:</span>
    <span class="hljs-attr">requests.cpu:</span> <span class="hljs-string">&#x27;50&#x27;</span> <span class="hljs-comment"># Total CPU requests across all pods</span>
    <span class="hljs-attr">requests.memory:</span> <span class="hljs-string">&#x27;100Gi&#x27;</span> <span class="hljs-comment"># Total memory requests</span>
    <span class="hljs-attr">limits.cpu:</span> <span class="hljs-string">&#x27;100&#x27;</span> <span class="hljs-comment"># Total CPU limits</span>
    <span class="hljs-attr">limits.memory:</span> <span class="hljs-string">&#x27;200Gi&#x27;</span> <span class="hljs-comment"># Total memory limits</span>
    <span class="hljs-attr">pods:</span> <span class="hljs-string">&#x27;100&#x27;</span> <span class="hljs-comment"># Maximum number of pods</span>
</code></pre><p>You can also create LimitRanges to enforce reasonable defaults:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># limit-range.yaml</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">LimitRange</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">pod-limits</span>
  <span class="hljs-attr">namespace:</span> <span class="hljs-string">backend</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">limits:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">type:</span> <span class="hljs-string">Container</span>
      <span class="hljs-attr">default:</span> <span class="hljs-comment"># Default limits if not specified</span>
        <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;500m&#x27;</span>
        <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;1Gi&#x27;</span>
      <span class="hljs-attr">defaultRequest:</span> <span class="hljs-comment"># Default requests if not specified</span>
        <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;100m&#x27;</span>
        <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;256Mi&#x27;</span>
      <span class="hljs-attr">max:</span> <span class="hljs-comment"># Maximum allowed values</span>
        <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;4&#x27;</span>
        <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;8Gi&#x27;</span>
      <span class="hljs-attr">min:</span> <span class="hljs-comment"># Minimum required values</span>
        <span class="hljs-attr">cpu:</span> <span class="hljs-string">&#x27;50m&#x27;</span>
        <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;64Mi&#x27;</span>
</code></pre><p>These guardrails help maintain optimization gains while giving teams flexibility within reasonable bounds.</p>
<h2 id="h2-troubleshooting-common-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-common-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Common Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-common-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When implementing VPA and Karpenter, you might encounter some challenges. Here are solutions to the most common problems:</p>
<p><strong>VPA recommendations seem too aggressive</strong>: VPA sometimes suggests very low values during low-traffic periods. Check that your monitoring data covers representative traffic patterns. You can also adjust the VPA algorithm:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">spec:</span>
  <span class="hljs-attr">resourcePolicy:</span>
    <span class="hljs-attr">containerPolicies:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">containerName:</span> <span class="hljs-string">web-app</span>
        <span class="hljs-attr">controlledValues:</span> <span class="hljs-string">RequestsOnly</span> <span class="hljs-comment"># Only adjust requests, leave limits alone</span>
        <span class="hljs-attr">mode:</span> <span class="hljs-string">Auto</span>
</code></pre><p><strong>Karpenter nodes aren&#39;t scaling down</strong>: This usually happens when pods can&#39;t be evicted. Check for:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Look for pods without PodDisruptionBudgets</span>
kubectl get pods --all-namespaces -o wide | grep -v Terminating

<span class="hljs-comment"># Check for pods using local storage or host networking</span>
kubectl get pods --all-namespaces -o yaml | grep -A 5 hostNetwork

<span class="hljs-comment"># Verify PodDisruptionBudgets allow eviction</span>
kubectl get pdb --all-namespaces
</code></pre><p><strong>Pods getting OOMKilled after VPA optimization</strong>: This indicates VPA recommendations were too low. Temporarily increase memory requests and check for memory leaks in your application:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check recent OOM events</span>
kubectl get events --sort-by=.metadata.creationTimestamp | grep OOMKilled

<span class="hljs-comment"># Monitor memory usage patterns</span>
kubectl top pods --sort-by=memory --all-namespaces
</code></pre><p>You can make VPA more conservative by setting higher safety margins:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">spec:</span>
  <span class="hljs-attr">resourcePolicy:</span>
    <span class="hljs-attr">containerPolicies:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">containerName:</span> <span class="hljs-string">web-app</span>
        <span class="hljs-attr">maxAllowed:</span>
          <span class="hljs-attr">memory:</span> <span class="hljs-string">&#x27;2Gi&#x27;</span> <span class="hljs-comment"># Set a reasonable upper bound</span>
</code></pre><h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you have VPA and Karpenter working together, consider these additional optimizations:</p>
<ul>
<li><strong>Horizontal Pod Autoscaling</strong>: Combine with VPA to handle both vertical and horizontal scaling</li>
<li><strong>Cluster Autoscaler tuning</strong>: If using multiple node provisioners, configure them to work together</li>
<li><strong>Cost alerts</strong>: Set up notifications when resource costs exceed thresholds</li>
<li><strong>Regular reviews</strong>: Schedule monthly reviews of VPA recommendations and cost reports</li>
</ul>
<p>You can also explore more advanced Karpenter features like multiple NodePools for different workload types (CPU-intensive, memory-intensive, GPU workloads) and spot instance strategies for non-critical workloads.</p>
<p>The key is to treat right-sizing as an ongoing process. As your applications evolve and traffic patterns change, continue monitoring and adjusting to maintain optimal resource utilization.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Free Up a TCP/IP Port on Linux, macOS, and Windows]]></title>
      <link>https://devops-daily.com/posts/how-to-free-up-tcp-port</link>
      <description><![CDATA[Learn how to identify processes using a port and free it up by stopping the service, killing the process, or changing configuration across different operating systems.]]></description>
      <pubDate>Mon, 21 Jul 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-free-up-tcp-port</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[Linux]]></category><category><![CDATA[macOS]]></category><category><![CDATA[Windows]]></category><category><![CDATA[Ports]]></category><category><![CDATA[Troubleshooting]]></category>
      <content:encoded><![CDATA[<p><strong>TLDR:</strong> Find the process using the port with <code>lsof -i :PORT</code> (Linux/macOS) or <code>netstat -ano | findstr :PORT</code> (Windows), then kill it with <code>kill PID</code> or <code>taskkill /PID pid</code>. For persistent services, stop them properly with <code>systemctl stop service</code> or the Services manager. Always identify what&#39;s using the port before killing it to avoid disrupting important services.</p>
<p>When you try to start a server or application and see &quot;address already in use&quot; or &quot;port already in use,&quot; something else is bound to that port. Here&#39;s how to find what&#39;s using it and free it up.</p>
<h2 id="h2-linux-find-and-free-ports" class="group relative scroll-mt-24">
        <a href="#h2-linux-find-and-free-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Linux: Find and Free Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-linux-find-and-free-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-find-what39s-using-the-port" class="group relative scroll-mt-24">
        <a href="#h3-find-what39s-using-the-port" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Find What&#39;s Using the Port
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-find-what39s-using-the-port"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The most straightforward tool is <code>lsof</code> (list open files):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find what&#x27;s using port 8080</span>
<span class="hljs-built_in">sudo</span> lsof -i :8080

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME</span>
<span class="hljs-comment"># node    12345  john   21u  IPv4  98765      0t0  TCP *:8080 (LISTEN)</span>
</code></pre><p>This tells you:</p>
<ul>
<li><code>COMMAND</code>: The program name (<code>node</code>)</li>
<li><code>PID</code>: Process ID (<code>12345</code>)</li>
<li><code>USER</code>: Who owns the process (<code>john</code>)</li>
<li>The port is in <code>LISTEN</code> state</li>
</ul>
<p>If you prefer <code>ss</code> (socket statistics):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find listening process on port 8080</span>
<span class="hljs-built_in">sudo</span> ss -tulpn | grep :8080

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># tcp   LISTEN  0  128  *:8080  *:*  users:((&quot;node&quot;,pid=12345,fd=21))</span>
</code></pre><p>Or use <code>netstat</code> (older but still available):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find listening process on port 8080</span>
<span class="hljs-built_in">sudo</span> netstat -tulpn | grep :8080

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># tcp  0  0  0.0.0.0:8080  0.0.0.0:*  LISTEN  12345/node</span>
</code></pre><h3 id="h3-kill-the-process" class="group relative scroll-mt-24">
        <a href="#h3-kill-the-process" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kill the Process
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kill-the-process"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Once you have the PID, you can kill the process:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Gracefully terminate (allows cleanup)</span>
<span class="hljs-built_in">kill</span> 12345

<span class="hljs-comment"># Force kill if it doesn&#x27;t respond</span>
<span class="hljs-built_in">kill</span> -9 12345

<span class="hljs-comment"># Or in one command if you&#x27;re certain:</span>
<span class="hljs-built_in">sudo</span> lsof -ti :8080 | xargs <span class="hljs-built_in">kill</span> -9
</code></pre><p>The <code>-t</code> flag tells <code>lsof</code> to output only PIDs, making it easy to pipe to <code>kill</code>.</p>
<h3 id="h3-stop-a-system-service" class="group relative scroll-mt-24">
        <a href="#h3-stop-a-system-service" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Stop a System Service
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stop-a-system-service"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If the port is used by a system service, use <code>systemctl</code> instead of killing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check if it&#x27;s a systemd service</span>
systemctl status nginx

<span class="hljs-comment"># Stop the service gracefully</span>
<span class="hljs-built_in">sudo</span> systemctl stop nginx

<span class="hljs-comment"># Prevent it from starting on boot</span>
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">disable</span> nginx

<span class="hljs-comment"># Or stop and disable in one command</span>
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">disable</span> --now nginx
</code></pre><p>Stopping via <code>systemctl</code> is cleaner than killing - it allows proper shutdown and cleanup.</p>
<h3 id="h3-check-for-services-running-in-docker" class="group relative scroll-mt-24">
        <a href="#h3-check-for-services-running-in-docker" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check for Services Running in Docker
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-for-services-running-in-docker"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re using Docker, the port might be occupied by a container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List containers using port mapping</span>
docker ps --format <span class="hljs-string">&quot;table {{.ID}}\t{{.Names}}\t{{.Ports}}&quot;</span>

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># CONTAINER ID   NAMES      PORTS</span>
<span class="hljs-comment"># a1b2c3d4e5f6   webapp     0.0.0.0:8080-&gt;80/tcp</span>

<span class="hljs-comment"># Stop the container</span>
docker stop a1b2c3d4e5f6

<span class="hljs-comment"># Or stop by name</span>
docker stop webapp
</code></pre><h2 id="h2-macos-find-and-free-ports" class="group relative scroll-mt-24">
        <a href="#h2-macos-find-and-free-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          macOS: Find and Free Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-macos-find-and-free-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>macOS uses the same tools as Linux:</p>
<h3 id="h3-find-what39s-using-the-port" class="group relative scroll-mt-24">
        <a href="#h3-find-what39s-using-the-port" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Find What&#39;s Using the Port
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-find-what39s-using-the-port"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Find process using port 3000</span>
lsof -i :3000

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME</span>
<span class="hljs-comment"># node    56789  sarah  21u  IPv4 0xabcdef123      0t0  TCP *:3000 (LISTEN)</span>
</code></pre><p>You don&#39;t need <code>sudo</code> on macOS for <code>lsof</code> if you own the process.</p>
<h3 id="h3-kill-the-process" class="group relative scroll-mt-24">
        <a href="#h3-kill-the-process" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kill the Process
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kill-the-process"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Kill by PID</span>
<span class="hljs-built_in">kill</span> 56789

<span class="hljs-comment"># Or force kill</span>
<span class="hljs-built_in">kill</span> -9 56789

<span class="hljs-comment"># One-liner to kill whatever&#x27;s on port 3000</span>
lsof -ti :3000 | xargs <span class="hljs-built_in">kill</span> -9
</code></pre><h3 id="h3-stop-macos-services" class="group relative scroll-mt-24">
        <a href="#h3-stop-macos-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Stop macOS Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stop-macos-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For system services:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List running services</span>
launchctl list | grep -i apache

<span class="hljs-comment"># Stop Apache (example)</span>
<span class="hljs-built_in">sudo</span> apachectl stop

<span class="hljs-comment"># Or for other services</span>
<span class="hljs-built_in">sudo</span> launchctl unload /Library/LaunchDaemons/com.example.service.plist
</code></pre><h2 id="h2-windows-find-and-free-ports" class="group relative scroll-mt-24">
        <a href="#h2-windows-find-and-free-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Windows: Find and Free Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-windows-find-and-free-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Windows uses different tools but the concept is the same.</p>
<h3 id="h3-find-what39s-using-the-port" class="group relative scroll-mt-24">
        <a href="#h3-find-what39s-using-the-port" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Find What&#39;s Using the Port
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-find-what39s-using-the-port"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-cmd"><span class="hljs-comment">REM Find process using port 8080</span>
netstat -ano | <span class="hljs-built_in">findstr</span> :<span class="hljs-number">8080</span>
<span class="hljs-comment">
REM Output:</span>
<span class="hljs-comment">REM TCP    0.0.0.0:8080    0.0.0.0:0    LISTENING    5432</span>
<span class="hljs-comment">REM                                                   ^^^^</span>
<span class="hljs-comment">REM                                                   PID</span>
</code></pre><p>The last column is the process ID (PID). To find out what program that is:</p>
<pre><code class="hljs language-cmd"><span class="hljs-comment">REM Get process details</span>
tasklist /FI &quot;PID eq <span class="hljs-number">5432</span>&quot;
<span class="hljs-comment">
REM Output:</span>
<span class="hljs-comment">REM Image Name           PID Session Name     Session#    Mem Usage</span>
<span class="hljs-comment">REM node.exe            5432 Console                 1     45,678 K</span>
</code></pre><p>Or use PowerShell for a cleaner view:</p>
<pre><code class="hljs language-powershell"><span class="hljs-comment"># Find what&#x27;s using port 8080</span>
<span class="hljs-built_in">Get-NetTCPConnection</span> <span class="hljs-literal">-LocalPort</span> <span class="hljs-number">8080</span> |
    <span class="hljs-built_in">Select-Object</span> LocalAddress, LocalPort, State, OwningProcess,
        <span class="hljs-selector-tag">@</span>{Name=<span class="hljs-string">&quot;ProcessName&quot;</span>;Expression={(<span class="hljs-built_in">Get-Process</span> <span class="hljs-literal">-Id</span> <span class="hljs-variable">$_</span>.OwningProcess).Name}}

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># LocalAddress LocalPort State   OwningProcess ProcessName</span>
<span class="hljs-comment"># 0.0.0.0           8080 Listen          5432 node</span>
</code></pre><h3 id="h3-kill-the-process" class="group relative scroll-mt-24">
        <a href="#h3-kill-the-process" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Kill the Process
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-kill-the-process"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-cmd"><span class="hljs-comment">REM Kill process by PID</span>
<span class="hljs-built_in">taskkill</span> /PID <span class="hljs-number">5432</span>
<span class="hljs-comment">
REM Force kill if it doesn&#x27;t respond</span>
<span class="hljs-built_in">taskkill</span> /PID <span class="hljs-number">5432</span> /F
<span class="hljs-comment">
REM Kill by process name (kills all instances)</span>
<span class="hljs-built_in">taskkill</span> /IM node.exe /F
</code></pre><p>In PowerShell:</p>
<pre><code class="hljs language-powershell"><span class="hljs-comment"># Kill process by PID</span>
<span class="hljs-built_in">Stop-Process</span> <span class="hljs-literal">-Id</span> <span class="hljs-number">5432</span>

<span class="hljs-comment"># Force kill</span>
<span class="hljs-built_in">Stop-Process</span> <span class="hljs-literal">-Id</span> <span class="hljs-number">5432</span> <span class="hljs-literal">-Force</span>

<span class="hljs-comment"># Kill all node processes</span>
<span class="hljs-built_in">Stop-Process</span> <span class="hljs-literal">-Name</span> node <span class="hljs-literal">-Force</span>
</code></pre><h3 id="h3-stop-windows-services" class="group relative scroll-mt-24">
        <a href="#h3-stop-windows-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Stop Windows Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stop-windows-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For system services, use the Services manager or command line:</p>
<pre><code class="hljs language-cmd"><span class="hljs-comment">REM Stop a service</span>
<span class="hljs-built_in">net</span> stop &quot;Apache2.<span class="hljs-number">4</span>&quot;
<span class="hljs-comment">
REM Or use sc (service control)</span>
sc stop Apache2.<span class="hljs-number">4</span>
</code></pre><p>In PowerShell:</p>
<pre><code class="hljs language-powershell"><span class="hljs-comment"># Stop a service</span>
<span class="hljs-built_in">Stop-Service</span> <span class="hljs-literal">-Name</span> <span class="hljs-string">&quot;Apache2.4&quot;</span>

<span class="hljs-comment"># Stop and disable</span>
<span class="hljs-built_in">Stop-Service</span> <span class="hljs-literal">-Name</span> <span class="hljs-string">&quot;Apache2.4&quot;</span>
<span class="hljs-built_in">Set-Service</span> <span class="hljs-literal">-Name</span> <span class="hljs-string">&quot;Apache2.4&quot;</span> <span class="hljs-literal">-StartupType</span> Disabled
</code></pre><p>Or use the GUI:</p>
<ol>
<li>Press <code>Win+R</code>, type <code>services.msc</code>, press Enter</li>
<li>Find the service in the list</li>
<li>Right-click → Stop</li>
</ol>
<h2 id="h2-common-port-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-common-port-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Port Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-port-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-port-80443-httphttps" class="group relative scroll-mt-24">
        <a href="#h3-port-80443-httphttps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 80/443 (HTTP/HTTPS)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-80443-httphttps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Usually occupied by a web server:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Linux/macOS</span>
<span class="hljs-built_in">sudo</span> lsof -i :80
<span class="hljs-built_in">sudo</span> lsof -i :443

<span class="hljs-comment"># Likely culprits: apache2, nginx, httpd</span>

<span class="hljs-comment"># Stop Apache</span>
<span class="hljs-built_in">sudo</span> systemctl stop apache2   <span class="hljs-comment"># Ubuntu/Debian</span>
<span class="hljs-built_in">sudo</span> systemctl stop httpd      <span class="hljs-comment"># RHEL/CentOS</span>

<span class="hljs-comment"># Stop NGINX</span>
<span class="hljs-built_in">sudo</span> systemctl stop nginx
</code></pre><p>On Windows, check IIS:</p>
<pre><code class="hljs language-cmd"><span class="hljs-comment">REM Stop IIS</span>
iisreset /stop
<span class="hljs-comment">
REM Or stop the service</span>
<span class="hljs-built_in">net</span> stop W3SVC
</code></pre><h3 id="h3-port-3000-development-servers" class="group relative scroll-mt-24">
        <a href="#h3-port-3000-development-servers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 3000 (Development Servers)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-3000-development-servers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Often used by Node.js, React, Rails:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find and kill</span>
lsof -ti :3000 | xargs <span class="hljs-built_in">kill</span> -9

<span class="hljs-comment"># Or on Windows</span>
netstat -ano | findstr :3000
taskkill /PID &lt;pid&gt; /F
</code></pre><h3 id="h3-port-5432-postgresql" class="group relative scroll-mt-24">
        <a href="#h3-port-5432-postgresql" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 5432 (PostgreSQL)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-5432-postgresql"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Linux</span>
<span class="hljs-built_in">sudo</span> systemctl stop postgresql

<span class="hljs-comment"># macOS (Homebrew)</span>
brew services stop postgresql

<span class="hljs-comment"># Windows</span>
net stop postgresql-x64-13
</code></pre><h3 id="h3-port-3306-mysql" class="group relative scroll-mt-24">
        <a href="#h3-port-3306-mysql" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 3306 (MySQL)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-3306-mysql"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Linux</span>
<span class="hljs-built_in">sudo</span> systemctl stop mysql

<span class="hljs-comment"># macOS</span>
brew services stop mysql

<span class="hljs-comment"># Windows</span>
net stop MySQL80
</code></pre><h3 id="h3-port-6379-redis" class="group relative scroll-mt-24">
        <a href="#h3-port-6379-redis" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 6379 (Redis)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-6379-redis"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Linux</span>
<span class="hljs-built_in">sudo</span> systemctl stop redis

<span class="hljs-comment"># macOS</span>
brew services stop redis

<span class="hljs-comment"># Windows</span>
redis-cli shutdown
</code></pre><h2 id="h2-preventing-port-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-preventing-port-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Preventing Port Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-preventing-port-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-configure-services-to-use-different-ports" class="group relative scroll-mt-24">
        <a href="#h3-configure-services-to-use-different-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Configure Services to Use Different Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-configure-services-to-use-different-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Instead of killing processes, change port configurations:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># NGINX - edit /etc/nginx/sites-available/default</span>
server {
    listen 8080;  <span class="hljs-comment"># Changed from 80</span>
    ...
}

<span class="hljs-comment"># Restart to apply</span>
<span class="hljs-built_in">sudo</span> systemctl restart nginx
</code></pre><p>For Node.js apps:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// Use environment variable for port</span>
<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">PORT</span> = process.<span class="hljs-property">env</span>.<span class="hljs-property">PORT</span> || <span class="hljs-number">3000</span>;
app.<span class="hljs-title function_">listen</span>(<span class="hljs-variable constant_">PORT</span>);
</code></pre><p>Then start with a different port:</p>
<pre><code class="hljs language-bash">PORT=3001 node app.js
</code></pre><h3 id="h3-use-docker-port-mapping" class="group relative scroll-mt-24">
        <a href="#h3-use-docker-port-mapping" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use Docker Port Mapping
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-docker-port-mapping"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Map container ports to different host ports:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Map container port 80 to host port 8080</span>
docker run -p 8080:80 nginx

<span class="hljs-comment"># Multiple containers on different host ports</span>
docker run -p 8080:80 nginx
docker run -p 8081:80 nginx
</code></pre><h3 id="h3-check-ports-before-starting" class="group relative scroll-mt-24">
        <a href="#h3-check-ports-before-starting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check Ports Before Starting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-ports-before-starting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># start-server.sh - Check port before starting</span>

PORT=8080

<span class="hljs-keyword">if</span> lsof -Pi :<span class="hljs-variable">$PORT</span> -sTCP:LISTEN -t &gt;/dev/null ; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Port <span class="hljs-variable">$PORT</span> is already in use&quot;</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Process using port:&quot;</span>
    lsof -i :<span class="hljs-variable">$PORT</span>
    <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">else</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Port <span class="hljs-variable">$PORT</span> is available&quot;</span>
    ./start-my-server.sh --port <span class="hljs-variable">$PORT</span>
<span class="hljs-keyword">fi</span>
</code></pre><h2 id="h2-when-ports-won39t-free-up" class="group relative scroll-mt-24">
        <a href="#h2-when-ports-won39t-free-up" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Ports Won&#39;t Free Up
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-ports-won39t-free-up"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Sometimes a port stays in TIME_WAIT state after you kill the process:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check port state</span>
<span class="hljs-built_in">sudo</span> ss -tan | grep :8080

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># TIME-WAIT  0      0      192.168.1.10:8080     192.168.1.100:54321</span>
</code></pre><p>TIME_WAIT prevents immediate reuse of the port. Wait 30-120 seconds, or use <code>SO_REUSEADDR</code> in your application:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, <span class="hljs-number">1</span>)
sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
</code></pre><p>This lets your application bind immediately after the previous instance closed.</p>
<h2 id="h2-safety-checks-before-killing" class="group relative scroll-mt-24">
        <a href="#h2-safety-checks-before-killing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Safety Checks Before Killing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-safety-checks-before-killing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Always verify what you&#39;re killing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check process details</span>
ps aux | grep 12345

<span class="hljs-comment"># Check what files it has open</span>
lsof -p 12345

<span class="hljs-comment"># Check command line arguments</span>
<span class="hljs-built_in">cat</span> /proc/12345/cmdline | <span class="hljs-built_in">tr</span> <span class="hljs-string">&#x27;\0&#x27;</span> <span class="hljs-string">&#x27; &#x27;</span>
</code></pre><p>Don&#39;t kill processes unless you know what they are:</p>
<ul>
<li>System services might cause issues if killed</li>
<li>Databases could corrupt data if not shut down properly</li>
<li>Other users&#39; processes aren&#39;t yours to kill (on shared systems)</li>
</ul>
<h2 id="h2-automating-port-cleanup" class="group relative scroll-mt-24">
        <a href="#h2-automating-port-cleanup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Automating Port Cleanup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-automating-port-cleanup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For development, create a helper script:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># free-port.sh - Free up a port</span>

PORT=<span class="hljs-variable">$1</span>

<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$PORT</span>&quot;</span> ]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Usage: <span class="hljs-variable">$0</span> &lt;port&gt;&quot;</span>
    <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">fi</span>

<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Finding process using port <span class="hljs-variable">$PORT</span>...&quot;</span>
PID=$(lsof -ti :<span class="hljs-variable">$PORT</span>)

<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$PID</span>&quot;</span> ]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;No process is using port <span class="hljs-variable">$PORT</span>&quot;</span>
    <span class="hljs-built_in">exit</span> 0
<span class="hljs-keyword">fi</span>

<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Port <span class="hljs-variable">$PORT</span> is used by PID <span class="hljs-variable">$PID</span>&quot;</span>
ps -p <span class="hljs-variable">$PID</span> -o <span class="hljs-built_in">comm</span>=

<span class="hljs-built_in">read</span> -p <span class="hljs-string">&quot;Kill this process? (y/n) &quot;</span> -n 1 -r
<span class="hljs-built_in">echo</span>

<span class="hljs-keyword">if</span> [[ <span class="hljs-variable">$REPLY</span> =~ ^[Yy]$ ]]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">kill</span> <span class="hljs-variable">$PID</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Process killed&quot;</span>
<span class="hljs-keyword">else</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Cancelled&quot;</span>
<span class="hljs-keyword">fi</span>
</code></pre><p>Usage:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">chmod</span> +x free-port.sh
./free-port.sh 8080
</code></pre><p>The key to freeing up a port is identifying what&#39;s using it first, then deciding the appropriate action - stopping a service cleanly, killing a hung process, or reconfiguring to use a different port. Always verify what you&#39;re stopping to avoid breaking production services or other users&#39; work.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The Hidden Costs of Over-Automation in DevOps]]></title>
      <link>https://devops-daily.com/posts/designing-automation-with-failure-in-mind</link>
      <description><![CDATA[Automation speeds things up, but too much of it can hide failures, slow incident response, and add fragile layers you have to maintain.]]></description>
      <pubDate>Mon, 14 Jul 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/designing-automation-with-failure-in-mind</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[CI/CD]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Terraform]]></category><category><![CDATA[SRE]]></category>
      <content:encoded><![CDATA[<p>A small Friday change to a feature flag UI shipped with a schema migration riding along. The pipeline auto-promoted staging to production without a human in the loop. Payments started timing out because a column used by a background job was dropped. Nobody noticed for an hour because alerts were green at the service level but red downstream. It was not a tooling failure. It was an over-automation failure.</p>
<p><strong>TLDR:</strong><br>Automation is great when it cuts repetition and enforces consistency. It hurts when it hides context, removes deliberate checks, or blocks manual control during incidents. In this guide you will map where over-automation creeps in, use a simple decision framework, add practical guardrails to a Kubernetes CI/CD workflow, and keep a minimum viable manual path for emergencies.</p>
<hr>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Basic GitHub Actions or similar CI runner</li>
<li>A Kubernetes cluster with <code>kubectl</code> access and two namespaces: <code>staging</code> and <code>production</code></li>
<li>A container registry, for example <code>registry.devops-daily.com</code></li>
<li>Optional but helpful: Prometheus and Alertmanager, or a hosted equivalent</li>
</ul>
<h2 id="h2-why-over-automation-happens" class="group relative scroll-mt-24">
        <a href="#h2-why-over-automation-happens" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why over-automation happens
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-over-automation-happens"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Teams rarely decide to over-automate on purpose. It accumulates:</p>
<ul>
<li>Tool enthusiasm - scripts, bots, and YAML for every edge case.</li>
<li>Velocity pressure - remove each manual step to hit dates.</li>
<li>Fear of human error - take humans out of the loop entirely.</li>
<li>Ownership gaps - nobody revisits whether an automation still helps.</li>
</ul>
<p>The real cost is not the one-time setup. It is the ongoing cognitive load and the time you will spend debugging opaque pipelines when you are already under pressure.</p>
<pre><code>
commit -&gt; build -&gt; test -&gt; tag -&gt; push -&gt; deploy(prod)

+--&gt; notify(slack) [green regardless of prod health]
</code></pre><p>If a quiet failure happens early, the rest might still run with stale artifacts or incomplete state.</p>
<h2 id="h2-warning-signs-you-went-too-far" class="group relative scroll-mt-24">
        <a href="#h2-warning-signs-you-went-too-far" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Warning signs you went too far
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-warning-signs-you-went-too-far"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Production feels like a black box, and folks avoid manual access even during an incident.</li>
<li>A trivial change requires multiple pipeline runs across repos.</li>
<li>Rollbacks are slower than forward deploys because nobody remembers the manual commands.</li>
<li>Onboarding depends on scripts rather than understanding how things work.</li>
</ul>
<h2 id="h2-a-simple-decision-framework" class="group relative scroll-mt-24">
        <a href="#h2-a-simple-decision-framework" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A simple decision framework
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-a-simple-decision-framework"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before you add automation, answer five questions:</p>
<ol>
<li><strong>Frequency</strong> - How often is this done? Frequent tasks are strong candidates.</li>
<li><strong>Risk</strong> - What happens if this is wrong? High blast radius often needs a human check.</li>
<li><strong>Transparency</strong> - Will this hide details that matter during incidents?</li>
<li><strong>Recovery path</strong> - Can we recover fast if the automation fails or misfires?</li>
<li><strong>Ownership</strong> - Who will maintain it, and where is the runbook?</li>
</ol>
<p>A practical rule: automate repetitive, low-risk, well-understood tasks. Keep rare, high-impact, or ambiguous tasks semi-manual with a clear runbook and a fast path.</p>
<h2 id="h2-add-guardrails-to-a-kubernetes-cicd-workflow" class="group relative scroll-mt-24">
        <a href="#h2-add-guardrails-to-a-kubernetes-cicd-workflow" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Add guardrails to a Kubernetes CI/CD workflow
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-add-guardrails-to-a-kubernetes-cicd-workflow"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>We will start with a common pattern and evolve it.</p>
<h3 id="h3-1-straight-to-prod-pipeline-and-why-it-bites" class="group relative scroll-mt-24">
        <a href="#h3-1-straight-to-prod-pipeline-and-why-it-bites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1) Straight-to-prod pipeline, and why it bites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-straight-to-prod-pipeline-and-why-it-bites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This job builds, pushes, and deploys every <code>main</code> commit to production. It is fast, but unforgiving.</p>
<p>Before the code, a quick note: this pattern removes human review and makes bad commits instantly live. It is useful for internal tools with very low risk. It is risky for user-facing services.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># .github/workflows/deploy.yml</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">deploy</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build_deploy:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>

      <span class="hljs-comment"># Build and push the image tagged by commit SHA</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">push</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          docker build -t registry.devops-daily.com/payments-api:${GITHUB_SHA} .
          docker push registry.devops-daily.com/payments-api:${GITHUB_SHA}
</span>
      <span class="hljs-comment"># Deploy to production, no gates</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">prod</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          kubectl set image deployment/payments-api \
            payments-api=registry.devops-daily.com/payments-api:${GITHUB_SHA}
          kubectl rollout status deployment/payments-api --timeout=90s</span>
</code></pre><h3 id="h3-2-safer-pattern-with-staging-promotion-and-a-kill-switch" class="group relative scroll-mt-24">
        <a href="#h3-2-safer-pattern-with-staging-promotion-and-a-kill-switch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2) Safer pattern with staging, promotion, and a kill switch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-safer-pattern-with-staging-promotion-and-a-kill-switch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>We keep speed to staging, add a manual promotion to production, and wire a simple kill switch. This gives you time to validate and a fast path to stop rollout.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># .github/workflows/release.yml</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">release</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">workflow_dispatch:</span>
    <span class="hljs-attr">inputs:</span>
      <span class="hljs-attr">promote:</span>
        <span class="hljs-attr">description:</span> <span class="hljs-string">&#x27;Promote the current staging image to production&#x27;</span>
        <span class="hljs-attr">required:</span> <span class="hljs-literal">false</span>
        <span class="hljs-attr">default:</span> <span class="hljs-string">&#x27;false&#x27;</span>

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build_and_stage:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>

      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">push</span> <span class="hljs-string">image</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          set -euo pipefail
          IMAGE=registry.devops-daily.com/payments-api:${GITHUB_SHA}
          docker build -t &quot;${IMAGE}&quot; .
          docker push &quot;${IMAGE}&quot;
          echo &quot;IMAGE=${IMAGE}&quot; &gt;&gt; $GITHUB_ENV
</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">staging</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          set -euo pipefail
          kubectl -n staging set image deployment/payments-api \
            payments-api=${IMAGE}
          kubectl -n staging rollout status deployment/payments-api --timeout=120s
</span>
  <span class="hljs-attr">promote_to_prod:</span>
    <span class="hljs-attr">needs:</span> <span class="hljs-string">build_and_stage</span>
    <span class="hljs-attr">if:</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.event.inputs.promote</span> <span class="hljs-string">==</span> <span class="hljs-string">&#x27;true&#x27;</span> <span class="hljs-string">}}</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">production</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          set -euo pipefail
          kubectl -n production annotate deployment/payments-api \
            devops-daily.com/kill-switch=&quot;false&quot; --overwrite
          kubectl -n production set image deployment/payments-api \
            payments-api=${{ env.IMAGE }}
          kubectl -n production rollout status deployment/payments-api --timeout=180s</span>
</code></pre><p>Why this matters:</p>
<ul>
<li>Staging deploy is automatic and quick.</li>
<li>Production needs an explicit click. That small pause reduces blast radius.</li>
<li>The <code>kill-switch</code> annotation gives you a single place to gate traffic or stop a rollout in custom controllers or sidecars.</li>
</ul>
<h3 id="h3-3-canary-rollout-with-instant-rollback" class="group relative scroll-mt-24">
        <a href="#h3-3-canary-rollout-with-instant-rollback" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3) Canary rollout with instant rollback
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-canary-rollout-with-instant-rollback"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Short canaries catch common errors. We will do a canary with 10 percent traffic, validate, then proceed.</p>
<p>Before the code, note that canaries are only as good as your checks. Pair them with synthetic checks and error rate alerts.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># Kustomize snippet for production canary</span>
<span class="hljs-comment"># overlays/production/kustomization.yaml</span>
<span class="hljs-attr">resources:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">../../base</span>
<span class="hljs-attr">patches:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">target:</span>
      <span class="hljs-attr">kind:</span> <span class="hljs-string">Deployment</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">payments-api</span>
    <span class="hljs-attr">patch:</span> <span class="hljs-string">|
      - op: replace
        path: /spec/replicas
        value: 10
      - op: add
        path: /spec/template/metadata/labels/canary
        value: &quot;true&quot;</span>
</code></pre><p>Roll forward and roll back with clear commands during a page:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Promote canary to full rollout</span>
kubectl -n production scale deployment/payments-api --replicas=30

<span class="hljs-comment"># Instant rollback to previous ReplicaSet</span>
kubectl -n production rollout undo deployment/payments-api

<span class="hljs-comment"># When in doubt, pause the rollout and route traffic away if your ingress supports it</span>
kubectl -n production rollout pause deployment/payments-api
</code></pre><h3 id="h3-4-wire-alerts-that-align-with-deploys" class="group relative scroll-mt-24">
        <a href="#h3-4-wire-alerts-that-align-with-deploys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4) Wire alerts that align with deploys
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-wire-alerts-that-align-with-deploys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You want alerts that fire during the window when bad deploys show up, not hours later.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># PrometheusRule example: error budget friendly alert</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">alert:</span> <span class="hljs-string">PaymentsHighErrorRate</span>
  <span class="hljs-attr">expr:</span> <span class="hljs-string">sum(rate(http_requests_total{app=&quot;payments-api&quot;,</span> <span class="hljs-string">status=~&quot;5..&quot;}[5m]))</span>
    <span class="hljs-string">/</span> <span class="hljs-string">sum(rate(http_requests_total{app=&quot;payments-api&quot;}[5m]))</span> <span class="hljs-string">&gt;</span> <span class="hljs-number">0.05</span>
  <span class="hljs-attr">for:</span> <span class="hljs-string">4m</span>
  <span class="hljs-attr">labels:</span>
    <span class="hljs-attr">severity:</span> <span class="hljs-string">page</span>
  <span class="hljs-attr">annotations:</span>
    <span class="hljs-attr">summary:</span> <span class="hljs-string">&#x27;payments-api 5xx above 5 percent&#x27;</span>
    <span class="hljs-attr">description:</span> <span class="hljs-string">&#x27;Check the last deploy and canary logs. Consider rollback.&#x27;</span>
</code></pre><p>Pipe deploy outcomes to chat for shared awareness:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Simple Slack webhook call after deploy step</span>
curl -X POST -H <span class="hljs-string">&#x27;Content-type: application/json&#x27;</span> \
  --data <span class="hljs-string">&quot;{\&quot;text\&quot;:\&quot;payments-api deploy to production: <span class="hljs-variable">${GITHUB_SHA}</span> ✅\&quot;}&quot;</span> \
  <span class="hljs-string">&quot;<span class="hljs-variable">$SLACK_WEBHOOK_URL</span>&quot;</span>
</code></pre><h2 id="h2-keep-a-minimum-viable-manual-path" class="group relative scroll-mt-24">
        <a href="#h2-keep-a-minimum-viable-manual-path" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Keep a minimum viable manual path
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-keep-a-minimum-viable-manual-path"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When automation fails, you do not want to rediscover commands. Keep a tiny runbook and a Makefile target that never bitrots.</p>
<p>Explain why: these commands are your seatbelt. They also help onboarding, incident drills, and audits.</p>
<pre><code class="hljs language-makefile"><span class="hljs-comment"># Makefile at repo root</span>
IMAGE=registry.devops-daily.com/payments-api

<span class="hljs-section">deploy-staging:</span>
	kubectl -n staging set image deployment/payments-api payments-api=<span class="hljs-variable">$(IMAGE)</span>:<span class="hljs-variable">$(TAG)</span>
	kubectl -n staging rollout status deployment/payments-api --timeout=120s

<span class="hljs-section">deploy-prod:</span>
	kubectl -n production set image deployment/payments-api payments-api=<span class="hljs-variable">$(IMAGE)</span>:<span class="hljs-variable">$(TAG)</span>
	kubectl -n production rollout status deployment/payments-api --timeout=180s

<span class="hljs-section">rollback-prod:</span>
	kubectl -n production rollout undo deployment/payments-api
</code></pre><p>Usage:</p>
<pre><code class="hljs language-bash">TAG=$(git rev-parse --short HEAD) make deploy-staging
TAG=$(git rev-parse --short HEAD) make deploy-prod
make rollback-prod
</code></pre><h2 id="h2-terraform-note-avoid-automating-away-intent" class="group relative scroll-mt-24">
        <a href="#h2-terraform-note-avoid-automating-away-intent" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terraform note: avoid automating away intent
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-terraform-note-avoid-automating-away-intent"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>It is tempting to auto-apply Terraform plans on every merge. That hides intent and can mask drift or surprise deletes.</p>
<p>Prefer this flow:</p>
<pre><code>plan (PR comment) -&gt; human review -&gt; apply from CI runner with a single approved commit
</code></pre><p>Why: you keep visibility and still run applies from a clean environment. If you must auto-apply, scope it to low-risk workspaces and require a <code>terraform plan</code> artifact to be attached to the job logs for audit.</p>
<p>Helpful snippet to store plans and surface them for review:</p>
<pre><code class="hljs language-bash">terraform init
terraform plan -out=tfplan.bin
terraform show -json tfplan.bin &gt; tfplan.json
<span class="hljs-comment"># Upload tfplan.json as a build artifact for PR review</span>
</code></pre><h2 id="h2-a-short-checklist-for-any-new-automation-pr" class="group relative scroll-mt-24">
        <a href="#h2-a-short-checklist-for-any-new-automation-pr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          A short checklist for any new automation PR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-a-short-checklist-for-any-new-automation-pr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>What problem does this automation solve today, and how will we know if it stops helping later?</li>
<li>What is the manual fallback, documented as a runbook with tested commands?</li>
<li>What signals do we log or emit so failures are obvious?</li>
<li>How do we disable or bypass this quickly during an incident?</li>
<li>Who owns it, and when will we revisit it?</li>
</ul>
<h2 id="h2-tie-it-together" class="group relative scroll-mt-24">
        <a href="#h2-tie-it-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Tie it together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tie-it-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Over-automation hides the very details you need under stress. Add light friction where it protects users, like a promotion gate. Keep a manual path you can run in muscle memory. Log and alert where it matters, near deploys and canaries. Automation should amplify your team, not replace your judgment.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[The 10 Most Common DevOps Mistakes (And How to Avoid Them in 2025)]]></title>
      <link>https://devops-daily.com/posts/devops-mistakes-2025</link>
      <description><![CDATA[Explore the top 10 DevOps mistakes made in 2025 and learn how to avoid them to ensure a smoother DevOps journey.]]></description>
      <pubDate>Sat, 12 Jul 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/devops-mistakes-2025</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Best Practices]]></category>
      <content:encoded><![CDATA[<p>DevOps isn&#39;t just about shipping code faster, it&#39;s about doing it smarter, safer, and saner. But let&#39;s be real: even the best teams make mistakes. Some are harmless. Others take down production on a Friday afternoon (yes, <em>that</em> Friday deploy).</p>
<p>Here are 10 common DevOps mistakes in 2025, how to avoid them, and a few moments that might hit a little too close to home.</p>
<hr>
<h2 id="h2-1-treating-infrastructure-as-code-like-a-one-off-script" class="group relative scroll-mt-24">
        <a href="#h2-1-treating-infrastructure-as-code-like-a-one-off-script" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Treating Infrastructure as Code Like a One-Off Script
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-1-treating-infrastructure-as-code-like-a-one-off-script"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You wrote Terraform once, it worked, and now it lives untouched in a dusty repo folder. That&#39;s not IaC, that&#39;s tech debt.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Version control your IaC.</li>
<li>Apply formatting and linting.</li>
<li>Test it with tools like <code>terraform plan</code> or <code>terratest</code>.</li>
</ul>
<p><img src="https://media1.tenor.com/m/eqLNYv0A9TQAAAAC/swap-indiana-jones.gif" alt="Please don&#39;t do this"></p>
<hr>
<h2 id="h2-2-not-enforcing-version-control-on-cicd-configs" class="group relative scroll-mt-24">
        <a href="#h2-2-not-enforcing-version-control-on-cicd-configs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Not Enforcing Version Control on CI/CD Configs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-2-not-enforcing-version-control-on-cicd-configs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your pipeline files are changing, but without versioning, there&#39;s no easy way to debug regressions.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Store all CI/CD config files (like GitHub Actions, GitLab CI, etc.) in version control.</li>
<li>Treat pipeline logic like any other critical code.</li>
</ul>
<p><img src="https://media1.tenor.com/m/QksvKPK6N8AAAAAC/vitruvius-the-lego-movie.gif" alt="Where did that config go?"></p>
<hr>
<h2 id="h2-3-poor-secrets-management" class="group relative scroll-mt-24">
        <a href="#h2-3-poor-secrets-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Poor Secrets Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-3-poor-secrets-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Hardcoding secrets in code or using <code>.env</code> files without encryption is a fast way to land on HN for the wrong reasons.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Use Vault, Doppler, AWS Secrets Manager, or SOPS.</li>
<li>Rotate secrets regularly.</li>
</ul>
<p><img src="https://media1.tenor.com/m/MYZgsN2TDJAAAAAC/this-is.gif" alt="It&#39;s fine"></p>
<hr>
<h2 id="h2-4-no-rollback-strategy" class="group relative scroll-mt-24">
        <a href="#h2-4-no-rollback-strategy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. No Rollback Strategy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-4-no-rollback-strategy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You deploy. Something breaks. And there&#39;s no plan B.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Use blue-green or canary deployments.</li>
<li>Automate rollbacks on failure.</li>
<li>Always have a <code>rollback.sh</code> or previous image ready.</li>
</ul>
<p><img src="https://media1.tenor.com/m/_naabXNYkNgAAAAd/pressing-button-nick-zetta.gif" alt=""></p>
<hr>
<h2 id="h2-5-ignoring-observability-until-it39s-too-late" class="group relative scroll-mt-24">
        <a href="#h2-5-ignoring-observability-until-it39s-too-late" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Ignoring Observability Until It&#39;s Too Late
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-5-ignoring-observability-until-it39s-too-late"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Monitoring isn&#39;t just about uptime. You can&#39;t fix what you can&#39;t see.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Add metrics, logs, and traces from day one.</li>
<li>Use tools like Prometheus, Grafana, and OpenTelemetry.</li>
</ul>
<p><img src="https://media1.tenor.com/m/1SDTHgTkXP4AAAAd/vae.gif" alt=""></p>
<hr>
<h2 id="h2-6-too-many-tools-not-enough-integration" class="group relative scroll-mt-24">
        <a href="#h2-6-too-many-tools-not-enough-integration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          6. Too Many Tools, Not Enough Integration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-6-too-many-tools-not-enough-integration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Your stack has 25 tools. None of them talk to each other. And your alert fatigue is real.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Consolidate tools where possible.</li>
<li>Favor tools that integrate well with your existing stack.</li>
</ul>
<p><img src="https://media1.tenor.com/m/F-tesxQoJqAAAAAd/too-many-counting.gif" alt=""></p>
<hr>
<h2 id="h2-7-manual-approval-for-every-tiny-change" class="group relative scroll-mt-24">
        <a href="#h2-7-manual-approval-for-every-tiny-change" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          7. Manual Approval for Every Tiny Change
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-7-manual-approval-for-every-tiny-change"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A typo fix shouldn&#39;t need a 3-person review and a Slack war.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Set up clear policies: auto-approve safe changes, gate critical ones.</li>
<li>Use GitHub environments, OPA, or custom bots to help.</li>
</ul>
<p><img src="https://media1.tenor.com/m/g3NKdGzu8_0AAAAd/sloth-slow.gif" alt="The sloth from Zootopia slowly stamping papers"></p>
<hr>
<h2 id="h2-8-no-documentation-single-point-of-failure" class="group relative scroll-mt-24">
        <a href="#h2-8-no-documentation-single-point-of-failure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          8. No Documentation = Single Point of Failure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-8-no-documentation-single-point-of-failure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>&quot;Ask Alex, they built it.&quot; Alex is on vacation.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Write docs as you go.</li>
<li>Use tools like Backstage, Docusaurus, or just plain Markdown.</li>
<li>Encourage a culture of async knowledge sharing.</li>
</ul>
<p><img src="https://media1.tenor.com/m/qSAwTMlTw4YAAAAC/confused-john-travolta.gif" alt=""></p>
<hr>
<h2 id="h2-9-skipping-tests-for-infrastructure-changes" class="group relative scroll-mt-24">
        <a href="#h2-9-skipping-tests-for-infrastructure-changes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          9. Skipping Tests for Infrastructure Changes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-9-skipping-tests-for-infrastructure-changes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You test app code, but deploy infra changes directly to prod? Bold.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Use staging or preview environments.</li>
<li>Test IaC with <code>checkov</code>, <code>terratest</code>, or <code>kitchen</code>.</li>
</ul>
<p><img src="https://media1.tenor.com/m/xwVqrLrU8H0AAAAC/funny-frozen.gif" alt=""></p>
<hr>
<h2 id="h2-10-forgetting-security-in-your-pipelines" class="group relative scroll-mt-24">
        <a href="#h2-10-forgetting-security-in-your-pipelines" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          10. Forgetting Security in Your Pipelines
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-10-forgetting-security-in-your-pipelines"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your pipeline can deploy to prod, attackers might be able to as well.</p>
<p><strong>Avoid it</strong>:</p>
<ul>
<li>Use least privilege for pipeline credentials.</li>
<li>Run security checks like <code>trivy</code>, <code>semgrep</code>, and <code>snyk</code>.</li>
</ul>
<p><img src="https://i.imgflip.com/a0o3d6.jpg" alt=""></p>
<hr>
<h3 id="h3-final-thoughts" class="group relative scroll-mt-24">
        <a href="#h3-final-thoughts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Final Thoughts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-final-thoughts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>DevOps is a journey. These mistakes are all lessons learned the hard way by teams around the world, and probably you, if you&#39;ve been around long enough.</p>
<p>Want to avoid these mistakes before they cost you time, sleep, or your weekend? We&#39;re building checklists, guides, and battle-tested content at <a href="https://devops-daily.com">DevOps Daily</a>. Come hang out.</p>
<p><strong>PS</strong>: Got a DevOps horror story or lesson to share? Drop it in the comments or tag us on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Get a List of All Valid IP Addresses in a Local Network?]]></title>
      <link>https://devops-daily.com/posts/how-to-get-a-list-of-all-valid-ip-addresses-in-a-local-network</link>
      <description><![CDATA[Discover active devices on your local network using tools like nmap, arp-scan, and native OS commands. Learn network scanning techniques for inventory management, security audits, and troubleshooting.]]></description>
      <pubDate>Thu, 10 Jul 2025 09:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-get-a-list-of-all-valid-ip-addresses-in-a-local-network</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[Security]]></category><category><![CDATA[Network Scanning]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Tools]]></category>
      <content:encoded><![CDATA[<p>Finding all active IP addresses on your local network is useful for network administration, troubleshooting connectivity issues, identifying unauthorized devices, or simply seeing what&#39;s connected to your network. Whether you&#39;re managing a home network or an enterprise environment, several tools can help you discover active hosts.</p>
<p>This guide covers different methods to scan your local network and identify which IP addresses are in use.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use <code>nmap -sn 192.168.1.0/24</code> to scan your local network and find active hosts. For faster ARP-based scanning, use <code>sudo arp-scan --localnet</code>. On Windows, combine <code>arp -a</code> with ping sweeps. These tools discover devices by sending network packets and analyzing responses.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need basic networking knowledge (understanding IP addresses, subnets, and CIDR notation). Access to your local network and permission to scan it is required. Some tools need administrator or root privileges.</p>
<h2 id="h2-understanding-your-network-range" class="group relative scroll-mt-24">
        <a href="#h2-understanding-your-network-range" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Your Network Range
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-your-network-range"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before scanning, identify your network range. Your local network typically uses private IP address ranges:</p>
<pre><code>192.168.0.0/16    (192.168.0.0 - 192.168.255.255)
172.16.0.0/12     (172.16.0.0 - 172.31.255.255)
10.0.0.0/8        (10.0.0.0 - 10.255.255.255)
</code></pre><p>Most home networks use <code>192.168.1.0/24</code> (192.168.1.1 - 192.168.1.254) or similar.</p>
<p>Find your network range:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Linux/macOS</span>
ip addr show
<span class="hljs-comment"># or</span>
ifconfig

<span class="hljs-comment"># Windows</span>
ipconfig
</code></pre><p>Look for your IP address and subnet mask:</p>
<pre><code>inet 192.168.1.100/24
</code></pre><p>The <code>/24</code> means the first 24 bits are the network portion, giving you 256 possible addresses (192.168.1.0 through 192.168.1.255).</p>
<h2 id="h2-using-nmap-for-network-discovery" class="group relative scroll-mt-24">
        <a href="#h2-using-nmap-for-network-discovery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using nmap for Network Discovery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-nmap-for-network-discovery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Nmap is the most versatile network scanning tool available. It&#39;s powerful, fast, and provides detailed information about discovered hosts.</p>
<h3 id="h3-basic-host-discovery" class="group relative scroll-mt-24">
        <a href="#h3-basic-host-discovery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Host Discovery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-host-discovery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Scan your entire subnet to find active hosts:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Ping scan (no port scan)</span>
nmap -sn 192.168.1.0/24
</code></pre><p>The <code>-sn</code> flag (formerly <code>-sP</code>) does a ping scan without port scanning, making it faster and less intrusive.</p>
<p>Example output:</p>
<pre><code>Starting Nmap 7.92
Nmap scan report for router.local (192.168.1.1)
Host is up (0.0023s latency).

Nmap scan report for laptop.local (192.168.1.45)
Host is up (0.012s latency).

Nmap scan report for phone.local (192.168.1.87)
Host is up (0.034s latency).

Nmap scan report for printer.local (192.168.1.120)
Host is up (0.056s latency).

Nmap done: 256 IP addresses (4 hosts up) scanned in 2.45 seconds
</code></pre><h3 id="h3-getting-clean-ip-list" class="group relative scroll-mt-24">
        <a href="#h3-getting-clean-ip-list" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Getting Clean IP List
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-getting-clean-ip-list"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Extract just the IP addresses:</p>
<pre><code class="hljs language-bash">nmap -sn 192.168.1.0/24 | grep <span class="hljs-string">&quot;Nmap scan report&quot;</span> | awk <span class="hljs-string">&#x27;{print $5}&#x27;</span>
</code></pre><p>Output:</p>
<pre><code>192.168.1.1
192.168.1.45
192.168.1.87
192.168.1.120
</code></pre><h3 id="h3-including-mac-addresses" class="group relative scroll-mt-24">
        <a href="#h3-including-mac-addresses" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Including MAC Addresses
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-including-mac-addresses"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run with sudo to get MAC addresses:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> nmap -sn 192.168.1.0/24
</code></pre><p>Output includes hardware info:</p>
<pre><code>Nmap scan report for 192.168.1.45
Host is up (0.012s latency).
MAC Address: 00:1A:2B:3C:4D:5E (Apple)
</code></pre><h3 id="h3-faster-scanning" class="group relative scroll-mt-24">
        <a href="#h3-faster-scanning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Faster Scanning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-faster-scanning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Speed up scans by adjusting timing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Aggressive timing (faster but more detectable)</span>
nmap -sn -T4 192.168.1.0/24

<span class="hljs-comment"># Insane timing (very fast, may miss hosts)</span>
nmap -sn -T5 192.168.1.0/24
</code></pre><h2 id="h2-using-arp-scan-for-fast-local-discovery" class="group relative scroll-mt-24">
        <a href="#h2-using-arp-scan-for-fast-local-discovery" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using arp-scan for Fast Local Discovery
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-arp-scan-for-fast-local-discovery"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Arp-scan is faster than nmap for local network discovery because it uses ARP requests, which work at layer 2 and don&#39;t require IP routing.</p>
<h3 id="h3-install-arp-scan" class="group relative scroll-mt-24">
        <a href="#h3-install-arp-scan" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Install arp-scan
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-install-arp-scan"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install arp-scan

<span class="hljs-comment"># Red Hat/CentOS</span>
<span class="hljs-built_in">sudo</span> yum install arp-scan

<span class="hljs-comment"># macOS</span>
brew install arp-scan
</code></pre><h3 id="h3-scan-your-local-network" class="group relative scroll-mt-24">
        <a href="#h3-scan-your-local-network" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scan Your Local Network
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scan-your-local-network"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Scan all local networks</span>
<span class="hljs-built_in">sudo</span> arp-scan --localnet

<span class="hljs-comment"># Or specify interface</span>
<span class="hljs-built_in">sudo</span> arp-scan --interface=eth0 --localnet
</code></pre><p>Output:</p>
<pre><code>Interface: eth0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts
192.168.1.1     00:11:22:33:44:55       TP-LINK TECHNOLOGIES CO.,LTD.
192.168.1.45    00:1A:2B:3C:4D:5E       Apple, Inc.
192.168.1.87    AA:BB:CC:DD:EE:FF       Samsung Electronics Co.,Ltd
192.168.1.120   11:22:33:44:55:66       Hewlett Packard

4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 1.92 seconds
</code></pre><p>Arp-scan is typically faster than nmap for local networks because ARP operates at the data link layer.</p>
<h3 id="h3-scan-specific-range" class="group relative scroll-mt-24">
        <a href="#h3-scan-specific-range" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scan Specific Range
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-scan-specific-range"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Scan a specific range</span>
<span class="hljs-built_in">sudo</span> arp-scan 192.168.1.1-192.168.1.100

<span class="hljs-comment"># Or use CIDR notation</span>
<span class="hljs-built_in">sudo</span> arp-scan 192.168.1.0/24
</code></pre><h2 id="h2-using-native-os-commands" class="group relative scroll-mt-24">
        <a href="#h2-using-native-os-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Native OS Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-native-os-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-linux-arp-and-ping" class="group relative scroll-mt-24">
        <a href="#h3-linux-arp-and-ping" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Linux: arp and ping
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-linux-arp-and-ping"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Combine ping and arp to discover hosts:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Ping sweep the network</span>
<span class="hljs-keyword">for</span> ip <span class="hljs-keyword">in</span> 192.168.1.{1..254}; <span class="hljs-keyword">do</span>
    ping -c 1 -W 1 <span class="hljs-variable">$ip</span> &gt; /dev/null 2&gt;&amp;1 &amp;&amp; <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$ip</span> is up&quot;</span>
<span class="hljs-keyword">done</span>
</code></pre><p>This pings each address once with a 1-second timeout, then reports which responded.</p>
<p>After pinging, check the ARP cache:</p>
<pre><code class="hljs language-bash">arp -a
</code></pre><p>Output:</p>
<pre><code>? (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0
? (192.168.1.45) at 00:1a:2b:3c:4d:5e [ether] on eth0
? (192.168.1.87) at aa:bb:cc:dd:ee:ff [ether] on eth0
</code></pre><h3 id="h3-macos-arp-scan-or-nmap" class="group relative scroll-mt-24">
        <a href="#h3-macos-arp-scan-or-nmap" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          macOS: arp-scan or nmap
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-macos-arp-scan-or-nmap"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>macOS includes arp but doesn&#39;t have arp-scan by default:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install via Homebrew</span>
brew install arp-scan nmap

<span class="hljs-comment"># Then use arp-scan</span>
<span class="hljs-built_in">sudo</span> arp-scan --localnet
</code></pre><p>Or use the native <code>arp -a</code> after a ping sweep:</p>
<pre><code class="hljs language-bash"><span class="hljs-keyword">for</span> ip <span class="hljs-keyword">in</span> 192.168.1.{1..254}; <span class="hljs-keyword">do</span>
    ping -c 1 -t 1 <span class="hljs-variable">$ip</span> &gt; /dev/null 2&gt;&amp;1
<span class="hljs-keyword">done</span>

arp -a
</code></pre><h3 id="h3-windows-powershell-network-scan" class="group relative scroll-mt-24">
        <a href="#h3-windows-powershell-network-scan" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Windows: PowerShell Network Scan
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-windows-powershell-network-scan"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use PowerShell to scan your network:</p>
<pre><code class="hljs language-powershell"><span class="hljs-comment"># Get your network range</span>
<span class="hljs-variable">$network</span> = <span class="hljs-string">&quot;192.168.1&quot;</span>

<span class="hljs-comment"># Ping sweep</span>
<span class="hljs-number">1</span>..<span class="hljs-number">254</span> | <span class="hljs-built_in">ForEach-Object</span> {
    <span class="hljs-variable">$ip</span> = <span class="hljs-string">&quot;<span class="hljs-variable">$network</span>.<span class="hljs-variable">$_</span>&quot;</span>
    <span class="hljs-variable">$ping</span> = <span class="hljs-built_in">Test-Connection</span> <span class="hljs-literal">-ComputerName</span> <span class="hljs-variable">$ip</span> <span class="hljs-literal">-Count</span> <span class="hljs-number">1</span> <span class="hljs-literal">-Quiet</span> <span class="hljs-literal">-TimeoutSeconds</span> <span class="hljs-number">1</span>
    <span class="hljs-keyword">if</span> (<span class="hljs-variable">$ping</span>) {
        <span class="hljs-built_in">Write-Host</span> <span class="hljs-string">&quot;<span class="hljs-variable">$ip</span> is online&quot;</span>
    }
}
</code></pre><p>Check ARP cache after scanning:</p>
<pre><code class="hljs language-powershell">arp <span class="hljs-literal">-a</span>
</code></pre><p>More elegant PowerShell version with parallel execution:</p>
<pre><code class="hljs language-powershell"><span class="hljs-variable">$network</span> = <span class="hljs-string">&quot;192.168.1&quot;</span>
<span class="hljs-variable">$range</span> = <span class="hljs-number">1</span>..<span class="hljs-number">254</span>

<span class="hljs-variable">$range</span> | <span class="hljs-built_in">ForEach-Object</span> <span class="hljs-literal">-Parallel</span> {
    <span class="hljs-variable">$ip</span> = <span class="hljs-string">&quot;<span class="hljs-variable">$using:network</span>.<span class="hljs-variable">$_</span>&quot;</span>
    <span class="hljs-keyword">if</span> (<span class="hljs-built_in">Test-Connection</span> <span class="hljs-literal">-ComputerName</span> <span class="hljs-variable">$ip</span> <span class="hljs-literal">-Count</span> <span class="hljs-number">1</span> <span class="hljs-literal">-Quiet</span> <span class="hljs-literal">-TimeoutSeconds</span> <span class="hljs-number">1</span>) {
        <span class="hljs-variable">$ip</span>
    }
} <span class="hljs-literal">-ThrottleLimit</span> <span class="hljs-number">50</span>
</code></pre><h2 id="h2-using-fping-for-efficient-ping-sweeps" class="group relative scroll-mt-24">
        <a href="#h2-using-fping-for-efficient-ping-sweeps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using fping for Efficient Ping Sweeps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-fping-for-efficient-ping-sweeps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Fping sends pings in parallel, making it much faster than sequential ping:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install fping</span>
<span class="hljs-built_in">sudo</span> apt-get install fping  <span class="hljs-comment"># Debian/Ubuntu</span>
brew install fping          <span class="hljs-comment"># macOS</span>

<span class="hljs-comment"># Scan network</span>
fping -a -g 192.168.1.0/24 2&gt;/dev/null
</code></pre><p>The <code>-a</code> flag shows only alive hosts, <code>-g</code> generates a target list from the CIDR range.</p>
<p>Output:</p>
<pre><code>192.168.1.1
192.168.1.45
192.168.1.87
192.168.1.120
</code></pre><h2 id="h2-python-script-for-network-scanning" class="group relative scroll-mt-24">
        <a href="#h2-python-script-for-network-scanning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Python Script for Network Scanning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-python-script-for-network-scanning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Create a simple network scanner in Python:</p>
<pre><code class="hljs language-python"><span class="hljs-comment">#!/usr/bin/env python3</span>
<span class="hljs-keyword">import</span> subprocess
<span class="hljs-keyword">import</span> ipaddress
<span class="hljs-keyword">from</span> concurrent.futures <span class="hljs-keyword">import</span> ThreadPoolExecutor

<span class="hljs-keyword">def</span> <span class="hljs-title function_">ping_host</span>(<span class="hljs-params">ip</span>):
    <span class="hljs-string">&quot;&quot;&quot;Ping a single host and return IP if alive&quot;&quot;&quot;</span>
    <span class="hljs-keyword">try</span>:
        <span class="hljs-comment"># Use -c 1 for one ping, -W 1 for 1 second timeout</span>
        result = subprocess.run(
            [<span class="hljs-string">&#x27;ping&#x27;</span>, <span class="hljs-string">&#x27;-c&#x27;</span>, <span class="hljs-string">&#x27;1&#x27;</span>, <span class="hljs-string">&#x27;-W&#x27;</span>, <span class="hljs-string">&#x27;1&#x27;</span>, <span class="hljs-built_in">str</span>(ip)],
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
        )
        <span class="hljs-keyword">if</span> result.returncode == <span class="hljs-number">0</span>:
            <span class="hljs-keyword">return</span> <span class="hljs-built_in">str</span>(ip)
    <span class="hljs-keyword">except</span> Exception:
        <span class="hljs-keyword">pass</span>
    <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>

<span class="hljs-keyword">def</span> <span class="hljs-title function_">scan_network</span>(<span class="hljs-params">network</span>):
    <span class="hljs-string">&quot;&quot;&quot;Scan a network range for active hosts&quot;&quot;&quot;</span>
    net = ipaddress.ip_network(network, strict=<span class="hljs-literal">False</span>)
    alive_hosts = []

    <span class="hljs-comment"># Use thread pool for parallel pinging</span>
    <span class="hljs-keyword">with</span> ThreadPoolExecutor(max_workers=<span class="hljs-number">50</span>) <span class="hljs-keyword">as</span> executor:
        results = executor.<span class="hljs-built_in">map</span>(ping_host, net.hosts())

    alive_hosts = [ip <span class="hljs-keyword">for</span> ip <span class="hljs-keyword">in</span> results <span class="hljs-keyword">if</span> ip]
    <span class="hljs-keyword">return</span> alive_hosts

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:
    network = <span class="hljs-string">&#x27;192.168.1.0/24&#x27;</span>
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Scanning <span class="hljs-subst">{network}</span>...&quot;</span>)

    hosts = scan_network(network)

    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;\nFound <span class="hljs-subst">{<span class="hljs-built_in">len</span>(hosts)}</span> active hosts:&quot;</span>)
    <span class="hljs-keyword">for</span> host <span class="hljs-keyword">in</span> hosts:
        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;  <span class="hljs-subst">{host}</span>&quot;</span>)
</code></pre><p>Save as <code>network_scan.py</code> and run:</p>
<pre><code class="hljs language-bash">python3 network_scan.py
</code></pre><h2 id="h2-identifying-devices-by-mac-address" class="group relative scroll-mt-24">
        <a href="#h2-identifying-devices-by-mac-address" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Identifying Devices by MAC Address
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-identifying-devices-by-mac-address"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Once you have IP and MAC addresses, identify manufacturers:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># nmap includes MAC vendor lookup</span>
<span class="hljs-built_in">sudo</span> nmap -sn 192.168.1.0/24 | grep <span class="hljs-string">&quot;MAC Address&quot;</span>
</code></pre><p>Or query online MAC address databases:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Using macvendors.com API</span>
MAC=<span class="hljs-string">&quot;00:1A:2B:3C:4D:5E&quot;</span>
curl -s <span class="hljs-string">&quot;https://api.macvendors.com/<span class="hljs-variable">$MAC</span>&quot;</span>
</code></pre><p>Output: <code>Apple, Inc.</code></p>
<h2 id="h2-security-and-ethical-considerations" class="group relative scroll-mt-24">
        <a href="#h2-security-and-ethical-considerations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Security and Ethical Considerations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security-and-ethical-considerations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Only scan networks you own or have permission to scan</strong>. Unauthorized network scanning can be illegal and may violate terms of service for some networks.</p>
<p><strong>Notify your security team</strong>: In corporate environments, inform your security team before scanning. Automated security systems may flag scanning activity as potential attacks.</p>
<p><strong>Use appropriate timing</strong>: Aggressive scans can impact network performance. Use gentler timing options during business hours.</p>
<p><strong>Respect privacy</strong>: Just because you can see a device doesn&#39;t mean you should try to access it without authorization.</p>
<h2 id="h2-saving-and-comparing-results" class="group relative scroll-mt-24">
        <a href="#h2-saving-and-comparing-results" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Saving and Comparing Results
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-saving-and-comparing-results"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Save scan results to track network changes:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Save to file with timestamp</span>
nmap -sn 192.168.1.0/24 | grep <span class="hljs-string">&quot;Nmap scan report&quot;</span> &gt; scan_$(<span class="hljs-built_in">date</span> +%Y%m%d).txt

<span class="hljs-comment"># Compare with previous scan</span>
diff scan_20250709.txt scan_20250710.txt
</code></pre><p>This helps identify new or missing devices on your network.</p>
<h2 id="h2-troubleshooting-common-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-common-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Common Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-common-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-no-hosts-found" class="group relative scroll-mt-24">
        <a href="#h3-no-hosts-found" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          No hosts found
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-no-hosts-found"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Check if you&#39;re scanning the correct network range:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Verify your IP and subnet</span>
ip addr show
</code></pre><p>Make sure firewalls aren&#39;t blocking your scan:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Temporarily disable firewall (be careful!)</span>
<span class="hljs-built_in">sudo</span> ufw <span class="hljs-built_in">disable</span>  <span class="hljs-comment"># Ubuntu</span>
<span class="hljs-built_in">sudo</span> systemctl stop firewalld  <span class="hljs-comment"># CentOS/RHEL</span>
</code></pre><h3 id="h3-permission-denied" class="group relative scroll-mt-24">
        <a href="#h3-permission-denied" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Permission denied
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-permission-denied"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many scanning tools require root/admin privileges:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Use sudo</span>
<span class="hljs-built_in">sudo</span> nmap -sn 192.168.1.0/24
<span class="hljs-built_in">sudo</span> arp-scan --localnet
</code></pre><h3 id="h3-slow-scans" class="group relative scroll-mt-24">
        <a href="#h3-slow-scans" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Slow scans
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-slow-scans"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Reduce the scope or use faster tools:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Scan smaller range</span>
nmap -sn 192.168.1.1-50

<span class="hljs-comment"># Use arp-scan instead (faster for local networks)</span>
<span class="hljs-built_in">sudo</span> arp-scan --localnet
</code></pre><p>Discovering active IP addresses on your local network is straightforward with the right tools. Nmap provides detailed, flexible scanning capabilities, while arp-scan offers speed for local networks. Choose the tool that fits your needs, always scan responsibly, and remember that network visibility is the first step toward effective network management and security.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[A Day in the Life of a DevOps Engineer]]></title>
      <link>https://devops-daily.com/posts/a-day-in-a-life-of-a-devops-engineer</link>
      <description><![CDATA[Follow a DevOps engineer through a typical day - from morning deployments to midnight hotfixes. Real challenges, real solutions, and real impact on business operations.]]></description>
      <pubDate>Wed, 09 Jul 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/a-day-in-a-life-of-a-devops-engineer</guid>
      <category><![CDATA[DevOps]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[DevOps]]></category><category><![CDATA[Infrastructure]]></category><category><![CDATA[Automation]]></category><category><![CDATA[Monitoring]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Docker]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>This post follows a DevOps engineer through a typical workday. You&#39;ll see how they handle morning deployments, infrastructure scaling, security alerts, and emergency hotfixes. The story covers real scenarios with tools like Kubernetes, Docker, Jenkins, and monitoring systems while showing how DevOps work directly impacts business operations. If you&#39;re curious about what DevOps engineers actually do day-to-day, this realistic walkthrough will give you insights into the challenges, responsibilities, and satisfying moments of the role.</p>
<h2 id="h2-the-day-at-a-glance" class="group relative scroll-mt-24">
        <a href="#h2-the-day-at-a-glance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Day at a Glance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-day-at-a-glance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><pre><code>05:47 AM ⚠️  PagerDuty Alert - API Response Time Critical
07:30 AM 🔧  Emergency Hotfix Deployment
11:30 AM 🔒  Security Incident Response
02:00 PM 📊  Performance Review &amp; Feature Flag Deployment
06:00 PM 🔄  Kubernetes Cluster Maintenance
10:30 PM 🚨  Database Performance Emergency
12:00 AM 💤  Crisis Resolved, Systems Stable
</code></pre><hr>
<p>The phone buzzes at 5:47 AM. Not the alarm - that&#39;s set for 6:00 AM. It&#39;s PagerDuty. The production API response time has crossed the 2-second threshold, and customers are starting to complain on social media.</p>
<p><strong>Sound familiar?</strong> Welcome to Monday morning in the life of a DevOps engineer.</p>
<p>Rolling out of bed, laptop in hand, connecting to the VPN before the coffee even starts brewing. The monitoring dashboard shows a clear pattern: response times started climbing around 5:30 AM, right when the European market opened. The weekend&#39;s supposedly &quot;minor&quot; feature deployment is now causing 40% of API calls to timeout.</p>
<pre><code>Incident Severity Assessment:
┌─────────────────────────────────────────────────────────────┐
│ 🔴 CRITICAL: 40% API timeout rate                           │
│ 📱 Social media complaints increasing                       │
│ 🌍 European market affected (peak hours)                    │
│ ⏰ US market opens in 3 hours                               │
│ 💰 Revenue impact: ~$2,000/minute                           │
└─────────────────────────────────────────────────────────────┘
</code></pre><p><em>This is why DevOps engineers sleep with their phones next to the bed.</em></p>
<h2 id="h2-morning-fire-fighting" class="group relative scroll-mt-24">
        <a href="#h2-morning-fire-fighting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Morning Fire Fighting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-morning-fire-fighting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>🔥 Crisis Mode Activated</strong></p>
<p>The first instinct is to check the application logs. The ELK stack reveals the story immediately. The new payment processing feature is making synchronous calls to a third-party service, and those calls are taking 8-12 seconds to complete. When European users woke up and started making purchases, the connection pool got exhausted.</p>
<pre><code>Payment Flow Issue:
User Request → API Gateway → Payment Service → Third-Party Provider
     ↓              ↓              ↓              ↓
   Fast         Fast         SLOW (8-12s)     TIMEOUT

Connection Pool: [████████████████████] 200/200 (FULL!)
</code></pre><p>A quick check shows 200 active connections - they&#39;ve hit the maximum pool size. This needs an immediate fix while working on the root cause. The temporary solution is to scale up the payment service pods from 3 to 6, buying time to implement a proper fix.</p>
<p>Watching the metrics after applying the scaling change, response times start dropping within two minutes. The immediate crisis is over, but this is just a band-aid. The real fix needs to happen in the application code, requiring coordination with the development team.</p>
<blockquote>
<p><strong>Key Insight</strong>: Sometimes the best solution is the fastest solution. Scaling infrastructure horizontally bought time to implement a proper fix without losing customers.</p>
</blockquote>
<blockquote>
<p><strong>💡 Pro Tip</strong>: Always have a rollback plan ready. In this case, the scaling approach was reversible if it didn&#39;t work, keeping options open during the crisis.</p>
</blockquote>
<hr>
<h2 id="h2-deployment-coordination" class="group relative scroll-mt-24">
        <a href="#h2-deployment-coordination" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deployment Coordination
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deployment-coordination"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>📞 Emergency War Room</strong></p>
<p>By 7:30 AM, the first video call of the day begins with the lead developer and product manager. They&#39;re discussing the hotfix strategy while pulling up the deployment pipeline in Jenkins.</p>
<p>&quot;The payment timeout issue affects roughly 30% of our European customers,&quot; the product manager explains, checking analytics. &quot;We need this fixed before the US market opens, or we&#39;re looking at significant revenue loss.&quot;</p>
<p>The developer has already pushed a fix to the staging branch - making the third-party payment calls asynchronous with proper error handling. The DevOps engineer&#39;s job is to get this through the pipeline safely.</p>
<pre><code>Hotfix Deployment Pipeline:
┌─────────────────────────────────────────────────────────────┐
│ 1. Code Review    ✅ (expedited, focused review)            │
│ 2. Build &amp; Test   ✅ (automated, 5 minutes)                 │
│ 3. Staging Deploy ✅ (integration tests passing)            │
│ 4. Smoke Tests    ✅ (payments working correctly)           │
│ 5. Production     🟡 (waiting for approval)                 │
└─────────────────────────────────────────────────────────────┘
</code></pre><p>The staging deployment goes smoothly. Integration tests pass, and end-to-end tests confirm that payments are now processing correctly with the new asynchronous flow. The green light for production deployment comes at 8:45 AM.</p>
<blockquote>
<p><strong>Key Insight</strong>: Production hotfixes require extra caution. Even with time pressure, proper testing in staging prevented a second incident.</p>
</blockquote>
<blockquote>
<p><strong>🎯 Reality Check</strong>: In emergency situations, communication becomes even more critical. Clear status updates kept all stakeholders informed and aligned.</p>
</blockquote>
<hr>
<h2 id="h2-infrastructure-scaling-challenges" class="group relative scroll-mt-24">
        <a href="#h2-infrastructure-scaling-challenges" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Infrastructure Scaling Challenges
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-infrastructure-scaling-challenges"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>With the payment crisis resolved, attention turns to a brewing infrastructure problem. The marketing team is launching a major campaign next week, expecting a 3x increase in traffic. The current Kubernetes cluster can barely handle normal peak loads.</p>
<p>Opening Terraform to review the current infrastructure setup reveals t3.medium instances that are cost-effective for normal operations but won&#39;t handle the expected load surge. A scaling strategy is needed that can handle the traffic spike without breaking the budget.</p>
<pre><code>Current Infrastructure:
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster                                          │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐             │
│ │ t3.medium   │ │ t3.medium   │ │ t3.medium   │             │
│ │ Node 1      │ │ Node 2      │ │ Node 3      │             │
│ └─────────────┘ └─────────────┘ └─────────────┘             │
│                                                             │
│ Campaign Week (3x traffic) = 💥 OVERLOAD                    │
└─────────────────────────────────────────────────────────────┘

Solution: Pre-provisioned c5.xlarge nodes (scaled to 0 until needed)
</code></pre><p>The plan involves creating a new node group with c5.xlarge instances, pre-created but kept at zero capacity until the campaign starts. This way, they can scale up quickly when needed and scale down immediately after to control costs.</p>
<blockquote>
<p><strong>Key Insight</strong>: Planning for predictable traffic spikes is cheaper than dealing with unexpected outages. Pre-provisioning resources that can be quickly activated saves both money and stress.</p>
</blockquote>
<h2 id="h2-security-alert-response" class="group relative scroll-mt-24">
        <a href="#h2-security-alert-response" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Security Alert Response
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security-alert-response"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>At 11:30 AM, the security monitoring tool flags something suspicious. The intrusion detection system shows unusual network traffic patterns from one of the application servers. Security incidents can escalate quickly, so immediate attention is required.</p>
<p>Initial investigation shows someone is trying to access the MySQL database directly from an external IP. A quick check of security groups and firewall rules shows they look correct - database access should only be allowed from application servers within the VPC. But the logs show connection attempts from a completely different IP range.</p>
<p>Digging deeper into the application logs reveals the issue. A developer accidentally committed database credentials to a public GitHub repository three days ago. The credentials were scraped by automated tools and are now being used for unauthorized access attempts.</p>
<pre><code>Security Incident Timeline:
Day 1: Dev commits credentials → GitHub (public repo)
Day 2: Automated scrapers find credentials
Day 3: Credentials posted on dark web forums
Day 4: Unauthorized access attempts begin ← WE ARE HERE

Threat Actor → Internet → Firewall → Database (attempting access)
                             ↓
                       ⚠️  BLOCKED (but trying)
</code></pre><p>The immediate response is clear: rotate database credentials immediately and update the Kubernetes secret. The security incident is contained, but this requires a longer-term solution - implementing automated secret scanning in the CI/CD pipeline and scheduling security training for the development team.</p>
<blockquote>
<p><strong>Key Insight</strong>: Security incidents are rarely just technical problems. They&#39;re usually process problems that require both immediate fixes and long-term prevention strategies.</p>
</blockquote>
<h2 id="h2-monitoring-and-alerting-improvements" class="group relative scroll-mt-24">
        <a href="#h2-monitoring-and-alerting-improvements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Monitoring and Alerting Improvements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-monitoring-and-alerting-improvements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After lunch, focus shifts to improving the monitoring setup. The morning&#39;s payment issue could have been caught earlier with better alerting. Opening Prometheus to review the current metrics collection shows it only monitors basic metrics like CPU and memory usage.</p>
<p>Working with the developer to add business-specific metrics that would have caught the payment timeout issue earlier becomes the priority. Custom metrics for payment processing duration, active connections, and success/failure rates are implemented.</p>
<p>With these metrics in place, new alerting rules are created that would have triggered within minutes of the morning&#39;s incident, giving time to respond before customers were affected.</p>
<h2 id="h2-afternoon-deployment-pipeline" class="group relative scroll-mt-24">
        <a href="#h2-afternoon-deployment-pipeline" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Afternoon Deployment Pipeline
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-afternoon-deployment-pipeline"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>🚀 Major Feature Release</strong></p>
<p>The afternoon brings a scheduled deployment of the new user dashboard feature. This is a major feature that&#39;s been in development for six weeks, and the product team is eager to get it in front of users.</p>
<p>The staging environment looks good, but something concerning appears in the performance tests. The new dashboard is making 47 database queries per page load. With the expected traffic increase from the marketing campaign, this could cause serious performance problems.</p>
<pre><code>Database Query Analysis:
┌─────────────────────────────────────────────────────────────┐
│ Current Dashboard: 3 queries per page                       │
│ New Dashboard: 47 queries per page                          │
│                                                             │
│ Expected Traffic: 10,000 concurrent users                   │
│ Query Load: 470,000 queries/second                          │
│ Database Capacity: 50,000 queries/second                    │
│                                                             │
│ Result: 💥 DATABASE MELTDOWN                                │
└─────────────────────────────────────────────────────────────┘
</code></pre><p>An emergency meeting with the development team follows. The conversation is tense - the marketing campaign is already scheduled, and delaying the dashboard feature would mean missing the promotional opportunity.</p>
<p><strong>The Dilemma:</strong></p>
<ul>
<li>✅ Ship on time → Happy marketing team, potential system failure</li>
<li>❌ Delay feature → Disappointed stakeholders, stable system</li>
<li>🤔 Find middle ground → ???</li>
</ul>
<p>&quot;We can&#39;t deploy this as-is,&quot; becomes the message, showing the performance metrics. &quot;Each page load is hitting the database 47 times. With 10,000 concurrent users, that&#39;s 470,000 database queries per second. Our database will fall over.&quot;</p>
<p>The lead developer looks at the query analysis. &quot;Most of these are N+1 queries. We can fix the worst ones with some eager loading, but it&#39;ll take at least two days to properly optimize.&quot;</p>
<p>A compromise is proposed: deploy the feature with a feature flag, initially enabled for only 10% of users. This gives real-world performance data while limiting the impact on the infrastructure.</p>
<pre><code>Feature Flag Strategy:
┌─────────────────────────────────────────────────────────────┐
│ Incoming Users: 10,000/second                               │
│                                                             │
│ 90% → Old Dashboard (stable, fast)                          │
│ 10% → New Dashboard (testing, monitored)                    │
│                                                             │
│ Database Load: Manageable vs. Catastrophic                  │
└─────────────────────────────────────────────────────────────┘
</code></pre><p>The deployment goes ahead with the feature flag in place. Database performance is monitored closely as the feature rolls out to the limited user group. The impact is manageable at 10% traffic, but the metrics confirm concerns about a full rollout.</p>
<blockquote>
<p><strong>Key Insight</strong>: Feature flags aren&#39;t just for A/B testing. They&#39;re a powerful risk management tool that lets you test production performance without betting the entire infrastructure.</p>
</blockquote>
<blockquote>
<p><strong>🔄 DevOps Wisdom</strong>: The best compromise is often a gradual rollout. It satisfies business needs while protecting system stability.</p>
</blockquote>
<hr>
<h2 id="h2-evening-infrastructure-maintenance" class="group relative scroll-mt-24">
        <a href="#h2-evening-infrastructure-maintenance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Evening Infrastructure Maintenance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-evening-infrastructure-maintenance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>As the day winds down, planned maintenance tasks need attention. The Kubernetes cluster needs a version upgrade, and several security patches need to be applied to the worker nodes.</p>
<p>The upgrade process requires careful coordination to avoid downtime. Nodes are drained one by one, system updates are applied, kubelet is restarted with the new version, and then the node is uncordoned back into service.</p>
<p>The upgrade process takes about 90 minutes, but it goes smoothly. Application metrics are monitored throughout the process - response times stay normal, and no alerts fire.</p>
<h2 id="h2-late-night-emergency" class="group relative scroll-mt-24">
        <a href="#h2-late-night-emergency" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Late Night Emergency
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-late-night-emergency"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>🌙 10:30 PM - Not Again...</strong></p>
<p>Just when getting ready for bed at 10:30 PM, the phone buzzes again. This time it&#39;s a critical alert: the main application database is reporting high CPU usage and slow query performance. The European overnight batch processing jobs are running much longer than usual.</p>
<p><em>Every DevOps engineer knows this feeling - the dreaded &quot;just one more alert&quot; before bed.</em></p>
<p>Connecting to the database server immediately reveals the problem. One of the batch jobs is running a query that&#39;s been executing for 3 hours. The query is scanning a table with 50 million rows without using an index.</p>
<pre><code>Database Performance Crisis:
┌─────────────────────────────────────────────────────────────┐
│ Query: SELECT * FROM user_activities WHERE...               │
│ Status: Running for 3 hours ⏱️                              │
│ Rows Scanned: 50,000,000 (NO INDEX!)                        │
│ CPU Usage: ████████████████████████████████████ 95%         │
│ Other Queries: ⏳ WAITING... WAITING... WAITING...          │
└─────────────────────────────────────────────────────────────┘
</code></pre><p>The batch job developer probably tested with a small dataset and didn&#39;t realize the performance implications. A tough decision emerges: kill the long-running query to restore database performance, meaning the batch job will need to restart from the beginning, or let it finish but risk affecting the morning&#39;s application performance.</p>
<p><strong>The Midnight Decision Matrix:</strong></p>
<pre><code>Option 1: Kill Query + Create Index
├─ Pros: Immediate relief, proper fix
├─ Cons: Batch job restarts (3 hours lost)
└─ Risk: Low

Option 2: Let Query Finish
├─ Pros: Batch job completes
├─ Cons: Database stays slow
└─ Risk: High (morning traffic impact)
</code></pre><p>The choice is made to kill the query and create the missing database index. The index creation takes 45 minutes on the large table, but once it&#39;s complete, the batch job can restart and finish in just 20 minutes instead of hours.</p>
<blockquote>
<p><strong>Key Insight</strong>: Sometimes you have to make tough decisions with incomplete information. The ability to quickly assess risk and choose the least harmful option is crucial in DevOps.</p>
</blockquote>
<blockquote>
<p><strong>⚡ Late Night Wisdom</strong>: The best decisions aren&#39;t always the easiest ones. Protecting tomorrow&#39;s users was worth the short-term pain of restarting the batch job.</p>
</blockquote>
<hr>
<h2 id="h2-reflection-and-planning" class="group relative scroll-mt-24">
        <a href="#h2-reflection-and-planning" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Reflection and Planning
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-reflection-and-planning"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>🌅 Midnight - Systems Stable, Lessons Learned</strong></p>
<p>By midnight, the laptop finally closes. The day started with a production crisis, included a security incident, featured a challenging deployment decision, and ended with a database performance emergency. Each situation required different skills: quick problem-solving, technical analysis, team coordination, and risk assessment.</p>
<pre><code>Daily Impact Summary:
┌─────────────────────────────────────────────────────────────┐
│ 🔧 Issues Resolved: 4 critical, 2 medium priority           │
│ 👥 Customers Affected: Minimal (thanks to quick response)   │
│ 💰 Revenue Protected: ~$50,000 (prevented outages)          │
│ 🛠️ Systems Improved: 3 (monitoring, security, indexing)     │
│ 📈 Infrastructure: Scaled and optimized                     │
└─────────────────────────────────────────────────────────────┘
</code></pre><p>Tomorrow will bring new challenges. The marketing campaign is getting closer, and the infrastructure scaling plan needs finalization. The dashboard feature needs performance optimization before it can be fully rolled out. The development team needs security training to prevent credential leaks. The monitoring system needs those new business metrics.</p>
<p>But tonight, millions of users were able to make purchases, view their dashboards, and access the application without interruption. The infrastructure held up under pressure, the team collaborated effectively during crises, and the systems are more robust than they were this morning.</p>
<p><strong>Tomorrow&#39;s Action Items:</strong></p>
<ul>
<li>✅ Finalize campaign infrastructure scaling</li>
<li>✅ Optimize dashboard database queries</li>
<li>✅ Implement automated secret scanning</li>
<li>✅ Deploy enhanced monitoring metrics</li>
<li>✅ Schedule security training session</li>
</ul>
<hr>
<p>This is the reality of DevOps work - part firefighting, part planning, part collaboration, and part continuous improvement. It&#39;s demanding and sometimes stressful, but it&#39;s also rewarding to know that your work directly enables the business to serve its customers.</p>
<p>The phone is on silent for the next six hours, but somewhere, monitoring systems are keeping watch, automated processes are handling routine tasks, and the infrastructure is quietly supporting thousands of users around the world. That&#39;s the real success of DevOps - building systems that work reliably, even when you&#39;re not watching.</p>
<h2 id="h2-the-human-side-of-devops" class="group relative scroll-mt-24">
        <a href="#h2-the-human-side-of-devops" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Human Side of DevOps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-human-side-of-devops"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Being a DevOps engineer means being part detective, part architect, part diplomat, and part firefighter. Every day brings new challenges, but also new opportunities to make systems better, faster, and more reliable. The work never ends, but neither does the satisfaction of building technology that makes a real difference in people&#39;s lives.</p>
<p>The morning payment issue wasn&#39;t just about fixing code - it was about understanding the business impact of technical decisions. When European customers couldn&#39;t complete their purchases, it affected real people trying to buy gifts, pay bills, or run their businesses. The quick response prevented thousands of failed transactions and potential customer churn.</p>
<p>The security incident required more than just technical fixes. It highlighted the need for better developer education and process improvements. The conversation with the development team wasn&#39;t about blame - it was about learning and preventing similar issues in the future.</p>
<p>The deployment decision for the dashboard feature showcased the constant balance between business needs and technical constraints. The marketing campaign couldn&#39;t be delayed, but releasing a feature that would crash the database wasn&#39;t an option. The feature flag solution satisfied both requirements while providing valuable data for future improvements.</p>
<h2 id="h2-the-broader-impact" class="group relative scroll-mt-24">
        <a href="#h2-the-broader-impact" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Broader Impact
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-broader-impact"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>DevOps work extends far beyond keeping servers running. It&#39;s about enabling the entire organization to move faster and more reliably. The monitoring improvements implemented today will prevent future incidents. The infrastructure scaling plan will support business growth. The security training will protect customer data.</p>
<p>Each technical decision has ripple effects throughout the organization. The choice to scale up the payment service immediately instead of waiting for a code fix meant that the customer service team didn&#39;t get flooded with complaint calls. The decision to implement feature flags for the dashboard deployment gave the product team valuable usage data while protecting system stability.</p>
<p>The database performance fix at midnight wasn&#39;t just about query optimization - it was about ensuring that the morning&#39;s business reports would be ready on time, that the analytics team could access their data, and that the automated systems could process customer orders without delay.</p>
<h2 id="h2-skills-beyond-technology" class="group relative scroll-mt-24">
        <a href="#h2-skills-beyond-technology" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Skills Beyond Technology
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-skills-beyond-technology"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>While technical skills are essential, DevOps engineering requires much more. Communication skills are crucial for coordinating with development teams, explaining technical issues to business stakeholders, and writing clear documentation for on-call procedures.</p>
<p>Problem-solving skills go beyond debugging code. They involve understanding complex systems, identifying root causes of issues, and designing solutions that prevent future problems. The ability to work under pressure while maintaining clear thinking is essential when production systems are down and customers are affected.</p>
<p>Risk assessment becomes second nature - every change, every deployment, every infrastructure modification needs to be evaluated for potential impact. The ability to make quick decisions with incomplete information is valuable when incidents are unfolding and time is critical.</p>
<h2 id="h2-the-satisfaction-of-reliability" class="group relative scroll-mt-24">
        <a href="#h2-the-satisfaction-of-reliability" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Satisfaction of Reliability
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-satisfaction-of-reliability"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most rewarding aspect of DevOps work isn&#39;t the dramatic incident responses or the complex technical solutions. It&#39;s the quiet satisfaction of building systems that work consistently, day after day, serving users around the world without interruption.</p>
<p>When a deployment goes smoothly, when monitoring catches an issue before it affects users, when an infrastructure upgrade happens without downtime - these moments of seamless operation represent the true success of DevOps practices.</p>
<p>The tools and technologies will continue to evolve, but the core mission remains the same: bridge the gap between development and operations, automate repetitive tasks, monitor everything that matters, and respond quickly when things go wrong. It&#39;s challenging work, but for those who enjoy solving complex problems and working with cutting-edge technology, there&#39;s nothing quite like it.</p>
<p>The best DevOps engineers are those who can see the bigger picture - understanding how their technical decisions impact users, businesses, and teams. They&#39;re the ones who can remain calm during crises, think strategically about infrastructure improvements, and communicate effectively with both technical and non-technical stakeholders.</p>
<p>This is what a day in the life of a DevOps engineer really looks like - not just managing servers and writing scripts, but being a crucial part of the technology ecosystem that powers modern business operations.</p>
<h2 id="h2-key-takeaways-for-aspiring-devops-engineers" class="group relative scroll-mt-24">
        <a href="#h2-key-takeaways-for-aspiring-devops-engineers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Takeaways for Aspiring DevOps Engineers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-takeaways-for-aspiring-devops-engineers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>🎯 Essential Skills Demonstrated Today:</strong></p>
<ol>
<li><strong>Crisis Management</strong>: Quick thinking under pressure while maintaining system stability</li>
<li><strong>Risk Assessment</strong>: Evaluating trade-offs between speed and reliability</li>
<li><strong>Cross-team Communication</strong>: Coordinating with developers, product managers, and business stakeholders</li>
<li><strong>Technical Versatility</strong>: From Kubernetes to databases to security incidents</li>
<li><strong>Business Impact Awareness</strong>: Understanding how technical decisions affect revenue and customers</li>
</ol>
<p><strong>🛠️ Core Tools in Action:</strong></p>
<ul>
<li><strong>Monitoring</strong>: ELK Stack, Prometheus, PagerDuty</li>
<li><strong>Infrastructure</strong>: Kubernetes, Docker, Terraform, AWS</li>
<li><strong>CI/CD</strong>: Jenkins, automated testing pipelines</li>
<li><strong>Security</strong>: Intrusion detection, credential management</li>
<li><strong>Databases</strong>: MySQL, query optimization, indexing</li>
</ul>
<p><strong>📚 Want to Learn More?</strong></p>
<p>If this day-in-the-life resonates with you, here are some next steps:</p>
<blockquote>
<p><strong>🚀 Getting Started</strong>: Practice with containerization (<a href="/guides/introduction-to-docker">Docker</a>), learn <a href="/guides/introduction-to-kubernetes">Kubernetes basics</a>, and get comfortable with Linux command line</p>
</blockquote>
<blockquote>
<p><strong>🔍 Dive Deeper</strong>: Set up monitoring in a personal project, practice incident response scenarios, learn infrastructure as code</p>
</blockquote>
<blockquote>
<p><strong>💼 Career Path</strong>: Consider starting as a systems administrator, junior DevOps engineer, or SRE to build foundational skills</p>
</blockquote>
<hr>
<p><strong>The Reality Check</strong>: DevOps isn&#39;t just about tools and automation. It&#39;s about building reliable systems that let businesses focus on serving their customers. Every alert, every deployment, every optimization contributes to that mission.</p>
<p>The most rewarding part? Knowing that somewhere in the world, users are seamlessly making purchases, accessing services, and getting value from applications - all because the infrastructure you built and maintain is working exactly as it should.</p>
<p>Go over the following <a href="/roadmap">DevOps Roadmap</a> to see how you can build your skills and career in this exciting field.</p>
<p><em>That&#39;s the real satisfaction of DevOps work - building the invisible foundation that makes everything else possible.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Can I Delete a Remote Tag?]]></title>
      <link>https://devops-daily.com/posts/how-can-i-delete-a-remote-tag</link>
      <description><![CDATA[Learn how to delete Git tags from remote repositories safely. Understand the difference between local and remote tag deletion, and discover best practices for managing release tags in team environments.]]></description>
      <pubDate>Tue, 08 Jul 2025 13:30:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-can-i-delete-a-remote-tag</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Version Control]]></category><category><![CDATA[Tags]]></category><category><![CDATA[Release Management]]></category><category><![CDATA[Repository Management]]></category>
      <content:encoded><![CDATA[<p>Git tags mark specific points in your repository history, typically used for releases like <code>v1.0.0</code> or <code>v2.1.3</code>. Sometimes you need to delete a tag - maybe you tagged the wrong commit, used an incorrect version number, or need to recreate a release. While deleting a local tag is straightforward, removing a tag from a remote repository requires an additional step that isn&#39;t immediately obvious.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To delete a remote tag, use <code>git push origin --delete tagname</code> or the alternative syntax <code>git push origin :refs/tags/tagname</code>. To also delete the local tag, run <code>git tag -d tagname</code>. Always coordinate with your team before deleting tags that others might be using.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need a Git repository with tags and push access to the remote repository. Basic familiarity with Git commands and understanding of what tags are will help you follow along.</p>
<h2 id="h2-understanding-local-vs-remote-tags" class="group relative scroll-mt-24">
        <a href="#h2-understanding-local-vs-remote-tags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Local vs Remote Tags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-local-vs-remote-tags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you create a tag locally, it exists only in your local repository until you explicitly push it:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a local tag</span>
git tag v1.0.0

<span class="hljs-comment"># List local tags</span>
git tag
</code></pre><p>To make the tag available to others, push it:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Push a specific tag</span>
git push origin v1.0.0

<span class="hljs-comment"># Or push all tags at once</span>
git push --tags
</code></pre><p>Once pushed, the tag exists in two places - your local repository and the remote repository. Deleting a local tag doesn&#39;t automatically delete the remote tag, and vice versa. You need to delete them separately.</p>
<h2 id="h2-deleting-a-remote-tag" class="group relative scroll-mt-24">
        <a href="#h2-deleting-a-remote-tag" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deleting a Remote Tag
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deleting-a-remote-tag"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The standard way to delete a remote tag is:</p>
<pre><code class="hljs language-bash">git push origin --delete v1.0.0
</code></pre><p>This tells Git to delete the tag <code>v1.0.0</code> from the remote named <code>origin</code>. You&#39;ll see output like:</p>
<pre><code>To github.com:username/project.git
 - [deleted]         v1.0.0
</code></pre><p>An alternative syntax that does the same thing:</p>
<pre><code class="hljs language-bash">git push origin :refs/tags/v1.0.0
</code></pre><p>This older syntax means &quot;push nothing to the remote tag v1.0.0&quot;, which effectively deletes it. The modern <code>--delete</code> flag is clearer and preferred, but both work identically.</p>
<h2 id="h2-deleting-both-local-and-remote-tags" class="group relative scroll-mt-24">
        <a href="#h2-deleting-both-local-and-remote-tags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deleting Both Local and Remote Tags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deleting-both-local-and-remote-tags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To completely remove a tag from both local and remote:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Delete the local tag</span>
git tag -d v1.0.0

<span class="hljs-comment"># Delete the remote tag</span>
git push origin --delete v1.0.0
</code></pre><p>You can run these in either order. If you delete the remote tag first, the local tag remains in your repository but won&#39;t be on the remote anymore.</p>
<h2 id="h2-deleting-multiple-remote-tags" class="group relative scroll-mt-24">
        <a href="#h2-deleting-multiple-remote-tags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deleting Multiple Remote Tags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deleting-multiple-remote-tags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To delete several tags at once:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Delete multiple tags from remote</span>
git push origin --delete v1.0.0 v1.0.1 v1.0.2

<span class="hljs-comment"># Delete local tags</span>
git tag -d v1.0.0 v1.0.1 v1.0.2
</code></pre><p>For many tags, you might script it:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Delete all tags matching a pattern from remote</span>
<span class="hljs-keyword">for</span> tag <span class="hljs-keyword">in</span> $(git tag -l <span class="hljs-string">&quot;v1.0.*&quot;</span>); <span class="hljs-keyword">do</span>
  git push origin --delete <span class="hljs-variable">$tag</span>
<span class="hljs-keyword">done</span>

<span class="hljs-comment"># Delete matching local tags</span>
git tag -d $(git tag -l <span class="hljs-string">&quot;v1.0.*&quot;</span>)
</code></pre><p>This example deletes all tags starting with <code>v1.0.</code> - useful when cleaning up a series of pre-release tags or correcting a versioning mistake.</p>
<h2 id="h2-verifying-tag-deletion" class="group relative scroll-mt-24">
        <a href="#h2-verifying-tag-deletion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Verifying Tag Deletion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-verifying-tag-deletion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After deleting a remote tag, verify it&#39;s gone:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List all remote tags</span>
git ls-remote --tags origin

<span class="hljs-comment"># Or fetch the latest tag info</span>
git fetch --tags --prune
</code></pre><p>The <code>--prune</code> flag removes references to tags that no longer exist on the remote. Without it, your local Git might still show remote tags that have been deleted.</p>
<p>Check your local tags:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List all local tags</span>
git tag

<span class="hljs-comment"># Search for a specific tag</span>
git tag -l <span class="hljs-string">&quot;v1.0.0&quot;</span>
</code></pre><h2 id="h2-handling-permission-issues" class="group relative scroll-mt-24">
        <a href="#h2-handling-permission-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Handling Permission Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-handling-permission-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you get a permission error when deleting a remote tag:</p>
<pre><code>error: unable to delete &#x27;v1.0.0&#x27;: remote ref does not exist
error: failed to push some refs to &#x27;github.com:username/project.git&#x27;
</code></pre><p>This could mean:</p>
<ol>
<li><strong>The tag doesn&#39;t exist on the remote</strong>: Check with <code>git ls-remote --tags origin</code></li>
<li><strong>You don&#39;t have permission</strong>: Some repositories protect tags, especially in production environments</li>
<li><strong>The tag is protected</strong>: Platforms like GitHub and GitLab allow protecting tags to prevent accidental deletion</li>
</ol>
<p>For protected tags, you may need to:</p>
<ul>
<li>Temporarily unprotect the tag in your Git hosting platform&#39;s settings</li>
<li>Ask someone with appropriate permissions to delete it</li>
<li>Use your Git host&#39;s web interface to delete the tag</li>
</ul>
<h2 id="h2-recreating-a-tag-after-deletion" class="group relative scroll-mt-24">
        <a href="#h2-recreating-a-tag-after-deletion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Recreating a Tag After Deletion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-recreating-a-tag-after-deletion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A common workflow is deleting and recreating a tag, perhaps because you tagged the wrong commit:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Delete the incorrect tag locally and remotely</span>
git tag -d v1.0.0
git push origin --delete v1.0.0

<span class="hljs-comment"># Create the tag on the correct commit</span>
git checkout main
git tag v1.0.0

<span class="hljs-comment"># Push the corrected tag</span>
git push origin v1.0.0
</code></pre><p>Or create the tag on a specific commit:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Delete old tag</span>
git tag -d v1.0.0
git push origin --delete v1.0.0

<span class="hljs-comment"># Create tag on specific commit</span>
git tag v1.0.0 abc123def

<span class="hljs-comment"># Push the new tag</span>
git push origin v1.0.0
</code></pre><h2 id="h2-impact-on-team-members" class="group relative scroll-mt-24">
        <a href="#h2-impact-on-team-members" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Impact on Team Members
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-impact-on-team-members"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you delete a remote tag, it doesn&#39;t automatically disappear from your teammates&#39; local repositories. They&#39;ll still have the old tag locally until they prune:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Team members should run this to sync tags</span>
git fetch --tags --prune
</code></pre><p>This updates their local tag references to match the remote, removing tags that no longer exist remotely.</p>
<p><strong>Important</strong>: Coordinate with your team before deleting tags. If someone has deployed code using a specific tag, deleting it can cause confusion. If the tag is referenced in documentation, CI/CD pipelines, or deployment scripts, those references will break.</p>
<h2 id="h2-tags-in-release-management" class="group relative scroll-mt-24">
        <a href="#h2-tags-in-release-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Tags in Release Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tags-in-release-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In production environments, tags typically represent releases. Deleting them should be done carefully:</p>
<p><strong>Pre-release tags</strong> (like <code>v1.0.0-beta.1</code> or <code>v1.0.0-rc.1</code>) can usually be deleted safely if you&#39;re still iterating.</p>
<p><strong>Production release tags</strong> (like <code>v1.0.0</code> or <code>v2.3.1</code>) should rarely be deleted. If a release had problems:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Instead of deleting v1.0.0, create v1.0.1 with fixes</span>
git tag v1.0.1
git push origin v1.0.1
</code></pre><p>This preserves the history and makes it clear that 1.0.1 supersedes 1.0.0.</p>
<h2 id="h2-recovering-a-deleted-tag" class="group relative scroll-mt-24">
        <a href="#h2-recovering-a-deleted-tag" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Recovering a Deleted Tag
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-recovering-a-deleted-tag"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you accidentally delete a tag before pushing the deletion, you can recover it from your reflog:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find the commit that was tagged</span>
git reflog | grep <span class="hljs-string">&quot;v1.0.0&quot;</span>

<span class="hljs-comment"># Recreate the tag on that commit</span>
git tag v1.0.0 &lt;commit-hash&gt;
</code></pre><p>However, if the tag has been deleted from both local and remote and you don&#39;t have it in your reflog, you&#39;ll need to recreate it on what you believe was the correct commit. This is why it&#39;s important to be certain before deleting tags, especially release tags.</p>
<h2 id="h2-deleting-tags-on-different-git-platforms" class="group relative scroll-mt-24">
        <a href="#h2-deleting-tags-on-different-git-platforms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Deleting Tags on Different Git Platforms
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-deleting-tags-on-different-git-platforms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-github" class="group relative scroll-mt-24">
        <a href="#h3-github" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can delete tags via the web interface:</p>
<ol>
<li>Go to your repository&#39;s Releases page</li>
<li>Find the release associated with the tag</li>
<li>Click Edit or Delete</li>
<li>Delete the release (this doesn&#39;t delete the tag automatically)</li>
<li>Go to the Tags page and delete the tag</li>
</ol>
<p>Or use the command line as shown above.</p>
<h3 id="h3-gitlab" class="group relative scroll-mt-24">
        <a href="#h3-gitlab" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitLab
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>GitLab&#39;s interface:</p>
<ol>
<li>Navigate to Repository → Tags</li>
<li>Click the delete icon next to the tag</li>
</ol>
<p>Or use command line.</p>
<h3 id="h3-bitbucket" class="group relative scroll-mt-24">
        <a href="#h3-bitbucket" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Bitbucket
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-bitbucket"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Bitbucket interface:</p>
<ol>
<li>Go to the repository</li>
<li>Click on Tags in the navigation</li>
<li>Click the delete icon next to the tag</li>
</ol>
<p>Command line works the same across all platforms.</p>
<h2 id="h2-scripting-tag-cleanup" class="group relative scroll-mt-24">
        <a href="#h2-scripting-tag-cleanup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scripting Tag Cleanup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scripting-tag-cleanup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For automated tag cleanup, you might create a script:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># Delete old pre-release tags</span>

<span class="hljs-comment"># Get all tags matching pattern</span>
OLD_TAGS=$(git tag -l <span class="hljs-string">&quot;*-beta*&quot;</span> <span class="hljs-string">&quot;*-alpha*&quot;</span> <span class="hljs-string">&quot;*-rc*&quot;</span>)

<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">&quot;<span class="hljs-variable">$OLD_TAGS</span>&quot;</span> ]; <span class="hljs-keyword">then</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;No pre-release tags to delete&quot;</span>
  <span class="hljs-built_in">exit</span> 0
<span class="hljs-keyword">fi</span>

<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Found pre-release tags:&quot;</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$OLD_TAGS</span>&quot;</span>
<span class="hljs-built_in">read</span> -p <span class="hljs-string">&quot;Delete these tags? (y/n) &quot;</span> -n 1 -r
<span class="hljs-built_in">echo</span>

<span class="hljs-keyword">if</span> [[ <span class="hljs-variable">$REPLY</span> =~ ^[Yy]$ ]]; <span class="hljs-keyword">then</span>
  <span class="hljs-keyword">for</span> tag <span class="hljs-keyword">in</span> <span class="hljs-variable">$OLD_TAGS</span>; <span class="hljs-keyword">do</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Deleting <span class="hljs-variable">$tag</span>...&quot;</span>
    git tag -d <span class="hljs-string">&quot;<span class="hljs-variable">$tag</span>&quot;</span>
    git push origin --delete <span class="hljs-string">&quot;<span class="hljs-variable">$tag</span>&quot;</span>
  <span class="hljs-keyword">done</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Done!&quot;</span>
<span class="hljs-keyword">else</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Cancelled&quot;</span>
<span class="hljs-keyword">fi</span>
</code></pre><p>This script finds all alpha, beta, and release candidate tags, shows them to you, and asks for confirmation before deleting.</p>
<h2 id="h2-best-practices-for-tag-management" class="group relative scroll-mt-24">
        <a href="#h2-best-practices-for-tag-management" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices for Tag Management
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices-for-tag-management"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Use semantic versioning</strong>: Follow a consistent versioning scheme (like SemVer: major.minor.patch) so tags are predictable.</p>
<p><strong>Protect production tags</strong>: Configure your Git hosting platform to protect release tags from accidental deletion.</p>
<p><strong>Document deletions</strong>: If you must delete a production tag, document why in your team&#39;s communication channels.</p>
<p><strong>Create annotated tags for releases</strong>: Use <code>git tag -a v1.0.0 -m &quot;Release 1.0.0&quot;</code> instead of lightweight tags. Annotated tags include metadata about who created the tag and when.</p>
<p><strong>Automate where possible</strong>: Use CI/CD tools to create tags automatically based on successful builds or deployments.</p>
<p><strong>Never reuse tag names</strong>: If you delete a tag, don&#39;t recreate it with the same name pointing to a different commit. This causes confusion. Instead, increment the version number.</p>
<p>Deleting remote tags is straightforward once you know the command, but the decision to delete should be made carefully. Tags serve as important markers in your project&#39;s history, and removing them can impact deployments, documentation, and team workflows. When in doubt, it&#39;s usually better to create a new tag with an incremented version than to delete and recreate an existing one.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Set Image Name in Dockerfile]]></title>
      <link>https://devops-daily.com/posts/set-image-name-dockerfile</link>
      <description><![CDATA[Learn how to set and manage image names effectively in Dockerfiles for streamlined workflows. This guide covers the steps to build Docker images with specific names and tags.]]></description>
      <pubDate>Fri, 04 Jul 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/set-image-name-dockerfile</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Dockerfile]]></category><category><![CDATA[Image Name]]></category><category><![CDATA[Tutorials]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To set an image name in Docker, you use the <code>docker build</code> command with the <code>-t</code> flag. The image name is not directly set in the Dockerfile but is specified during the build process.</p>
<hr>
<p>Docker images are a fundamental part of containerized workflows. While the Dockerfile defines the instructions for building an image, the image name is set during the build process using the <code>docker build</code> command. This guide will show you how to set and manage image names effectively.</p>
<h2 id="h2-step-1-create-a-dockerfile" class="group relative scroll-mt-24">
        <a href="#h2-step-1-create-a-dockerfile" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Create a Dockerfile
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-create-a-dockerfile"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Start by creating a Dockerfile with the necessary instructions to build your image.</p>
<h3 id="h3-example-dockerfile" class="group relative scroll-mt-24">
        <a href="#h3-example-dockerfile" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example Dockerfile
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-dockerfile"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">18</span>
<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm install</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;app.js&quot;</span>]</span>
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>FROM node:18</code>: Specifies the base image.</li>
<li><code>WORKDIR /app</code>: Sets the working directory inside the container.</li>
<li><code>COPY . .</code>: Copies files from the current directory into the container.</li>
<li><code>RUN npm install</code>: Installs dependencies.</li>
<li><code>CMD [&quot;node&quot;, &quot;app.js&quot;]</code>: Starts the application.</li>
</ul>
<h2 id="h2-step-2-build-the-image-with-a-name" class="group relative scroll-mt-24">
        <a href="#h2-step-2-build-the-image-with-a-name" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Build the Image with a Name
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-build-the-image-with-a-name"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use the <code>docker build</code> command with the <code>-t</code> flag to set the image name.</p>
<h3 id="h3-command" class="group relative scroll-mt-24">
        <a href="#h3-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker build -t my-app:latest .
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>-t my-app:latest</code>: Sets the image name to <code>my-app</code> and the tag to <code>latest</code>.</li>
<li><code>.</code>: Specifies the build context (current directory).</li>
</ul>
<h2 id="h2-step-3-verify-the-image-name" class="group relative scroll-mt-24">
        <a href="#h2-step-3-verify-the-image-name" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Verify the Image Name
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-verify-the-image-name"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After building the image, verify its name using the <code>docker images</code> command.</p>
<h3 id="h3-command" class="group relative scroll-mt-24">
        <a href="#h3-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To list all Docker images and confirm the name:</p>
<pre><code class="hljs language-bash">docker images
</code></pre><h3 id="h3-example-output" class="group relative scroll-mt-24">
        <a href="#h3-example-output" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example Output
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-output"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-plaintext">REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my-app       latest    abc123def456   5 minutes ago   123MB
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Use Descriptive Names</strong>: Choose names that reflect the purpose of the image.</li>
<li><strong>Tag Versions</strong>: Use tags like <code>v1.0</code> or <code>latest</code> to manage versions.</li>
<li><strong>Automate Naming</strong>: Use CI/CD pipelines to automate image naming and tagging.</li>
</ul>
<p>By following these steps, you can effectively set and manage image names in Dockerfiles, ensuring streamlined workflows and better organization of your Docker images.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[COPY with Docker but with Exclusion]]></title>
      <link>https://devops-daily.com/posts/copy-with-docker-exclusion</link>
      <description><![CDATA[Learn how to use the COPY instruction in Docker with exclusion patterns to optimize your Docker builds.]]></description>
      <pubDate>Fri, 04 Jul 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/copy-with-docker-exclusion</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Dockerfile]]></category><category><![CDATA[COPY]]></category><category><![CDATA[Exclusion]]></category><category><![CDATA[Tutorials]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To exclude files or directories when using the <code>COPY</code> instruction in Docker, leverage <code>.dockerignore</code> files. This ensures that unwanted files are not copied into your Docker image, optimizing build times and reducing image size.</p>
<hr>
<p>The <code>COPY</code> instruction in Docker is used to copy files and directories from your local filesystem into a Docker image. However, there are scenarios where you might want to exclude certain files or directories from being copied. This guide will show you how to achieve this using <code>.dockerignore</code> files.</p>
<h2 id="h2-step-1-create-a-dockerignore-file" class="group relative scroll-mt-24">
        <a href="#h2-step-1-create-a-dockerignore-file" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Create a .dockerignore File
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-1-create-a-dockerignore-file"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>.dockerignore</code> file allows you to specify patterns for files and directories to exclude during the Docker build process. Create a <code>.dockerignore</code> file in the same directory as your <code>Dockerfile</code>.</p>
<h3 id="h3-example-dockerignore-file" class="group relative scroll-mt-24">
        <a href="#h3-example-dockerignore-file" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example .dockerignore File
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-dockerignore-file"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-plaintext">node_modules
*.log
.env
temp/
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>node_modules</code>: Excludes the <code>node_modules</code> directory.</li>
<li><code>*.log</code>: Excludes all <code>.log</code> files.</li>
<li><code>.env</code>: Excludes the <code>.env</code> file.</li>
<li><code>temp/</code>: Excludes the <code>temp</code> directory.</li>
</ul>
<h2 id="h2-step-2-use-the-copy-instruction" class="group relative scroll-mt-24">
        <a href="#h2-step-2-use-the-copy-instruction" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Use the COPY Instruction
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-2-use-the-copy-instruction"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In your <code>Dockerfile</code>, use the <code>COPY</code> instruction to copy files into the image. The <code>.dockerignore</code> file will automatically exclude the specified files and directories.</p>
<h3 id="h3-example-dockerfile" class="group relative scroll-mt-24">
        <a href="#h3-example-dockerfile" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example Dockerfile
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-dockerfile"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">18</span>
<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm install</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;app.js&quot;</span>]</span>
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>COPY . .</code>: Copies all files from the current directory into the <code>/app</code> directory in the image, excluding files specified in <code>.dockerignore</code>.</li>
<li><code>RUN npm install</code>: Installs dependencies.</li>
<li><code>CMD [&quot;node&quot;, &quot;app.js&quot;]</code>: Starts the application.</li>
</ul>
<h2 id="h2-step-3-build-the-docker-image" class="group relative scroll-mt-24">
        <a href="#h2-step-3-build-the-docker-image" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Build the Docker Image
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-3-build-the-docker-image"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Build the Docker image using the <code>docker build</code> command:</p>
<pre><code class="hljs language-bash">docker build -t my-app .
</code></pre><p>This command builds the image and excludes files specified in <code>.dockerignore</code>.</p>
<h2 id="h2-advanced-options" class="group relative scroll-mt-24">
        <a href="#h2-advanced-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Advanced Options
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-advanced-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-exclude-files-dynamically" class="group relative scroll-mt-24">
        <a href="#h3-exclude-files-dynamically" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Exclude Files Dynamically
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-exclude-files-dynamically"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can dynamically exclude files by generating a <code>.dockerignore</code> file during the build process. For example:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;temp/&quot;</span> &gt; .dockerignore
docker build -t my-app .
</code></pre><h3 id="h3-multi-stage-builds" class="group relative scroll-mt-24">
        <a href="#h3-multi-stage-builds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Multi-Stage Builds
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multi-stage-builds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use multi-stage builds to copy only the necessary files into the final image:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">18</span> AS builder
<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm install</span>

<span class="hljs-keyword">FROM</span> node:<span class="hljs-number">18</span>
<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> --from=builder /app/dist /app/dist</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;app/dist/app.js&quot;</span>]</span>
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>The <code>builder</code> stage installs dependencies and builds the application.</li>
<li>The final stage copies only the <code>dist</code> directory from the <code>builder</code> stage.</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Minimize Context</strong>: Use <code>.dockerignore</code> to reduce the build context size.</li>
<li><strong>Keep <code>.dockerignore</code> Updated</strong>: Regularly update <code>.dockerignore</code> to exclude unnecessary files.</li>
<li><strong>Test Builds</strong>: Test your Docker builds to ensure excluded files are not copied.</li>
</ul>
<p>By following these steps, you can effectively use the <code>COPY</code> instruction in Docker with exclusion patterns, optimizing your Docker builds and improving image efficiency.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Forward Host Port to Docker Container]]></title>
      <link>https://devops-daily.com/posts/forward-host-port-to-docker-container</link>
      <description><![CDATA[Learn how to map ports from your host machine to Docker containers using -p, expose services on specific interfaces, handle port conflicts, and dynamically add port forwarding to running containers.]]></description>
      <pubDate>Tue, 24 Jun 2025 14:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/forward-host-port-to-docker-container</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Port Mapping]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<p>Docker containers run in isolated network environments by default, which means services running inside containers aren&#39;t accessible from your host machine or the outside world without explicit port forwarding. Understanding how to map ports between your host and containers is essential for accessing web applications, databases, APIs, and other containerized services.</p>
<p>This guide covers everything you need to know about Docker port forwarding, from basic mapping to advanced scenarios.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use <code>-p</code> or <code>--publish</code> to forward ports when running a container: <code>docker run -p 8080:80 nginx</code> maps host port 8080 to container port 80. Use <code>-p 127.0.0.1:8080:80</code> to bind only to localhost. For running containers, you must commit and restart with new port mappings. Use <code>docker-compose</code> for complex port configurations.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need Docker installed and basic familiarity with running containers. Understanding of network ports and how services listen on ports will help.</p>
<h2 id="h2-basic-port-forwarding" class="group relative scroll-mt-24">
        <a href="#h2-basic-port-forwarding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Port Forwarding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-basic-port-forwarding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>-p</code> flag maps a host port to a container port.</p>
<h3 id="h3-syntax" class="group relative scroll-mt-24">
        <a href="#h3-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker run -p &lt;host-port&gt;:&lt;container-port&gt; &lt;image&gt;
</code></pre><p>Example - running Nginx:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Map host port 8080 to container port 80</span>
docker run -p 8080:80 nginx
</code></pre><p>Now access Nginx at <code>http://localhost:8080</code> on your host machine. Inside the container, Nginx listens on port 80, but you access it via 8080 on your host.</p>
<h3 id="h3-multiple-port-mappings" class="group relative scroll-mt-24">
        <a href="#h3-multiple-port-mappings" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Multiple Port Mappings
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multiple-port-mappings"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Map multiple ports with multiple <code>-p</code> flags:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Map both HTTP and HTTPS</span>
docker run -p 8080:80 -p 8443:443 nginx
</code></pre><p>Or forward a range of ports:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Map ports 8080-8090 to 80-90</span>
docker run -p 8080-8090:80-90 myapp
</code></pre><h2 id="h2-publishing-all-exposed-ports" class="group relative scroll-mt-24">
        <a href="#h2-publishing-all-exposed-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Publishing All Exposed Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-publishing-all-exposed-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Images can declare ports with <code>EXPOSE</code> in their Dockerfile. Use <code>-P</code> (capital P) to automatically map all exposed ports to random high ports on the host:</p>
<pre><code class="hljs language-bash">docker run -P nginx
</code></pre><p>Check which ports were assigned:</p>
<pre><code class="hljs language-bash">docker ps
</code></pre><p>Output:</p>
<pre><code>CONTAINER ID   IMAGE    PORTS                    NAMES
abc123def456   nginx    0.0.0.0:32768-&gt;80/tcp    eager_morse
</code></pre><p>Nginx&#39;s port 80 is mapped to host port 32768.</p>
<p>Find the actual port programmatically:</p>
<pre><code class="hljs language-bash">docker port &lt;container-name&gt; 80
</code></pre><p>Output:</p>
<pre><code>0.0.0.0:32768
</code></pre><h2 id="h2-binding-to-specific-interfaces" class="group relative scroll-mt-24">
        <a href="#h2-binding-to-specific-interfaces" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Binding to Specific Interfaces
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-binding-to-specific-interfaces"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>By default, <code>-p 8080:80</code> binds to all network interfaces (<code>0.0.0.0</code>), making the service accessible from anywhere. Bind to specific interfaces for security:</p>
<h3 id="h3-localhost-only" class="group relative scroll-mt-24">
        <a href="#h3-localhost-only" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Localhost Only
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-localhost-only"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Only accessible from the host machine</span>
docker run -p 127.0.0.1:8080:80 nginx
</code></pre><p>Now <code>http://localhost:8080</code> works, but external machines can&#39;t connect.</p>
<h3 id="h3-specific-ip-address" class="group relative scroll-mt-24">
        <a href="#h3-specific-ip-address" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Specific IP Address
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-specific-ip-address"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Bind to specific network interface</span>
docker run -p 192.168.1.100:8080:80 nginx
</code></pre><p>The service is only accessible via the specified IP address.</p>
<h2 id="h2-udp-port-forwarding" class="group relative scroll-mt-24">
        <a href="#h2-udp-port-forwarding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          UDP Port Forwarding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-udp-port-forwarding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Specify the protocol for UDP services:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Forward UDP port</span>
docker run -p 5353:53/udp dns-server

<span class="hljs-comment"># Forward both TCP and UDP</span>
docker run -p 8080:80/tcp -p 5353:53/udp myapp
</code></pre><h2 id="h2-docker-compose-port-mapping" class="group relative scroll-mt-24">
        <a href="#h2-docker-compose-port-mapping" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Docker Compose Port Mapping
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-docker-compose-port-mapping"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In <code>docker-compose.yml</code>, use the <code>ports</code> section:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3&#x27;</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">web:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">nginx</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;8080:80&quot;</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;8443:443&quot;</span>

  <span class="hljs-attr">database:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;127.0.0.1:5432:5432&quot;</span>

  <span class="hljs-attr">app:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">myapp</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;3000-3005:3000-3005&quot;</span>
</code></pre><p>Start services:</p>
<pre><code class="hljs language-bash">docker-compose up
</code></pre><p>All port mappings are applied automatically.</p>
<h3 id="h3-short-vs-long-syntax" class="group relative scroll-mt-24">
        <a href="#h3-short-vs-long-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Short vs Long Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-short-vs-long-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker Compose supports both syntaxes:</p>
<p><strong>Short syntax:</strong></p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">ports:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;8080:80&quot;</span>
  <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;127.0.0.1:5432:5432&quot;</span>
</code></pre><p><strong>Long syntax (more explicit):</strong></p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">ports:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">target:</span> <span class="hljs-number">80</span>        <span class="hljs-comment"># Container port</span>
    <span class="hljs-attr">published:</span> <span class="hljs-number">8080</span>   <span class="hljs-comment"># Host port</span>
    <span class="hljs-attr">protocol:</span> <span class="hljs-string">tcp</span>
    <span class="hljs-attr">mode:</span> <span class="hljs-string">host</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">target:</span> <span class="hljs-number">5432</span>
    <span class="hljs-attr">published:</span> <span class="hljs-number">5432</span>
    <span class="hljs-attr">host_ip:</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>
</code></pre><h2 id="h2-adding-ports-to-running-containers" class="group relative scroll-mt-24">
        <a href="#h2-adding-ports-to-running-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Adding Ports to Running Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-adding-ports-to-running-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You cannot add port forwarding to a running container directly. You must stop, commit, and restart with new port mappings.</p>
<h3 id="h3-method-1-commit-and-restart" class="group relative scroll-mt-24">
        <a href="#h3-method-1-commit-and-restart" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Commit and Restart
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-method-1-commit-and-restart"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Stop the container</span>
docker stop mycontainer

<span class="hljs-comment"># Commit current state to new image</span>
docker commit mycontainer myapp-with-data

<span class="hljs-comment"># Remove old container</span>
docker <span class="hljs-built_in">rm</span> mycontainer

<span class="hljs-comment"># Run with new port mapping</span>
docker run -p 8080:80 --name mycontainer myapp-with-data
</code></pre><h3 id="h3-method-2-iptables-port-forwarding" class="group relative scroll-mt-24">
        <a href="#h3-method-2-iptables-port-forwarding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: iptables Port Forwarding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-method-2-iptables-port-forwarding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Forward ports using iptables without restarting:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Get container IP</span>
CONTAINER_IP=$(docker inspect -f <span class="hljs-string">&#x27;{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}&#x27;</span> mycontainer)

<span class="hljs-comment"># Forward host port 8080 to container port 80</span>
<span class="hljs-built_in">sudo</span> iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination <span class="hljs-variable">${CONTAINER_IP}</span>:80

<span class="hljs-comment"># Allow the forwarded traffic</span>
<span class="hljs-built_in">sudo</span> iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --<span class="hljs-built_in">source</span> <span class="hljs-variable">${CONTAINER_IP}</span> --destination <span class="hljs-variable">${CONTAINER_IP}</span> --dport 80
</code></pre><p>This forwards traffic without restarting the container, but the mapping is lost when Docker restarts.</p>
<h3 id="h3-method-3-docker-proxy" class="group relative scroll-mt-24">
        <a href="#h3-method-3-docker-proxy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 3: Docker Proxy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-method-3-docker-proxy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use a reverse proxy container (like Nginx or Traefik) to route traffic to containers without direct port mappings:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run application without port mapping</span>
docker run --name myapp myimage

<span class="hljs-comment"># Run nginx-proxy</span>
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

<span class="hljs-comment"># nginx-proxy automatically detects containers and proxies to them</span>
</code></pre><h2 id="h2-checking-port-mappings" class="group relative scroll-mt-24">
        <a href="#h2-checking-port-mappings" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking Port Mappings
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-port-mappings"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>View port mappings for a running container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Using docker ps</span>
docker ps

<span class="hljs-comment"># Using docker port</span>
docker port &lt;container-name&gt;

<span class="hljs-comment"># Using docker inspect</span>
docker inspect &lt;container-name&gt; | grep -A 20 <span class="hljs-string">&quot;Ports&quot;</span>
</code></pre><p>Example output:</p>
<pre><code class="hljs language-json"><span class="hljs-attr">&quot;Ports&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
  <span class="hljs-attr">&quot;80/tcp&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span>
    <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">&quot;HostIp&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;0.0.0.0&quot;</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">&quot;HostPort&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;8080&quot;</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">]</span>
<span class="hljs-punctuation">}</span>
</code></pre><h2 id="h2-common-port-mapping-patterns" class="group relative scroll-mt-24">
        <a href="#h2-common-port-mapping-patterns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Port Mapping Patterns
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-port-mapping-patterns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-web-applications" class="group relative scroll-mt-24">
        <a href="#h3-web-applications" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Web Applications
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-web-applications"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Frontend application</span>
docker run -p 3000:3000 react-app

<span class="hljs-comment"># Backend API</span>
docker run -p 8000:8000 api-server

<span class="hljs-comment"># Database (localhost only)</span>
docker run -p 127.0.0.1:5432:5432 postgres
</code></pre><h3 id="h3-development-environment" class="group relative scroll-mt-24">
        <a href="#h3-development-environment" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Development Environment
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-development-environment"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-comment"># docker-compose.yml</span>
<span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3&#x27;</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">app:</span>
    <span class="hljs-attr">build:</span> <span class="hljs-string">.</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;3000:3000&quot;</span>    <span class="hljs-comment"># Web server</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;35729:35729&quot;</span>  <span class="hljs-comment"># Live reload</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">.:/app</span>

  <span class="hljs-attr">db:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;127.0.0.1:5432:5432&quot;</span>
</code></pre><h3 id="h3-microservices" class="group relative scroll-mt-24">
        <a href="#h3-microservices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Microservices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-microservices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3&#x27;</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">api-gateway:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">api-gateway</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;80:8080&quot;</span>

  <span class="hljs-attr">auth-service:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">auth-service</span>
    <span class="hljs-comment"># No external ports - only accessible via Docker network</span>

  <span class="hljs-attr">user-service:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">user-service</span>
    <span class="hljs-comment"># No external ports</span>
</code></pre><p>Only the API gateway is exposed externally. Other services communicate via Docker&#39;s internal network.</p>
<h2 id="h2-troubleshooting-port-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-port-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Port Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-port-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-port-already-in-use" class="group relative scroll-mt-24">
        <a href="#h3-port-already-in-use" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port Already in Use
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-already-in-use"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Error:</p>
<pre><code>Error: bind: address already in use
</code></pre><p>Find what&#39;s using the port:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Linux/macOS</span>
<span class="hljs-built_in">sudo</span> lsof -i :8080

<span class="hljs-comment"># Or use netstat</span>
<span class="hljs-built_in">sudo</span> netstat -tlnp | grep :8080

<span class="hljs-comment"># Or ss</span>
<span class="hljs-built_in">sudo</span> ss -tlnp | grep :8080
</code></pre><p>Solutions:</p>
<ol>
<li><p><strong>Use a different host port:</strong></p>
<pre><code class="hljs language-bash">docker run -p 8081:80 nginx
</code></pre></li>
<li><p><strong>Stop the conflicting service:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> systemctl stop apache2
docker run -p 80:80 nginx
</code></pre></li>
<li><p><strong>Kill the process using the port:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">kill</span> &lt;PID&gt;
</code></pre></li>
</ol>
<h3 id="h3-container-port-not-responding" class="group relative scroll-mt-24">
        <a href="#h3-container-port-not-responding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Container Port Not Responding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-container-port-not-responding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Check if the service inside the container is actually listening:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Execute command in running container</span>
docker <span class="hljs-built_in">exec</span> mycontainer netstat -tlnp

<span class="hljs-comment"># Or check if the port is open</span>
docker <span class="hljs-built_in">exec</span> mycontainer nc -zv localhost 80
</code></pre><p>If the service isn&#39;t running inside the container, the port mapping won&#39;t help.</p>
<h3 id="h3-firewall-blocking-access" class="group relative scroll-mt-24">
        <a href="#h3-firewall-blocking-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Firewall Blocking Access
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-firewall-blocking-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If the container is accessible from localhost but not externally, check your firewall:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check if Docker added firewall rules</span>
<span class="hljs-built_in">sudo</span> iptables -L -n -v | grep 8080

<span class="hljs-comment"># Allow the port through ufw</span>
<span class="hljs-built_in">sudo</span> ufw allow 8080/tcp

<span class="hljs-comment"># Or firewalld</span>
<span class="hljs-built_in">sudo</span> firewall-cmd --permanent --add-port=8080/tcp
<span class="hljs-built_in">sudo</span> firewall-cmd --reload
</code></pre><h2 id="h2-docker-networks-and-port-forwarding" class="group relative scroll-mt-24">
        <a href="#h2-docker-networks-and-port-forwarding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Docker Networks and Port Forwarding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-docker-networks-and-port-forwarding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Containers on the same Docker network can communicate without port forwarding:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a network</span>
docker network create mynetwork

<span class="hljs-comment"># Run database (no port forwarding needed)</span>
docker run --network mynetwork --name db postgres

<span class="hljs-comment"># Run app (connects to &#x27;db&#x27; by name)</span>
docker run --network mynetwork --name app -p 8080:80 myapp
</code></pre><p>Inside <code>myapp</code>, connect to the database at <code>postgresql://db:5432</code> - no port forwarding needed because they&#39;re on the same network.</p>
<h2 id="h2-host-network-mode" class="group relative scroll-mt-24">
        <a href="#h2-host-network-mode" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Host Network Mode
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-host-network-mode"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Skip Docker networking entirely and use the host&#39;s network:</p>
<pre><code class="hljs language-bash">docker run --network host nginx
</code></pre><p>In host mode:</p>
<ul>
<li>No port mapping needed</li>
<li>Container uses host ports directly</li>
<li>Service on container port 80 is accessible at host port 80</li>
<li>Less isolation but simpler networking</li>
</ul>
<p>Use case: When you need maximum network performance or when port mapping overhead is a concern.</p>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Don&#39;t expose databases publicly</strong>: Always bind database ports to localhost:</p>
<pre><code class="hljs language-bash">docker run -p 127.0.0.1:5432:5432 postgres
</code></pre><p><strong>Use high ports for development</strong>: Avoid ports below 1024 which require root:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Good</span>
docker run -p 8080:80 nginx

<span class="hljs-comment"># Requires sudo</span>
<span class="hljs-built_in">sudo</span> docker run -p 80:80 nginx
</code></pre><p><strong>Document your port mappings</strong>: In your README or docker-compose.yml comments:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">services:</span>
  <span class="hljs-attr">app:</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;3000:3000&quot;</span>  <span class="hljs-comment"># Web UI</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;9229:9229&quot;</span>  <span class="hljs-comment"># Node.js debugger</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&quot;35729:35729&quot;</span>  <span class="hljs-comment"># Live reload</span>
</code></pre><p><strong>Use Docker Compose for complex setups</strong>: It&#39;s easier to manage multiple port mappings in YAML than remembering long docker run commands.</p>
<p><strong>Plan your port allocation</strong>: Maintain a list of ports used by different containers to avoid conflicts.</p>
<p>Port forwarding is fundamental to using Docker effectively. Whether you&#39;re running a simple web server or a complex microservices architecture, understanding how to map ports between your host and containers lets you expose services securely and accessibly. Use <code>-p</code> for basic mapping, Docker Compose for complex setups, and remember to bind sensitive services like databases to localhost only.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Use the AWS account_id Variable in Terraform]]></title>
      <link>https://devops-daily.com/posts/use-aws-account-id-variable</link>
      <description><![CDATA[Learn how to dynamically retrieve and use the AWS account_id variable in Terraform for your configurations.]]></description>
      <pubDate>Fri, 20 Jun 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/use-aws-account-id-variable</guid>
      <category><![CDATA[Terraform]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Terraform]]></category><category><![CDATA[AWS]]></category><category><![CDATA[Variables]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To use the AWS <code>account_id</code> variable in Terraform, leverage the <code>aws_caller_identity</code> data source. This allows you to dynamically retrieve the account ID for use in your configurations.</p>
<hr>
<p>The AWS <code>account_id</code> is a unique identifier for your AWS account. In Terraform, you can dynamically retrieve this value using the <code>aws_caller_identity</code> data source. This guide will show you how to use the <code>account_id</code> variable effectively.</p>
<h3 id="h3-why-use-the-account_id-variable" class="group relative scroll-mt-24">
        <a href="#h3-why-use-the-account_id-variable" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Use the account_id Variable?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-use-the-account_id-variable"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Dynamic Configurations</strong>: Avoid hardcoding the account ID in your Terraform files.</li>
<li><strong>Multi-Account Setups</strong>: Simplify configurations for environments spanning multiple AWS accounts.</li>
<li><strong>Security</strong>: Reduce the risk of errors caused by incorrect account IDs.</li>
</ul>
<h3 id="h3-retrieving-the-account_id" class="group relative scroll-mt-24">
        <a href="#h3-retrieving-the-account_id" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Retrieving the account_id
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-retrieving-the-account_id"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Use the <code>aws_caller_identity</code> data source to retrieve the account ID dynamically.</p>
<h4 id="h4-example-using-aws_caller_identity" class="group relative scroll-mt-24">
        <a href="#h4-example-using-aws_caller_identity" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Using aws_caller_identity
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-example-using-aws_caller_identity"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-hcl"><span class="hljs-keyword">data</span> <span class="hljs-string">&quot;aws_caller_identity&quot;</span> <span class="hljs-string">&quot;current&quot;</span> {}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;account_id&quot;</span> {
  value = <span class="hljs-keyword">data</span>.aws_caller_identity.current.account_id
}
</code></pre><p>In this example, the <code>account_id</code> is retrieved and displayed as an output.</p>
<h3 id="h3-using-the-account_id-in-resources" class="group relative scroll-mt-24">
        <a href="#h3-using-the-account_id-in-resources" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using the account_id in Resources
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-the-account_id-in-resources"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can use the <code>account_id</code> variable in resource definitions to make your configurations dynamic.</p>
<h4 id="h4-example-s3-bucket-naming" class="group relative scroll-mt-24">
        <a href="#h4-example-s3-bucket-naming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: S3 Bucket Naming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-example-s3-bucket-naming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-hcl"><span class="hljs-keyword">resource</span> <span class="hljs-string">&quot;aws_s3_bucket&quot;</span> <span class="hljs-string">&quot;example&quot;</span> {
  bucket = <span class="hljs-string">&quot;example-bucket-<span class="hljs-variable">${data.aws_caller_identity.current.account_id}</span>&quot;</span>
  acl    = <span class="hljs-string">&quot;private&quot;</span>
}
</code></pre><p>This configuration creates an S3 bucket with a name that includes the account ID.</p>
<h3 id="h3-best-practices" class="group relative scroll-mt-24">
        <a href="#h3-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Avoid Hardcoding</strong>: Always use the <code>aws_caller_identity</code> data source to retrieve the account ID dynamically.</li>
<li><strong>Use Outputs</strong>: Export the <code>account_id</code> as an output for reuse in other configurations.</li>
<li><strong>Test in Non-Production</strong>: Validate your configurations in a non-production environment before applying them to production.</li>
</ul>
<p>By using the AWS <code>account_id</code> variable dynamically, you can create more flexible and secure Terraform configurations that adapt to different environments and accounts.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Make an Existing Git Branch Track a Remote Branch]]></title>
      <link>https://devops-daily.com/posts/make-git-branch-track-remote</link>
      <description><![CDATA[Need to set up tracking between a local branch and a remote branch? Learn how to configure branch tracking for easier push and pull operations in Git.]]></description>
      <pubDate>Wed, 18 Jun 2025 12:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/make-git-branch-track-remote</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Remote Branches]]></category><category><![CDATA[Version Control]]></category><category><![CDATA[Branch Tracking]]></category><category><![CDATA[Workflows]]></category>
      <content:encoded><![CDATA[<p>You created a local branch and pushed it to a remote repository, but now when you run <code>git pull</code> or <code>git push</code>, Git asks you to specify which remote branch to use. This happens because your local branch is not configured to track the remote branch.</p>
<p><strong>TLDR:</strong> To make your current branch track a remote branch, use <code>git branch --set-upstream-to=origin/branch-name</code> or <code>git push -u origin branch-name</code>. The <code>-u</code> flag sets up tracking automatically when pushing. Once configured, you can use <code>git pull</code> and <code>git push</code> without specifying the remote branch.</p>
<p>In this guide, you&#39;ll learn how to set up branch tracking and understand what it does.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You&#39;ll need Git installed, a repository with remote access, and at least one local branch. Understanding basic Git concepts like branches, remotes, and push/pull operations will help you follow along.</p>
<h2 id="h2-understanding-branch-tracking" class="group relative scroll-mt-24">
        <a href="#h2-understanding-branch-tracking" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Branch Tracking
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-branch-tracking"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Branch tracking creates a relationship between a local branch and a remote branch. When tracking is set up, Git remembers which remote branch corresponds to your local branch:</p>
<pre><code>Local Branch          Remote Branch
------------          -------------
feature-auth   &lt;--&gt;   origin/feature-auth
</code></pre><p>With this relationship established, you can use simplified commands:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Without tracking:</span>
git pull origin feature-auth
git push origin feature-auth

<span class="hljs-comment"># With tracking:</span>
git pull
git push
</code></pre><p>Git automatically knows which remote branch to use based on the tracking configuration.</p>
<h2 id="h2-setting-up-tracking-for-current-branch" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-tracking-for-current-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Tracking for Current Branch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-tracking-for-current-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To configure your current branch to track a remote branch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Make current branch track a remote branch</span>
git branch --set-upstream-to=origin/feature-auth

<span class="hljs-comment"># Shorter syntax</span>
git branch -u origin/feature-auth
</code></pre><p>After running this command, your local branch tracks the specified remote branch. Verify the configuration:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check tracking information</span>
git branch -vv

<span class="hljs-comment"># Output shows tracking relationship:</span>
<span class="hljs-comment"># * feature-auth a1b2c3d [origin/feature-auth] Add authentication</span>
</code></pre><p>The bracketed text shows which remote branch your local branch tracks.</p>
<h2 id="h2-setting-up-tracking-while-pushing" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-tracking-while-pushing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Tracking While Pushing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-tracking-while-pushing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The easiest way to set up tracking is during your first push:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Push and set upstream in one command</span>
git push -u origin feature-auth

<span class="hljs-comment"># Or use the long form</span>
git push --set-upstream origin feature-auth
</code></pre><p>The <code>-u</code> flag tells Git to set the current branch to track the remote branch you&#39;re pushing to. This is the most common workflow when creating new branches:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create and switch to new branch</span>
git checkout -b new-feature

<span class="hljs-comment"># Make some commits</span>
git add .
git commit -m <span class="hljs-string">&quot;Add new feature&quot;</span>

<span class="hljs-comment"># Push and set up tracking</span>
git push -u origin new-feature

<span class="hljs-comment"># Future pushes only need</span>
git push
</code></pre><p>After the initial push with <code>-u</code>, subsequent pushes and pulls do not need to specify the remote or branch name.</p>
<h2 id="h2-setting-up-tracking-for-different-branch-names" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-tracking-for-different-branch-names" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Tracking for Different Branch Names
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-tracking-for-different-branch-names"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Sometimes your local branch has a different name than the remote branch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Local branch is &#x27;feature&#x27;, remote is &#x27;feature-auth&#x27;</span>
git branch --set-upstream-to=origin/feature-auth feature

<span class="hljs-comment"># Or if it&#x27;s your current branch</span>
git branch -u origin/feature-auth
</code></pre><p>This works but can be confusing. It&#39;s generally better to rename your local branch to match:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Rename local branch to match remote</span>
git branch -m feature feature-auth

<span class="hljs-comment"># Set up tracking</span>
git branch -u origin/feature-auth
</code></pre><p>Now your local and remote branch names match, reducing confusion.</p>
<h2 id="h2-checking-current-tracking-configuration" class="group relative scroll-mt-24">
        <a href="#h2-checking-current-tracking-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking Current Tracking Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-current-tracking-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To see which branches track which remotes:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Show tracking info for all branches</span>
git branch -vv

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment">#   main           a1b2c3d [origin/main] Update README</span>
<span class="hljs-comment"># * feature-auth   e4f5g6h [origin/feature-auth: ahead 2] Add OAuth</span>
<span class="hljs-comment">#   develop        i7j8k9l [origin/develop: behind 1] Merge pull request</span>
</code></pre><p>This shows:</p>
<ul>
<li>Current branch (marked with <code>*</code>)</li>
<li>Latest commit hash</li>
<li>Remote tracking branch in brackets</li>
<li>Sync status (ahead/behind)</li>
<li>Latest commit message</li>
</ul>
<p>For detailed information about a specific branch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Get remote tracking branch for current branch</span>
git rev-parse --abbrev-ref --symbolic-full-name @{u}

<span class="hljs-comment"># Output: origin/feature-auth</span>
</code></pre><h2 id="h2-removing-tracking-relationship" class="group relative scroll-mt-24">
        <a href="#h2-removing-tracking-relationship" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Removing Tracking Relationship
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-removing-tracking-relationship"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To stop tracking a remote branch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Remove upstream tracking for current branch</span>
git branch --unset-upstream

<span class="hljs-comment"># Remove tracking for specific branch</span>
git branch --unset-upstream feature-auth
</code></pre><p>After removing tracking, you&#39;ll need to specify the remote and branch name when pushing or pulling.</p>
<h2 id="h2-setting-up-tracking-when-checking-out-remote-branches" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-tracking-when-checking-out-remote-branches" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Tracking When Checking Out Remote Branches
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-tracking-when-checking-out-remote-branches"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you check out a remote branch, Git automatically creates a tracking relationship:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># List remote branches</span>
git branch -r

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment">#   origin/main</span>
<span class="hljs-comment">#   origin/feature-auth</span>
<span class="hljs-comment">#   origin/develop</span>

<span class="hljs-comment"># Check out remote branch (creates local tracking branch)</span>
git checkout feature-auth

<span class="hljs-comment"># Git automatically runs something like:</span>
<span class="hljs-comment"># git checkout -b feature-auth --track origin/feature-auth</span>
</code></pre><p>This creates a local branch that tracks the remote branch with the same name.</p>
<p>Explicitly create a tracking branch with a custom name:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create local branch with different name tracking remote</span>
git checkout -b my-feature --track origin/feature-auth

<span class="hljs-comment"># Verify tracking</span>
git branch -vv
<span class="hljs-comment"># Output: * my-feature a1b2c3d [origin/feature-auth] Add feature</span>
</code></pre><h2 id="h2-handling-multiple-remotes" class="group relative scroll-mt-24">
        <a href="#h2-handling-multiple-remotes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Handling Multiple Remotes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-handling-multiple-remotes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you work with multiple remotes (like origin and upstream), specify which remote to track:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Track a branch on the upstream remote</span>
git branch --set-upstream-to=upstream/main

<span class="hljs-comment"># Track a branch on origin</span>
git branch --set-upstream-to=origin/main

<span class="hljs-comment"># Check configuration</span>
git branch -vv
</code></pre><p>This is common when working with forks:</p>
<pre><code>Your Workflow:
  Local main   --&gt;  origin/main (your fork)
               \-&gt;  upstream/main (original repo)
</code></pre><p>You might configure your main branch to track upstream/main for pulling updates, while pushing to origin/main.</p>
<h2 id="h2-setting-default-push-behavior" class="group relative scroll-mt-24">
        <a href="#h2-setting-default-push-behavior" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Default Push Behavior
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-default-push-behavior"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Configure how Git handles pushing branches that do not have tracking set up:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Only push current branch to its upstream</span>
git config --global push.default simple

<span class="hljs-comment"># Push all branches with matching names</span>
git config --global push.default matching

<span class="hljs-comment"># Only push current branch to same-named remote branch</span>
git config --global push.default current
</code></pre><p>The <code>simple</code> setting is the default and safest option - it only pushes the current branch to its tracked upstream branch.</p>
<h2 id="h2-tracking-configuration-in-git-config" class="group relative scroll-mt-24">
        <a href="#h2-tracking-configuration-in-git-config" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Tracking Configuration in Git Config
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tracking-configuration-in-git-config"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Branch tracking is stored in your repository&#39;s Git config:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># View branch configuration</span>
git config --<span class="hljs-built_in">local</span> --get-regexp <span class="hljs-string">&quot;branch.*&quot;</span>

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># branch.main.remote origin</span>
<span class="hljs-comment"># branch.main.merge refs/heads/main</span>
<span class="hljs-comment"># branch.feature-auth.remote origin</span>
<span class="hljs-comment"># branch.feature-auth.merge refs/heads/feature-auth</span>
</code></pre><p>This shows the remote and merge configuration for each tracking branch. You can manually edit these:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set remote for a branch</span>
git config branch.feature-auth.remote origin

<span class="hljs-comment"># Set merge branch</span>
git config branch.feature-auth.merge refs/heads/feature-auth
</code></pre><p>But using <code>git branch -u</code> is easier and less error-prone.</p>
<h2 id="h2-setting-up-tracking-in-scripts" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-tracking-in-scripts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up Tracking in Scripts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-tracking-in-scripts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When automating Git workflows, set up tracking in scripts:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>

<span class="hljs-comment"># Get current branch name</span>
BRANCH=$(git branch --show-current)

<span class="hljs-comment"># Set up tracking if not already configured</span>
<span class="hljs-keyword">if</span> ! git config branch.<span class="hljs-variable">$BRANCH</span>.remote &gt; /dev/null 2&gt;&amp;1; <span class="hljs-keyword">then</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Setting up tracking for <span class="hljs-variable">$BRANCH</span>&quot;</span>
  git push -u origin <span class="hljs-string">&quot;<span class="hljs-variable">$BRANCH</span>&quot;</span>
<span class="hljs-keyword">else</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Branch <span class="hljs-variable">$BRANCH</span> already tracks <span class="hljs-subst">$(git config branch.$BRANCH.remote)</span>/<span class="hljs-subst">$(git config branch.$BRANCH.merge | sed &#x27;s|refs/heads/||&#x27;)</span>&quot;</span>
<span class="hljs-keyword">fi</span>
</code></pre><p>This script checks if tracking is configured and sets it up if needed.</p>
<h2 id="h2-tracking-and-pullpush-behavior" class="group relative scroll-mt-24">
        <a href="#h2-tracking-and-pullpush-behavior" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Tracking and Pull/Push Behavior
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tracking-and-pullpush-behavior"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>With tracking configured, Git&#39;s behavior changes:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Without tracking:</span>
git pull
<span class="hljs-comment"># fatal: The current branch feature-auth has no upstream branch.</span>

<span class="hljs-comment"># With tracking:</span>
git pull
<span class="hljs-comment"># Already up to date.</span>
</code></pre><p>The same applies to push:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Without tracking:</span>
git push
<span class="hljs-comment"># fatal: The current branch feature-auth has no upstream branch.</span>
<span class="hljs-comment"># Use: git push --set-upstream origin feature-auth</span>

<span class="hljs-comment"># With tracking:</span>
git push
<span class="hljs-comment"># Everything up-to-date</span>
</code></pre><h2 id="h2-fixing-no-upstream-branch-errors" class="group relative scroll-mt-24">
        <a href="#h2-fixing-no-upstream-branch-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Fixing No upstream branch Errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-fixing-no-upstream-branch-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you see &quot;The current branch has no upstream branch&quot;, fix it with:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Follow Git&#x27;s suggestion</span>
git push --set-upstream origin branch-name

<span class="hljs-comment"># Or set tracking without pushing</span>
git branch -u origin/branch-name

<span class="hljs-comment"># Then push</span>
git push
</code></pre><p>After setting upstream, the error will not occur again for that branch.</p>
<h2 id="h2-best-practices-for-branch-tracking" class="group relative scroll-mt-24">
        <a href="#h2-best-practices-for-branch-tracking" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices for Branch Tracking
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices-for-branch-tracking"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Always set up tracking when creating new branches:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Good: Set tracking immediately</span>
git checkout -b new-feature
git push -u origin new-feature

<span class="hljs-comment"># Less ideal: Set tracking later</span>
git checkout -b new-feature
git push origin new-feature
git branch -u origin/new-feature
</code></pre><p>Keep local and remote branch names identical to avoid confusion:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Good: Matching names</span>
git checkout -b feature-auth
git push -u origin feature-auth

<span class="hljs-comment"># Confusing: Different names</span>
git checkout -b my-feature
git push -u origin feature-auth
</code></pre><p>Regularly check tracking status:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Quick check of current branch</span>
git status

<span class="hljs-comment"># Detailed check of all branches</span>
git branch -vv
</code></pre><p>Now you know how to set up and manage branch tracking in Git. The <code>-u</code> flag when pushing is the easiest way to establish tracking for new branches, while <code>git branch --set-upstream-to</code> lets you configure tracking for existing branches. With tracking configured, your Git workflow becomes cleaner and requires fewer keystrokes.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How do I Get Flask to Run on Port 80?]]></title>
      <link>https://devops-daily.com/posts/how-do-i-get-flask-to-run-on-port-80</link>
      <description><![CDATA[Running Flask on port 80 requires special permissions since port 80 is a privileged port. Learn the different approaches to running Flask on port 80, from using sudo to setting up reverse proxies with Nginx.]]></description>
      <pubDate>Wed, 18 Jun 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-do-i-get-flask-to-run-on-port-80</guid>
      <category><![CDATA[Python]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Python]]></category><category><![CDATA[Flask]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Linux]]></category>
      <content:encoded><![CDATA[<p>By default, Flask&#39;s development server runs on port 5000, but you might want to run your application on port 80 so users can access it without specifying a port number in the URL. Port 80 is the standard HTTP port, but it&#39;s also a privileged port on Unix-like systems, which means you need special permissions to bind to it.</p>
<p>This guide covers several approaches to running Flask on port 80, from quick development solutions to production-ready setups.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For development, run Flask with sudo: <code>sudo python app.py</code> and set <code>app.run(host=&#39;0.0.0.0&#39;, port=80)</code>. For production, use a reverse proxy like Nginx or Apache to forward requests from port 80 to your Flask app running on a higher port like 5000 or 8000. Never run Flask&#39;s development server in production.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need Python and Flask installed on your system. Basic familiarity with Flask applications and command-line operations will help. If you&#39;re deploying to production, you should understand web servers and reverse proxies.</p>
<h2 id="h2-understanding-privileged-ports" class="group relative scroll-mt-24">
        <a href="#h2-understanding-privileged-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Privileged Ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-privileged-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Ports numbered 1-1023 are considered privileged ports on Unix-like systems (Linux, macOS). Only processes running as root can bind to these ports. This security measure prevents regular users from running services that could impersonate system services.</p>
<p>Port 80 is the standard HTTP port, which means:</p>
<ul>
<li>Users can access your site at <code>http://example.com</code> instead of <code>http://example.com:5000</code></li>
<li>Browsers connect to port 80 by default when you don&#39;t specify a port</li>
<li>You need elevated privileges to use it</li>
</ul>
<h2 id="h2-quick-solution-running-flask-with-sudo" class="group relative scroll-mt-24">
        <a href="#h2-quick-solution-running-flask-with-sudo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Quick Solution: Running Flask with Sudo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-quick-solution-running-flask-with-sudo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The simplest way to run Flask on port 80 during development is using sudo:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># app.py</span>
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask

app = Flask(__name__)

<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&#x27;/&#x27;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">hello</span>():
    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;Hello from port 80!&#x27;</span>

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:
    <span class="hljs-comment"># Bind to all interfaces on port 80</span>
    app.run(host=<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, port=<span class="hljs-number">80</span>)
</code></pre><p>Run it with elevated privileges:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> python app.py
</code></pre><p>Or if using Python 3 explicitly:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> python3 app.py
</code></pre><p>You&#39;ll see output like:</p>
<pre><code> * Running on http://0.0.0.0:80
 * Running on http://127.0.0.1:80
 * Running on http://192.168.1.100:80
</code></pre><p>Now you can access your app at <code>http://localhost</code> without specifying a port.</p>
<p><strong>Important</strong>: This approach works for development and testing, but you should never run Flask&#39;s built-in development server in production. It&#39;s not designed for security, performance, or stability under real-world load.</p>
<h2 id="h2-using-setcap-to-grant-port-binding-permissions" class="group relative scroll-mt-24">
        <a href="#h2-using-setcap-to-grant-port-binding-permissions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using setcap to Grant Port Binding Permissions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-setcap-to-grant-port-binding-permissions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Instead of running your entire Python process as root, you can grant the Python interpreter permission to bind to privileged ports:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Give Python the capability to bind to privileged ports</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">setcap</span> <span class="hljs-string">&#x27;cap_net_bind_service=+ep&#x27;</span> /usr/bin/python3.10
</code></pre><p>Replace <code>python3.10</code> with your actual Python version:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find your Python path</span>
<span class="hljs-built_in">which</span> python3

<span class="hljs-comment"># Example output: /usr/bin/python3.10</span>
<span class="hljs-comment"># Then use that path with setcap</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">setcap</span> <span class="hljs-string">&#x27;cap_net_bind_service=+ep&#x27;</span> /usr/bin/python3.10
</code></pre><p>After setting this capability, you can run your Flask app on port 80 without sudo:</p>
<pre><code class="hljs language-bash">python3 app.py
</code></pre><p>This approach is more secure than using sudo because only the port binding operation has elevated privileges, not your entire application.</p>
<p><strong>Note</strong>: This affects all Python scripts using that interpreter. If you&#39;re using virtual environments, you need to set the capability on the Python binary inside the virtual environment.</p>
<h2 id="h2-production-solution-using-a-reverse-proxy" class="group relative scroll-mt-24">
        <a href="#h2-production-solution-using-a-reverse-proxy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Production Solution: Using a Reverse Proxy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-production-solution-using-a-reverse-proxy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The recommended way to run Flask in production is behind a reverse proxy like Nginx or Apache. The reverse proxy runs on port 80 and forwards requests to your Flask application running on a higher, unprivileged port.</p>
<h3 id="h3-setting-up-with-nginx" class="group relative scroll-mt-24">
        <a href="#h3-setting-up-with-nginx" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up with Nginx
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-setting-up-with-nginx"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>First, run your Flask app on an unprivileged port using a production WSGI server:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># app.py</span>
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask

app = Flask(__name__)

<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&#x27;/&#x27;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">hello</span>():
    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;Hello from Flask behind Nginx!&#x27;</span>

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:
    <span class="hljs-comment"># Run on port 8000 for production</span>
    app.run(host=<span class="hljs-string">&#x27;127.0.0.1&#x27;</span>, port=<span class="hljs-number">8000</span>)
</code></pre><p>In production, use Gunicorn instead of Flask&#39;s development server:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install Gunicorn</span>
pip install gunicorn

<span class="hljs-comment"># Run your Flask app with Gunicorn on port 8000</span>
gunicorn -w 4 -b 127.0.0.1:8000 app:app
</code></pre><p>The <code>-w 4</code> flag runs 4 worker processes for handling concurrent requests. The <code>-b 127.0.0.1:8000</code> binds to localhost on port 8000.</p>
<p>Configure Nginx to proxy requests from port 80 to your Flask app:</p>
<pre><code class="hljs language-nginx"><span class="hljs-comment"># /etc/nginx/sites-available/flask-app</span>
<span class="hljs-section">server</span> {
    <span class="hljs-attribute">listen</span> <span class="hljs-number">80</span>;
    <span class="hljs-attribute">server_name</span> example.com www.example.com;

    <span class="hljs-section">location</span> / {
        <span class="hljs-attribute">proxy_pass</span> http://127.0.0.1:8000;
        <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;
        <span class="hljs-attribute">proxy_set_header</span> X-Real-IP <span class="hljs-variable">$remote_addr</span>;
        <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-For <span class="hljs-variable">$proxy_add_x_forwarded_for</span>;
        <span class="hljs-attribute">proxy_set_header</span> X-Forwarded-Proto <span class="hljs-variable">$scheme</span>;
    }
}
</code></pre><p>Enable the site and restart Nginx:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a symbolic link to enable the site</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">ln</span> -s /etc/nginx/sites-available/flask-app /etc/nginx/sites-enabled/

<span class="hljs-comment"># Test the configuration</span>
<span class="hljs-built_in">sudo</span> nginx -t

<span class="hljs-comment"># Reload Nginx</span>
<span class="hljs-built_in">sudo</span> systemctl reload nginx
</code></pre><p>Now requests to <code>http://example.com</code> on port 80 are forwarded to your Flask app running on port 8000.</p>
<h2 id="h2-using-systemd-to-manage-your-flask-service" class="group relative scroll-mt-24">
        <a href="#h2-using-systemd-to-manage-your-flask-service" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using systemd to Manage Your Flask Service
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-systemd-to-manage-your-flask-service"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Create a systemd service file to automatically start your Flask app:</p>
<pre><code class="hljs language-ini"><span class="hljs-comment"># /etc/systemd/system/flask-app.service</span>
<span class="hljs-section">[Unit]</span>
<span class="hljs-attr">Description</span>=Flask Application
<span class="hljs-attr">After</span>=network.target

<span class="hljs-section">[Service]</span>
<span class="hljs-attr">User</span>=www-data
<span class="hljs-attr">Group</span>=www-data
<span class="hljs-attr">WorkingDirectory</span>=/var/www/flask-app
<span class="hljs-attr">Environment</span>=<span class="hljs-string">&quot;PATH=/var/www/flask-app/venv/bin&quot;</span>
<span class="hljs-attr">ExecStart</span>=/var/www/flask-app/venv/bin/gunicorn -w <span class="hljs-number">4</span> -b <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">8000</span> app:app

<span class="hljs-section">[Install]</span>
<span class="hljs-attr">WantedBy</span>=multi-user.target
</code></pre><p>Start and enable the service:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Reload systemd to recognize the new service</span>
<span class="hljs-built_in">sudo</span> systemctl daemon-reload

<span class="hljs-comment"># Start the service</span>
<span class="hljs-built_in">sudo</span> systemctl start flask-app

<span class="hljs-comment"># Enable it to start on boot</span>
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> flask-app

<span class="hljs-comment"># Check status</span>
<span class="hljs-built_in">sudo</span> systemctl status flask-app
</code></pre><h2 id="h2-using-iptables-for-port-forwarding" class="group relative scroll-mt-24">
        <a href="#h2-using-iptables-for-port-forwarding" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using iptables for Port Forwarding
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-iptables-for-port-forwarding"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Another approach is using iptables to forward traffic from port 80 to a higher port:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Forward traffic from port 80 to port 5000</span>
<span class="hljs-built_in">sudo</span> iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5000
</code></pre><p>Your Flask app runs on port 5000 without elevated privileges, but users access it on port 80:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># app.py</span>
<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask

app = Flask(__name__)

<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">&#x27;/&#x27;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">hello</span>():
    <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;Hello via iptables forwarding!&#x27;</span>

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:
    app.run(host=<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, port=<span class="hljs-number">5000</span>)
</code></pre><p>Run normally:</p>
<pre><code class="hljs language-bash">python app.py
</code></pre><p>Access at <code>http://localhost</code> (port 80), which forwards to port 5000.</p>
<p>To make iptables rules persistent across reboots:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Install iptables-persistent</span>
<span class="hljs-built_in">sudo</span> apt-get install iptables-persistent

<span class="hljs-comment"># Save current rules</span>
<span class="hljs-built_in">sudo</span> netfilter-persistent save
</code></pre><h2 id="h2-docker-approach" class="group relative scroll-mt-24">
        <a href="#h2-docker-approach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Docker Approach
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-docker-approach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re running Flask in Docker, you can map port 80 on the host to your container&#39;s port without elevated privileges for the Flask app:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Dockerfile</span>
<span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.10</span>-slim

<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>

<span class="hljs-keyword">COPY</span><span class="language-bash"> requirements.txt .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> pip install --no-cache-dir -r requirements.txt</span>

<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>

<span class="hljs-comment"># App runs on port 5000 inside container</span>
<span class="hljs-keyword">EXPOSE</span> <span class="hljs-number">5000</span>

<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;python&quot;</span>, <span class="hljs-string">&quot;app.py&quot;</span>]</span>
</code></pre><p>Run the container with port mapping:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Map host port 80 to container port 5000</span>
<span class="hljs-built_in">sudo</span> docker run -p 80:5000 flask-app
</code></pre><p>The Flask app inside the container runs on port 5000 (unprivileged), but Docker maps it to port 80 on the host.</p>
<h2 id="h2-security-considerations" class="group relative scroll-mt-24">
        <a href="#h2-security-considerations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Security Considerations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-security-considerations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When running Flask on port 80, keep these security practices in mind:</p>
<p><strong>Never use Flask&#39;s development server in production</strong>: It&#39;s single-threaded, doesn&#39;t handle concurrent requests well, and has known security vulnerabilities. Always use a production WSGI server like Gunicorn, uWSGI, or Waitress.</p>
<p><strong>Run Flask as a non-privileged user</strong>: If using a reverse proxy or systemd, configure the service to run as a dedicated user like <code>www-data</code>, not as root.</p>
<p><strong>Use HTTPS in production</strong>: Port 80 serves unencrypted HTTP traffic. For production sites, use port 443 with SSL/TLS certificates (Let&#39;s Encrypt is free). Your reverse proxy can handle SSL termination.</p>
<p><strong>Keep Flask behind a firewall</strong>: If your Flask app binds to <code>0.0.0.0:8000</code>, it&#39;s accessible from any network interface. Use <code>127.0.0.1:8000</code> to ensure it only accepts connections from localhost (via the reverse proxy).</p>
<h2 id="h2-choosing-the-right-approach" class="group relative scroll-mt-24">
        <a href="#h2-choosing-the-right-approach" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Choosing the Right Approach
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-choosing-the-right-approach"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s when to use each method:</p>
<p><strong>Development and testing</strong>: Use <code>sudo python app.py</code> for quick local testing. It&#39;s simple and gets you running fast.</p>
<p><strong>Production deployment</strong>: Always use a reverse proxy (Nginx or Apache) with a production WSGI server (Gunicorn). This is the industry standard for good reason - it&#39;s secure, performant, and maintainable.</p>
<p><strong>Containerized deployments</strong>: Use Docker&#39;s port mapping to handle the privileged port binding at the container runtime level.</p>
<p><strong>Shared hosting or restricted environments</strong>: If you can&#39;t install a reverse proxy, use iptables port forwarding or setcap.</p>
<h2 id="h2-common-issues-and-solutions" class="group relative scroll-mt-24">
        <a href="#h2-common-issues-and-solutions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Issues and Solutions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-issues-and-solutions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-permission-denied-when-binding-to-port-80" class="group relative scroll-mt-24">
        <a href="#h3-permission-denied-when-binding-to-port-80" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Permission denied when binding to port 80
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-permission-denied-when-binding-to-port-80"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Error:</p>
<pre><code>PermissionError: [Errno 13] Permission denied
</code></pre><p>Solution: Either use sudo, setcap, or run your app on a higher port with a reverse proxy.</p>
<h3 id="h3-port-80-already-in-use" class="group relative scroll-mt-24">
        <a href="#h3-port-80-already-in-use" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Port 80 already in use
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-port-80-already-in-use"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Error:</p>
<pre><code>OSError: [Errno 98] Address already in use
</code></pre><p>Solution: Another service (likely Apache or Nginx) is already using port 80. Check what&#39;s running:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> lsof -i :80
<span class="hljs-comment"># or</span>
<span class="hljs-built_in">sudo</span> netstat -tlnp | grep :80
</code></pre><p>Stop the conflicting service or configure it to proxy to your Flask app instead.</p>
<h3 id="h3-app-works-locally-but-not-externally" class="group relative scroll-mt-24">
        <a href="#h3-app-works-locally-but-not-externally" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          App works locally but not externally
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-app-works-locally-but-not-externally"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you can access your app at <code>http://localhost</code> but not from other machines, check:</p>
<ol>
<li>Flask is bound to <code>0.0.0.0</code>, not <code>127.0.0.1</code></li>
<li>Your firewall allows incoming connections on port 80</li>
<li>Your cloud provider&#39;s security group permits port 80 traffic</li>
</ol>
<p>Running Flask on port 80 is straightforward once you understand the privilege requirements. For development, sudo or setcap works fine. For production, always use a reverse proxy with a production-grade WSGI server. This combination gives you security, performance, and the ability to serve your Flask app on the standard HTTP port that users expect.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Can Two Different Sockets Share a TCP Port?]]></title>
      <link>https://devops-daily.com/posts/can-two-sockets-share-tcp-port</link>
      <description><![CDATA[Understand how TCP port sharing works with SO_REUSEADDR and SO_REUSEPORT, when multiple sockets can bind to the same port, and the limitations you need to know.]]></description>
      <pubDate>Thu, 12 Jun 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/can-two-sockets-share-tcp-port</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[TCP]]></category><category><![CDATA[Sockets]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Programming]]></category><category><![CDATA[Ports]]></category>
      <content:encoded><![CDATA[<p><strong>TLDR:</strong> Yes, multiple sockets can share a port in specific scenarios. Different connections (unique combinations of local IP, local port, remote IP, remote port) can coexist on the same local port - this is how web servers handle multiple clients. Multiple processes can bind to the same port using <code>SO_REUSEPORT</code> (Linux 3.9+) for load balancing. <code>SO_REUSEADDR</code> lets you rebind a port in TIME_WAIT state but doesn&#39;t allow true sharing of listening ports.</p>
<p>The question &quot;can two sockets share a port?&quot; has different answers depending on what you mean by &quot;share.&quot; Let&#39;s break down the scenarios.</p>
<h2 id="h2-how-tcp-connections-are-identified" class="group relative scroll-mt-24">
        <a href="#h2-how-tcp-connections-are-identified" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How TCP Connections Are Identified
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-tcp-connections-are-identified"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A TCP connection is uniquely identified by a tuple of four values:</p>
<pre><code>Connection = (Local IP, Local Port, Remote IP, Remote Port)

Example connections on port 80:
Connection 1: (192.168.1.10:80, 192.168.1.100:54321)
Connection 2: (192.168.1.10:80, 192.168.1.101:54322)
Connection 3: (192.168.1.10:80, 192.168.1.100:54323)

All three share local port 80, but they&#x27;re different connections
</code></pre><p>As long as at least one element differs, connections are unique. This is how a single web server on port 80 handles thousands of clients simultaneously - each client connection has a different remote IP or remote port.</p>
<h2 id="h2-scenario-1-server-accepting-multiple-connections-always-allowed" class="group relative scroll-mt-24">
        <a href="#h2-scenario-1-server-accepting-multiple-connections-always-allowed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 1: Server Accepting Multiple Connections (Always Allowed)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-1-server-accepting-multiple-connections-always-allowed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When a server binds to a port and listens, it creates one socket. When clients connect, the <code>accept()</code> call creates new sockets - one per connection:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

<span class="hljs-comment"># Server socket - binds to port 8080</span>
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
server_socket.listen(<span class="hljs-number">5</span>)

<span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Server listening on port 8080&quot;</span>)

<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
    <span class="hljs-comment"># Each accept() creates a new socket sharing port 8080</span>
    client_socket, addr = server_socket.accept()
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;New connection from <span class="hljs-subst">{addr}</span>&quot;</span>)

    <span class="hljs-comment"># client_socket is a new socket, but still uses local port 8080</span>
    <span class="hljs-comment"># Connection: (server_ip:8080, client_ip:client_port)</span>

    <span class="hljs-comment"># Handle the client (in real code, do this in a thread)</span>
    data = client_socket.recv(<span class="hljs-number">1024</span>)
    client_socket.sendall(data)
    client_socket.close()
</code></pre><p>Each <code>client_socket</code> is a separate socket object, but they all share the local port 8080. This is normal TCP behavior and always works. The operating system distinguishes connections by the remote address.</p>
<h2 id="h2-scenario-2-binding-multiple-sockets-to-same-port-usually-fails" class="group relative scroll-mt-24">
        <a href="#h2-scenario-2-binding-multiple-sockets-to-same-port-usually-fails" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 2: Binding Multiple Sockets to Same Port (Usually Fails)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-2-binding-multiple-sockets-to-same-port-usually-fails"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>By default, you cannot bind two separate sockets to the same port:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

<span class="hljs-comment"># First socket binds successfully</span>
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock1.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
<span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Socket 1 bound to port 8080&quot;</span>)

<span class="hljs-comment"># Second socket fails with &quot;Address already in use&quot;</span>
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
<span class="hljs-keyword">try</span>:
    sock2.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
<span class="hljs-keyword">except</span> OSError <span class="hljs-keyword">as</span> e:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Socket 2 failed: <span class="hljs-subst">{e}</span>&quot;</span>)
    <span class="hljs-comment"># Output: Socket 2 failed: [Errno 48] Address already in use</span>
</code></pre><p>This protection prevents conflicts - if two programs could listen on the same port, incoming connections would be randomly assigned, causing chaos.</p>
<h2 id="h2-scenario-3-so_reuseaddr-rebinding-after-close" class="group relative scroll-mt-24">
        <a href="#h2-scenario-3-so_reuseaddr-rebinding-after-close" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 3: SO_REUSEADDR (Rebinding After Close)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-3-so_reuseaddr-rebinding-after-close"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>SO_REUSEADDR</code> lets you bind to a port that&#39;s in TIME_WAIT state. When a server closes a socket, the OS keeps the port reserved for a short period (typically 30-120 seconds) to handle any delayed packets:</p>
<pre><code>Server closes connection:
Connection moves to TIME_WAIT state
Port 8080 is reserved for ~60 seconds
New bind() to port 8080 fails... unless SO_REUSEADDR is set
</code></pre><p>Here&#39;s how to use it:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

<span class="hljs-keyword">def</span> <span class="hljs-title function_">create_server</span>(<span class="hljs-params">port</span>):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    <span class="hljs-comment"># Allow reusing the port immediately after close</span>
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, <span class="hljs-number">1</span>)

    sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, port))
    sock.listen(<span class="hljs-number">5</span>)
    <span class="hljs-keyword">return</span> sock

<span class="hljs-comment"># First server</span>
server1 = create_server(<span class="hljs-number">8080</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Server started on port 8080&quot;</span>)

<span class="hljs-comment"># Stop and restart without waiting for TIME_WAIT</span>
server1.close()

<span class="hljs-comment"># Without SO_REUSEADDR, this would fail for ~60 seconds</span>
<span class="hljs-comment"># With SO_REUSEADDR, it works immediately</span>
server2 = create_server(<span class="hljs-number">8080</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Server restarted on port 8080&quot;</span>)
</code></pre><p>This is standard practice for server applications - you don&#39;t want to wait a minute to restart your server after a crash.</p>
<p><strong>Important:</strong> <code>SO_REUSEADDR</code> does <strong>not</strong> let multiple processes bind and listen on the same port simultaneously on most systems. It only helps with rebinding after a close.</p>
<h2 id="h2-scenario-4-so_reuseport-true-port-sharing" class="group relative scroll-mt-24">
        <a href="#h2-scenario-4-so_reuseport-true-port-sharing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 4: SO_REUSEPORT (True Port Sharing)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-4-so_reuseport-true-port-sharing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Linux 3.9+ and modern BSD systems support <code>SO_REUSEPORT</code>, which allows multiple sockets to bind to the same port:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket
<span class="hljs-keyword">import</span> os

<span class="hljs-keyword">def</span> <span class="hljs-title function_">create_server_with_reuseport</span>(<span class="hljs-params">port</span>):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    <span class="hljs-comment"># Enable SO_REUSEPORT</span>
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, <span class="hljs-number">1</span>)

    sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, port))
    sock.listen(<span class="hljs-number">5</span>)
    <span class="hljs-keyword">return</span> sock

<span class="hljs-comment"># Process 1</span>
server1 = create_server_with_reuseport(<span class="hljs-number">8080</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Server 1 (PID <span class="hljs-subst">{os.getpid()}</span>) bound to port 8080&quot;</span>)

<span class="hljs-comment"># Process 2 (in a different process, but shown here for illustration)</span>
server2 = create_server_with_reuseport(<span class="hljs-number">8080</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Server 2 (PID <span class="hljs-subst">{os.getpid()}</span>) bound to port 8080&quot;</span>)

<span class="hljs-comment"># Both sockets are listening on port 8080</span>
<span class="hljs-comment"># Kernel distributes incoming connections between them</span>
</code></pre><p>When a client connects, the kernel uses a hash of the connection tuple to pick which socket receives it. This provides load balancing across multiple processes:</p>
<pre><code>Client 1 connects -&gt; Kernel routes to server1
Client 2 connects -&gt; Kernel routes to server2
Client 3 connects -&gt; Kernel routes to server1
...
</code></pre><p>This is how modern web servers like NGINX can run multiple worker processes all listening on port 80.</p>
<h3 id="h3-real-world-example-multi-process-server" class="group relative scroll-mt-24">
        <a href="#h3-real-world-example-multi-process-server" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Example: Multi-Process Server
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-real-world-example-multi-process-server"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> multiprocessing <span class="hljs-keyword">import</span> Process

<span class="hljs-keyword">def</span> <span class="hljs-title function_">worker</span>(<span class="hljs-params">worker_id</span>):
    <span class="hljs-string">&quot;&quot;&quot;Each worker process binds to the same port.&quot;&quot;&quot;</span>
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, <span class="hljs-number">1</span>)
    sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
    sock.listen(<span class="hljs-number">5</span>)

    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Worker <span class="hljs-subst">{worker_id}</span> (PID <span class="hljs-subst">{os.getpid()}</span>) listening on port 8080&quot;</span>)

    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
        client, addr = sock.accept()
        <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Worker <span class="hljs-subst">{worker_id}</span> handling <span class="hljs-subst">{addr}</span>&quot;</span>)

        <span class="hljs-comment"># Handle request</span>
        client.sendall(<span class="hljs-string">f&quot;Handled by worker <span class="hljs-subst">{worker_id}</span>\n&quot;</span>.encode())
        client.close()

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&#x27;__main__&#x27;</span>:
    <span class="hljs-comment"># Start 4 worker processes, all listening on port 8080</span>
    workers = []
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">4</span>):
        p = Process(target=worker, args=(i,))
        p.start()
        workers.append(p)

    <span class="hljs-comment"># Wait for workers</span>
    <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> workers:
        p.join()
</code></pre><p>When you connect to port 8080, different workers handle different connections, providing parallel processing.</p>
<h3 id="h3-limitations-of-so_reuseport" class="group relative scroll-mt-24">
        <a href="#h3-limitations-of-so_reuseport" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Limitations of SO_REUSEPORT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-limitations-of-so_reuseport"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ol>
<li><p><strong>Same user ID:</strong> Only processes with the same effective user ID can share a port (security measure)</p>
</li>
<li><p><strong>All or nothing:</strong> Either all sockets use <code>SO_REUSEPORT</code> or none do. You can&#39;t mix.</p>
</li>
<li><p><strong>Load balancing is simple:</strong> The kernel uses a hash function, not round-robin or connection count. Uneven distribution is possible.</p>
</li>
<li><p><strong>Platform support:</strong> Linux 3.9+, modern BSDs. Not available on Windows or older systems.</p>
</li>
</ol>
<h2 id="h2-scenario-5-different-ip-addresses" class="group relative scroll-mt-24">
        <a href="#h2-scenario-5-different-ip-addresses" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 5: Different IP Addresses
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-5-different-ip-addresses"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can bind different sockets to the same port if they use different IP addresses:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

<span class="hljs-comment"># Server with multiple network interfaces</span>
<span class="hljs-comment"># eth0: 192.168.1.10</span>
<span class="hljs-comment"># eth1: 10.0.0.5</span>

<span class="hljs-comment"># Bind to port 8080 on first interface</span>
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock1.bind((<span class="hljs-string">&#x27;192.168.1.10&#x27;</span>, <span class="hljs-number">8080</span>))
sock1.listen(<span class="hljs-number">5</span>)

<span class="hljs-comment"># Bind to port 8080 on second interface - this works!</span>
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock2.bind((<span class="hljs-string">&#x27;10.0.0.5&#x27;</span>, <span class="hljs-number">8080</span>))
sock2.listen(<span class="hljs-number">5</span>)

<span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Listening on 192.168.1.10:8080 and 10.0.0.5:8080&quot;</span>)
</code></pre><p>This works because the bind addresses are different:</p>
<ul>
<li><code>192.168.1.10:8080</code> vs <code>10.0.0.5:8080</code></li>
</ul>
<p>If you bind to <code>0.0.0.0:8080</code> (all interfaces), you cannot bind another socket to any specific IP on port 8080.</p>
<h2 id="h2-scenario-6-udp-port-sharing" class="group relative scroll-mt-24">
        <a href="#h2-scenario-6-udp-port-sharing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scenario 6: UDP Port Sharing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scenario-6-udp-port-sharing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>UDP works differently from TCP. With <code>SO_REUSEADDR</code>, multiple UDP sockets can bind to the same port:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> socket

<span class="hljs-comment"># First UDP socket</span>
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, <span class="hljs-number">1</span>)
sock1.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">9090</span>))

<span class="hljs-comment"># Second UDP socket on same port</span>
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, <span class="hljs-number">1</span>)
sock2.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">9090</span>))

<span class="hljs-comment"># Both receive the same packets (multicast-like behavior)</span>
</code></pre><p>Both sockets receive a copy of each incoming packet. This is useful for:</p>
<ul>
<li>Multiple processes monitoring the same data</li>
<li>Service discovery protocols</li>
<li>Multicast receivers</li>
</ul>
<h2 id="h2-checking-what39s-using-a-port" class="group relative scroll-mt-24">
        <a href="#h2-checking-what39s-using-a-port" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking What&#39;s Using a Port
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-what39s-using-a-port"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When debugging port conflicts, check what&#39;s bound:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Linux - show process using port 8080</span>
<span class="hljs-built_in">sudo</span> lsof -i :8080
<span class="hljs-comment"># or</span>
<span class="hljs-built_in">sudo</span> ss -tulpn | grep :8080

<span class="hljs-comment"># macOS</span>
<span class="hljs-built_in">sudo</span> lsof -i :8080

<span class="hljs-comment"># Windows</span>
netstat -ano | findstr :8080
</code></pre><p>You&#39;ll see output like:</p>
<pre><code>COMMAND   PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
python    1234  john   3u   IPv4   98765  0t0      TCP *:8080 (LISTEN)
python    1235  john   3u   IPv4   98766  0t0      TCP *:8080 (LISTEN)
</code></pre><p>If you see multiple processes with the same port, they&#39;re using <code>SO_REUSEPORT</code>.</p>
<h2 id="h2-common-mistakes" class="group relative scroll-mt-24">
        <a href="#h2-common-mistakes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Mistakes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-mistakes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-forgetting-so_reuseaddr-on-servers" class="group relative scroll-mt-24">
        <a href="#h3-forgetting-so_reuseaddr-on-servers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Forgetting SO_REUSEADDR on Servers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-forgetting-so_reuseaddr-on-servers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-python"><span class="hljs-comment"># Wrong - server won&#x27;t restart quickly after crash</span>
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))

<span class="hljs-comment"># Right - server can restart immediately</span>
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, <span class="hljs-number">1</span>)
sock.bind((<span class="hljs-string">&#x27;0.0.0.0&#x27;</span>, <span class="hljs-number">8080</span>))
</code></pre><h3 id="h3-using-so_reuseport-without-understanding-distribution" class="group relative scroll-mt-24">
        <a href="#h3-using-so_reuseport-without-understanding-distribution" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using SO_REUSEPORT Without Understanding Distribution
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-so_reuseport-without-understanding-distribution"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-python"><span class="hljs-comment"># This doesn&#x27;t give you control over which worker gets which connection</span>
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, <span class="hljs-number">1</span>)

<span class="hljs-comment"># If you need specific routing logic, use a single listening socket</span>
<span class="hljs-comment"># and distribute connections yourself</span>
</code></pre><h3 id="h3-assuming-port-sharing-works-everywhere" class="group relative scroll-mt-24">
        <a href="#h3-assuming-port-sharing-works-everywhere" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Assuming Port Sharing Works Everywhere
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-assuming-port-sharing-works-everywhere"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-python"><span class="hljs-comment"># This might fail on Windows or old Linux</span>
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, <span class="hljs-number">1</span>)

<span class="hljs-comment"># Check if SO_REUSEPORT is defined</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(socket, <span class="hljs-string">&#x27;SO_REUSEPORT&#x27;</span>):
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, <span class="hljs-number">1</span>)
<span class="hljs-keyword">else</span>:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;SO_REUSEPORT not supported on this platform&quot;</span>)
</code></pre><h2 id="h2-when-to-use-port-sharing" class="group relative scroll-mt-24">
        <a href="#h2-when-to-use-port-sharing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to Use Port Sharing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-to-use-port-sharing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Use <code>SO_REUSEADDR</code>:</strong></p>
<ul>
<li>Always, for server applications</li>
<li>Allows quick restart after crashes</li>
<li>Standard practice</li>
</ul>
<p><strong>Use <code>SO_REUSEPORT</code>:</strong></p>
<ul>
<li>Multi-process servers for parallel processing</li>
<li>Taking advantage of multiple CPU cores</li>
<li>When you want the kernel to load balance</li>
<li>Only when available on your platform</li>
</ul>
<p><strong>Use multiple IPs with same port:</strong></p>
<ul>
<li>When you want different services on different interfaces</li>
<li>Internal vs external access on same port</li>
<li>Segregating traffic by network</li>
</ul>
<p>Two sockets can share a port in multiple ways - through accepting multiple connections on a listening socket, using <code>SO_REUSEPORT</code> for multi-process load balancing, or binding to different IP addresses. Understanding these mechanisms helps you build robust, high-performance network applications.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Why Your CI/CD Pipeline Is Slower Than It Should Be (and How to Fix It)]]></title>
      <link>https://devops-daily.com/posts/why-your-ci-pipeline-is-slower</link>
      <description><![CDATA[Small pipeline changes give big wins. Parallelize jobs, cache dependencies, pin images, reuse build artifacts, and run only the tests you need.]]></description>
      <pubDate>Tue, 10 Jun 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/why-your-ci-pipeline-is-slower</guid>
      
      
      <category><![CDATA[ci]]></category><category><![CDATA[cicd]]></category><category><![CDATA[performance]]></category><category><![CDATA[pipeline]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most slow pipelines are a matter of configuration, not raw compute. Parallelize independent work, cache dependencies and images, reuse build artifacts, and run targeted tests. These five changes often shave minutes off every run.</p>
<h2 id="h2-why-this-matters" class="group relative scroll-mt-24">
        <a href="#h2-why-this-matters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why this matters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-matters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Slow pipelines cost time and momentum. Every extra minute waiting for feedback lowers developer velocity and increases the cost of iteration. The steps below are practical and platform agnostic. I include short examples for GitHub Actions and GitLab CI because they are easy to adapt.</p>
<h2 id="h2-1-too-many-serial-steps" class="group relative scroll-mt-24">
        <a href="#h2-1-too-many-serial-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1) Too many serial steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-1-too-many-serial-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Running unrelated tasks one after the other wastes wall clock time. Treat jobs as units of work and run jobs in parallel when they do not depend on each other.</p>
<h3 id="h3-github-actions-example" class="group relative scroll-mt-24">
        <a href="#h3-github-actions-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub Actions example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-actions-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: two independent jobs run at the same time, saving total time.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">lint:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">ci</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">lint</span>

  <span class="hljs-attr">test:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">ci</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">test</span>
</code></pre><p>Quick tip: if jobs share the same setup cost, consider extracting common setup into a reusable job or cache the results so the overhead is smaller.</p>
<h2 id="h2-2-pulling-quotlatestquot-base-images" class="group relative scroll-mt-24">
        <a href="#h2-2-pulling-quotlatestquot-base-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2) Pulling &quot;latest&quot; base images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-2-pulling-quotlatestquot-base-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Using floating tags like <code>latest</code> forces a fresh image pull and makes builds unpredictable.</p>
<p>Fix: pin a specific version and optionally pin by digest when you need absolute reproducibility.</p>
<h3 id="h3-dockerfile-example" class="group relative scroll-mt-24">
        <a href="#h3-dockerfile-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Dockerfile example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-dockerfile-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: pinning to a minor version gives stability while keeping security updates available.</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20</span>-alpine
<span class="hljs-comment"># ... rest of Dockerfile ...</span>
</code></pre><p>When you need byte-for-byte reproducibility, use an image digest:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># example only, replace with the digest your registry shows</span>
<span class="hljs-keyword">FROM</span> node:<span class="hljs-number">20</span>-alpine@sha256:<span class="hljs-number">0123456789</span>abcdef...
</code></pre><p>If your CI offers warm image caches, configure your runners to keep common base images between runs.</p>
<h2 id="h2-3-no-dependency-caching" class="group relative scroll-mt-24">
        <a href="#h2-3-no-dependency-caching" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3) No dependency caching
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-3-no-dependency-caching"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Downloading all dependencies every run is a big time sink. Use the CI cache feature and key it on the lockfile.</p>
<h3 id="h3-github-actions-npm-cache-example" class="group relative scroll-mt-24">
        <a href="#h3-github-actions-npm-cache-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub Actions npm cache example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-actions-npm-cache-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: this caches the npm cache directory and only restores when package-lock.json changes.</p>
<pre><code class="hljs language-yaml"><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Cache</span> <span class="hljs-string">node</span> <span class="hljs-string">modules</span>
  <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/cache@v4</span>
  <span class="hljs-attr">with:</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">~/.npm</span>
    <span class="hljs-attr">key:</span> <span class="hljs-string">${{</span> <span class="hljs-string">runner.os</span> <span class="hljs-string">}}-node-${{</span> <span class="hljs-string">hashFiles(&#x27;**/package-lock.json&#x27;)</span> <span class="hljs-string">}}</span>
    <span class="hljs-attr">restore-keys:</span> <span class="hljs-string">|
      ${{ runner.os }}-node-
</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span>
  <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">ci</span>
</code></pre><ul>
<li>For pnpm cache the store path is usually <code>~/.pnpm-store</code> or the path configured in your project.</li>
<li>For pip use <code>~/.cache/pip</code>. For Maven and Gradle cache the <code>.m2</code> or <code>.gradle</code> directories.</li>
<li>Use restore-keys to get partial cache hits when the exact key is not found.</li>
</ul>
<h2 id="h2-4-skipping-artifact-reuse" class="group relative scroll-mt-24">
        <a href="#h2-4-skipping-artifact-reuse" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4) Skipping artifact reuse
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-4-skipping-artifact-reuse"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Building once and throwing away the result is wasteful. Save build outputs and reuse them in downstream jobs.</p>
<h3 id="h3-gitlab-ci-example" class="group relative scroll-mt-24">
        <a href="#h3-gitlab-ci-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitLab CI example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-gitlab-ci-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: build job creates artifacts that are used by deploy without rebuilding.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">build:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">build</span>
  <span class="hljs-attr">script:</span> <span class="hljs-string">./build.sh</span>
  <span class="hljs-attr">artifacts:</span>
    <span class="hljs-attr">paths:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">dist/</span>

<span class="hljs-attr">deploy:</span>
  <span class="hljs-attr">stage:</span> <span class="hljs-string">deploy</span>
  <span class="hljs-attr">dependencies:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-string">build</span>
  <span class="hljs-attr">script:</span> <span class="hljs-string">./deploy.sh</span>
</code></pre><h3 id="h3-github-actions-artifact-example" class="group relative scroll-mt-24">
        <a href="#h3-github-actions-artifact-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          GitHub Actions artifact example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-github-actions-artifact-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: upload artifacts in the build job, then download them in deploy.</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># in build job</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/upload-artifact@v4</span>
  <span class="hljs-attr">with:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">app-dist</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">dist/</span>

<span class="hljs-comment"># in deploy job</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/download-artifact@v4</span>
  <span class="hljs-attr">with:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">app-dist</span>
    <span class="hljs-attr">path:</span> <span class="hljs-string">dist/</span>
</code></pre><p>If your platform supports container image layers caching, push a cached intermediate image to your registry so downstream jobs can pull a small delta.</p>
<h2 id="h2-5-running-every-test-every-time" class="group relative scroll-mt-24">
        <a href="#h2-5-running-every-test-every-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          5. Running every test, every time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-5-running-every-test-every-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Full test suites are expensive. Run fast checks on every commit and full suites only when needed.</p>
<h3 id="h3-selective-test-example-for-jest" class="group relative scroll-mt-24">
        <a href="#h3-selective-test-example-for-jest" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Selective test example for Jest
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-selective-test-example-for-jest"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: <code>--changedSince</code> runs only tests affected by recent changes.</p>
<pre><code class="hljs language-bash">npx jest --changedSince=origin/main
</code></pre><p>Alternative: use a simple change detection step in CI and set which suites to run. Example idea:</p>
<ul>
<li>If only <code>frontend/</code> files changed, run unit and browser tests.</li>
<li>If <code>backend/</code> files changed, run backend unit and integration tests.</li>
</ul>
<h3 id="h3-small-change-detection-snippet-bash" class="group relative scroll-mt-24">
        <a href="#h3-small-change-detection-snippet-bash" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Small change detection snippet (bash)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-small-change-detection-snippet-bash"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Explanation: sets a variable you can use to conditionally run jobs or steps.</p>
<pre><code class="hljs language-bash">CHANGED=$(git diff --name-only origin/main...HEAD)
<span class="hljs-keyword">if</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;<span class="hljs-variable">$CHANGED</span>&quot;</span> | grep -q <span class="hljs-string">&#x27;^frontend/&#x27;</span>; <span class="hljs-keyword">then</span>
  <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;run frontend tests&quot;</span>
<span class="hljs-keyword">fi</span>
</code></pre><h3 id="h3-extra-tips-that-save-time" class="group relative scroll-mt-24">
        <a href="#h3-extra-tips-that-save-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Extra tips that save time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-extra-tips-that-save-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Use a matrix for similar jobs instead of duplicating config.</li>
<li>Prefer <code>npm ci</code> over <code>npm install</code> on CI for reproducible installs and speed.</li>
<li>Keep CI images small and only install required tools.</li>
<li>Run heavy integration tests on a schedule or after merge to main, not on every push.</li>
<li>If you use shared runners, tune concurrency or add self-hosted runners for heavy workloads.</li>
</ul>
<h3 id="h3-short-checklist-to-apply" class="group relative scroll-mt-24">
        <a href="#h3-short-checklist-to-apply" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Short checklist to apply
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-short-checklist-to-apply"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li>Parallelize independent jobs.</li>
<li>Pin base images and use image caches.</li>
<li>Cache dependency directories with a key based on the lockfile.</li>
<li>Save and reuse build artifacts across jobs.</li>
<li>Run targeted tests when possible, full suites on protected branches or merges.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most pipeline speed problems are fixable with configuration and small investments. Start with parallel jobs and caching. Then add artifact reuse and selective testing. You will see faster feedback and higher team throughput.</p>
<p>Thanks for reading. Ship faster.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[What do PTY and TTY Mean?]]></title>
      <link>https://devops-daily.com/posts/what-do-pty-and-tty-mean</link>
      <description><![CDATA[TTY and PTY are interfaces for text input and output in Unix systems. Learn the difference between physical terminals (TTY), pseudo-terminals (PTY), and how they enable SSH sessions, terminal emulators, and command-line tools.]]></description>
      <pubDate>Thu, 05 Jun 2025 15:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/what-do-pty-and-tty-mean</guid>
      <category><![CDATA[Linux]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Linux]]></category><category><![CDATA[Terminal]]></category><category><![CDATA[Unix]]></category><category><![CDATA[SSH]]></category><category><![CDATA[System Administration]]></category>
      <content:encoded><![CDATA[<p>When working with Linux or Unix systems, you&#39;ll encounter terms like TTY and PTY in various contexts - from SSH sessions to Docker containers to terminal multiplexers like screen and tmux. These cryptic three-letter acronyms represent fundamental concepts in how Unix systems handle interactive input and output.</p>
<p>Understanding TTY and PTY helps you troubleshoot terminal issues, work effectively with remote sessions, and understand how command-line programs interact with your system.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>TTY (TeleTYpewriter) is a terminal device - originally physical hardware, now mostly software. PTY (Pseudo-TTY) is a virtual terminal created by software like SSH, terminal emulators, or tmux. When you open Terminal.app or PuTTY, you&#39;re using a PTY. When a program checks if it&#39;s running interactively (to show colors or progress bars), it&#39;s checking if it&#39;s connected to a TTY/PTY.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Basic familiarity with the Linux command line will help you understand the examples. No advanced knowledge is required.</p>
<h2 id="h2-the-history-physical-teletypewriters" class="group relative scroll-mt-24">
        <a href="#h2-the-history-physical-teletypewriters" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The History: Physical Teletypewriters
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-history-physical-teletypewriters"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>TTY stands for &quot;TeleTYpewriter&quot; - actual physical typewriter-like devices used to interact with computers in the 1960s and 1970s.</p>
<pre><code>User types on keyboard → Sends to computer
Computer processes command → Sends output back
Output prints on paper
</code></pre><p>These were mechanical terminals with keyboards and printers (no screens). When you typed a command, you&#39;d see it printed on paper, followed by the output. The Unix design for terminal I/O still reflects this history.</p>
<h2 id="h2-modern-ttys-virtual-terminals" class="group relative scroll-mt-24">
        <a href="#h2-modern-ttys-virtual-terminals" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Modern TTYs: Virtual Terminals
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-modern-ttys-virtual-terminals"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Modern Linux systems have virtual terminals (consoles) accessible with <code>Ctrl+Alt+F1</code> through <code>Ctrl+Alt+F7</code>:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See your current TTY</span>
<span class="hljs-built_in">tty</span>
</code></pre><p>Output on a virtual console:</p>
<pre><code>/dev/tty1
</code></pre><p>Output in a terminal emulator:</p>
<pre><code>/dev/pts/0
</code></pre><p>The difference:</p>
<ul>
<li><code>/dev/tty1</code>, <code>/dev/tty2</code>, etc.: Virtual consoles (direct kernel-provided terminals)</li>
<li><code>/dev/pts/0</code>, <code>/dev/pts/1</code>, etc.: Pseudo-terminals (PTYs)</li>
</ul>
<h2 id="h2-what-is-a-pty" class="group relative scroll-mt-24">
        <a href="#h2-what-is-a-pty" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What is a PTY?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-is-a-pty"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A PTY (pseudo-terminal) is a software emulation of a terminal. It consists of two parts:</p>
<p><strong>Master side (PTM)</strong>: The controlling program (like your terminal emulator or SSH server)</p>
<p><strong>Slave side (PTS)</strong>: What programs see as their terminal</p>
<pre><code>Terminal Emulator (Master)
           ↕
     PTY Interface
           ↕
    Shell (Slave)
</code></pre><p>When you type in your terminal emulator:</p>
<ol>
<li>You type <code>ls</code> and press Enter</li>
<li>Terminal emulator receives the key presses</li>
<li>Sends characters to the PTY master</li>
<li>PTY slave delivers them to the shell</li>
<li>Shell executes <code>ls</code></li>
<li>Output goes to PTY slave</li>
<li>PTY master receives it</li>
<li>Terminal emulator displays it on screen</li>
</ol>
<h2 id="h2-seeing-your-ptys" class="group relative scroll-mt-24">
        <a href="#h2-seeing-your-ptys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Seeing Your PTYs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-seeing-your-ptys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>List all pseudo-terminals in use:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See all pseudo-terminals</span>
<span class="hljs-built_in">ls</span> -l /dev/pts/
</code></pre><p>Output:</p>
<pre><code>total 0
crw--w---- 1 user tty  136, 0 Nov 17 10:23 0
crw--w---- 1 user tty  136, 1 Nov 17 10:24 1
crw--w---- 1 user tty  136, 2 Nov 17 10:25 2
</code></pre><p>Each number represents an open terminal session.</p>
<p>Check which PTY you&#39;re currently using:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">tty</span>
</code></pre><p>Output:</p>
<pre><code>/dev/pts/0
</code></pre><p>See all logged-in users and their terminals:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">who</span>
</code></pre><p>Output:</p>
<pre><code>user     pts/0   2025-06-05 10:23 (192.168.1.100)
user     pts/1   2025-06-05 10:24 (192.168.1.100)
admin    tty1    2025-06-05 09:00
</code></pre><h2 id="h2-tty-in-ssh-sessions" class="group relative scroll-mt-24">
        <a href="#h2-tty-in-ssh-sessions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TTY in SSH Sessions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tty-in-ssh-sessions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you SSH into a server, SSH creates a PTY for your session:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># SSH connection</span>
ssh user@server

<span class="hljs-comment"># Check your TTY</span>
<span class="hljs-built_in">tty</span>
</code></pre><p>Output:</p>
<pre><code>/dev/pts/3
</code></pre><p>The SSH server (sshd) acts as the PTY master, and your shell runs connected to the PTY slave. This allows interactive programs like <code>vim</code>, <code>top</code>, and <code>less</code> to work over SSH just like they do locally.</p>
<h3 id="h3-disabling-pty-allocation" class="group relative scroll-mt-24">
        <a href="#h3-disabling-pty-allocation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Disabling PTY Allocation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-disabling-pty-allocation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Some commands don&#39;t need a TTY:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># No PTY allocated (non-interactive)</span>
ssh user@server <span class="hljs-string">&#x27;ls -l&#x27;</span>

<span class="hljs-comment"># Force PTY allocation (interactive)</span>
ssh -t user@server <span class="hljs-string">&#x27;ls -l&#x27;</span>
</code></pre><p>The <code>-t</code> flag forces PTY allocation even for commands that don&#39;t require it.</p>
<h2 id="h2-why-programs-care-about-ttys" class="group relative scroll-mt-24">
        <a href="#h2-why-programs-care-about-ttys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Programs Care About TTYs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-programs-care-about-ttys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Programs behave differently when connected to a TTY versus when their output is redirected to a file or pipe.</p>
<h3 id="h3-example-ls-with-colors" class="group relative scroll-mt-24">
        <a href="#h3-example-ls-with-colors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: ls with colors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-ls-with-colors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># When connected to a TTY (colors enabled)</span>
<span class="hljs-built_in">ls</span>

<span class="hljs-comment"># When piped (colors disabled)</span>
<span class="hljs-built_in">ls</span> | <span class="hljs-built_in">cat</span>
</code></pre><p>The <code>ls</code> command checks if its output is a TTY. If yes, it uses colors. If no (output is piped), it outputs plain text.</p>
<h3 id="h3-checking-if-output-is-a-tty" class="group relative scroll-mt-24">
        <a href="#h3-checking-if-output-is-a-tty" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking if Output is a TTY
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-checking-if-output-is-a-tty"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Programs use the <code>isatty()</code> function:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> sys

<span class="hljs-keyword">if</span> sys.stdout.isatty():
    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Running interactively in a terminal&quot;</span>)
<span class="hljs-keyword">else</span>:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Output is redirected (pipe or file)&quot;</span>)
</code></pre><p>Run it directly:</p>
<pre><code class="hljs language-bash">python check_tty.py
</code></pre><p>Output:</p>
<pre><code>Running interactively in a terminal
</code></pre><p>Pipe the output:</p>
<pre><code class="hljs language-bash">python check_tty.py | <span class="hljs-built_in">cat</span>
</code></pre><p>Output:</p>
<pre><code>Output is redirected (pipe or file)
</code></pre><h3 id="h3-practical-example-git-output" class="group relative scroll-mt-24">
        <a href="#h3-practical-example-git-output" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Example: Git Output
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-practical-example-git-output"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Git shows colored output when connected to a TTY:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Colored output</span>
git <span class="hljs-built_in">log</span>

<span class="hljs-comment"># No colors when piped</span>
git <span class="hljs-built_in">log</span> | less
</code></pre><p>You can force colors even when not connected to a TTY:</p>
<pre><code class="hljs language-bash">git -c color.ui=always <span class="hljs-built_in">log</span> | less
</code></pre><h2 id="h2-docker-and-ttys" class="group relative scroll-mt-24">
        <a href="#h2-docker-and-ttys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Docker and TTYs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-docker-and-ttys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Docker containers can run with or without a TTY:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run without TTY (non-interactive)</span>
docker run ubuntu <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Hello&quot;</span>

<span class="hljs-comment"># Run with TTY and interactive mode</span>
docker run -it ubuntu bash
</code></pre><p>The flags:</p>
<ul>
<li><code>-i</code>: Keep STDIN open (interactive)</li>
<li><code>-t</code>: Allocate a pseudo-TTY</li>
</ul>
<p>Together <code>-it</code> gives you an interactive shell session.</p>
<p>Without <code>-t</code>, you can&#39;t run interactive programs:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># This fails without -t</span>
docker run -i ubuntu vim

<span class="hljs-comment"># This works</span>
docker run -it ubuntu vim
</code></pre><h3 id="h3-checking-tty-in-docker" class="group relative scroll-mt-24">
        <a href="#h3-checking-tty-in-docker" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking TTY in Docker
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-checking-tty-in-docker"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Inside a container:</p>
<pre><code class="hljs language-bash">docker run -it ubuntu bash
<span class="hljs-built_in">tty</span>
</code></pre><p>Output:</p>
<pre><code>/dev/pts/0
</code></pre><p>Without <code>-t</code>:</p>
<pre><code class="hljs language-bash">docker run -i ubuntu <span class="hljs-built_in">tty</span>
</code></pre><p>Output:</p>
<pre><code>not a tty
</code></pre><h2 id="h2-terminal-multiplexers-tmux-and-screen" class="group relative scroll-mt-24">
        <a href="#h2-terminal-multiplexers-tmux-and-screen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terminal Multiplexers: tmux and screen
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-terminal-multiplexers-tmux-and-screen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>tmux and screen create PTYs that persist even when you disconnect:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Start tmux</span>
tmux

<span class="hljs-comment"># Check your TTY</span>
<span class="hljs-built_in">tty</span>
</code></pre><p>Output:</p>
<pre><code>/dev/pts/5
</code></pre><p>Inside tmux, you&#39;re connected to a PTY created by tmux. When you detach from tmux (<code>Ctrl+b d</code>), the PTY and all programs running in it continue running.</p>
<p>This is why tmux/screen are useful for long-running tasks over SSH:</p>
<pre><code>SSH → tmux (PTY master) → shell (PTY slave)
</code></pre><p>If SSH disconnects, tmux keeps running. Reconnect and reattach to the same session.</p>
<h2 id="h2-common-tty-related-commands" class="group relative scroll-mt-24">
        <a href="#h2-common-tty-related-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common TTY-Related Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-tty-related-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-ps-command" class="group relative scroll-mt-24">
        <a href="#h3-ps-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ps Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ps-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>See which TTY a process is using:</p>
<pre><code class="hljs language-bash">ps aux
</code></pre><p>Output:</p>
<pre><code>USER       PID  TTY      STAT START   TIME COMMAND
user      1234  pts/0    Ss   10:23   0:00 -bash
user      5678  pts/1    Ss+  10:24   0:00 vim file.txt
user      9012  ?        Ss   09:00   0:01 sshd
</code></pre><p>The TTY column shows:</p>
<ul>
<li><code>pts/0</code>, <code>pts/1</code>: Pseudo-terminals</li>
<li><code>tty1</code>, <code>tty2</code>: Virtual consoles</li>
<li><code>?</code>: No controlling terminal (daemon processes)</li>
</ul>
<h3 id="h3-stty-command" class="group relative scroll-mt-24">
        <a href="#h3-stty-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          stty Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-stty-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Control terminal settings:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Show all terminal settings</span>
<span class="hljs-built_in">stty</span> -a

<span class="hljs-comment"># Disable echo (useful for password input)</span>
<span class="hljs-built_in">stty</span> -<span class="hljs-built_in">echo</span>

<span class="hljs-comment"># Re-enable echo</span>
<span class="hljs-built_in">stty</span> <span class="hljs-built_in">echo</span>

<span class="hljs-comment"># Set terminal size</span>
<span class="hljs-built_in">stty</span> rows 50 cols 120
</code></pre><h3 id="h3-ctrlc-and-tty" class="group relative scroll-mt-24">
        <a href="#h3-ctrlc-and-tty" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Ctrl+C and TTY
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ctrlc-and-tty"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you press <code>Ctrl+C</code>, the TTY driver sends a <code>SIGINT</code> signal to the foreground process group. This is handled by the terminal, not by the program:</p>
<pre><code>User presses Ctrl+C
         ↓
    TTY driver
         ↓
   Sends SIGINT
         ↓
   Program exits
</code></pre><p>Without a TTY, <code>Ctrl+C</code> doesn&#39;t work the same way.</p>
<h2 id="h2-devtty-the-controlling-terminal" class="group relative scroll-mt-24">
        <a href="#h2-devtty-the-controlling-terminal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          /dev/tty: The Controlling Terminal
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-devtty-the-controlling-terminal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>/dev/tty</code> is a special device that always refers to the controlling terminal of the current process:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Send output to your terminal, bypassing pipes</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;This goes to terminal&quot;</span> &gt; /dev/tty
</code></pre><p>Even if the script&#39;s stdout is redirected, output to <code>/dev/tty</code> appears on your terminal.</p>
<p>Reading from <code>/dev/tty</code> for password prompts:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-built_in">echo</span> -n <span class="hljs-string">&quot;Password: &quot;</span> &gt; /dev/tty
<span class="hljs-built_in">stty</span> -<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">read</span> password &lt; /dev/tty
<span class="hljs-built_in">stty</span> <span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Password received&quot;</span>
</code></pre><p>This ensures the password prompt appears on the terminal and reads from it, regardless of I/O redirection.</p>
<h2 id="h2-troubleshooting-tty-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-tty-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting TTY Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-tty-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-quotnot-a-ttyquot-errors" class="group relative scroll-mt-24">
        <a href="#h3-quotnot-a-ttyquot-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          &quot;Not a TTY&quot; Errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-quotnot-a-ttyquot-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Some programs require a TTY:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Fails</span>
ssh user@server <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">command</span>
</code></pre><p>Error:</p>
<pre><code>sudo: sorry, you must have a tty to run sudo
</code></pre><p>Solution: Force TTY allocation:</p>
<pre><code class="hljs language-bash">ssh -t user@server <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">command</span>
</code></pre><h3 id="h3-docker-quotinput-device-is-not-a-ttyquot" class="group relative scroll-mt-24">
        <a href="#h3-docker-quotinput-device-is-not-a-ttyquot" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Docker &quot;input device is not a TTY&quot;
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-docker-quotinput-device-is-not-a-ttyquot"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Error when running Docker without proper flags:</p>
<pre><code class="hljs language-bash">docker run ubuntu bash
</code></pre><p>Solution: Add <code>-it</code>:</p>
<pre><code class="hljs language-bash">docker run -it ubuntu bash
</code></pre><h3 id="h3-terminal-size-problems" class="group relative scroll-mt-24">
        <a href="#h3-terminal-size-problems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Terminal Size Problems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-terminal-size-problems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your terminal displays incorrectly after resizing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Reset terminal</span>
reset

<span class="hljs-comment"># Or update terminal size</span>
<span class="hljs-built_in">stty</span> rows $(tput lines) cols $(tput cols)
</code></pre><h3 id="h3-detached-terminal-sessions" class="group relative scroll-mt-24">
        <a href="#h3-detached-terminal-sessions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Detached Terminal Sessions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-detached-terminal-sessions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If a process loses its controlling terminal:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Find processes without a TTY</span>
ps aux | grep <span class="hljs-string">&#x27;?&#x27;</span>
</code></pre><p>These are usually daemons or background processes, which is normal. If an interactive program shows <code>?</code>, it might have lost its terminal connection.</p>
<h2 id="h2-pty-in-programming" class="group relative scroll-mt-24">
        <a href="#h2-pty-in-programming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          PTY in Programming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-pty-in-programming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Creating a PTY pair in Python:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> pty
<span class="hljs-keyword">import</span> os

<span class="hljs-comment"># Create a PTY pair</span>
master, slave = pty.openpty()

<span class="hljs-comment"># Slave side looks like a regular terminal</span>
slave_name = os.ttyname(slave)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Slave PTY: <span class="hljs-subst">{slave_name}</span>&quot;</span>)

<span class="hljs-comment"># You can now use master and slave file descriptors</span>
<span class="hljs-comment"># Master for controlling program</span>
<span class="hljs-comment"># Slave for programs that need a terminal</span>
</code></pre><p>This is how terminal emulators, SSH servers, and tools like <code>script</code> work under the hood.</p>
<p>TTY and PTY are fundamental to how Unix systems handle interactive input and output. TTYs originated as physical terminals but now exist as virtual consoles and pseudo-terminals. PTYs enable modern tools like SSH, Docker, and tmux to provide interactive terminal sessions. Understanding these concepts helps you work more effectively with command-line tools and troubleshoot terminal-related issues.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Command to Delete All Pods in All Kubernetes Namespaces]]></title>
      <link>https://devops-daily.com/posts/delete-all-pods-in-all-namespaces</link>
      <description><![CDATA[Learn how to delete all Pods across all namespaces in Kubernetes using a single command. Understand the implications and best practices for this operation.]]></description>
      <pubDate>Sun, 01 Jun 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/delete-all-pods-in-all-namespaces</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Pods]]></category><category><![CDATA[Namespaces]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-introduction" class="group relative scroll-mt-24">
        <a href="#h2-introduction" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Introduction
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-introduction"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Sometimes, you may need to delete all Pods across all namespaces in your Kubernetes cluster. This operation can be useful for troubleshooting, resetting the cluster state, or cleaning up resources. However, it should be performed with caution, as it can disrupt running applications.</p>
<p>In this guide, you&#39;ll learn the command to delete all Pods in all namespaces, along with explanations and best practices.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before running the command, ensure the following:</p>
<ul>
<li>You have <code>kubectl</code> installed and configured to access your Kubernetes cluster.</li>
<li>You have sufficient permissions to delete resources across all namespaces.</li>
<li>You understand the impact of deleting Pods, as it will terminate running workloads.</li>
</ul>
<h2 id="h2-the-command" class="group relative scroll-mt-24">
        <a href="#h2-the-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To delete all Pods in all namespaces, use the following command:</p>
<pre><code class="hljs language-bash">kubectl delete pods --all --all-namespaces
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>kubectl delete pods</code>: Specifies that you want to delete Pods.</li>
<li><code>--all</code>: Deletes all Pods in the specified namespace.</li>
<li><code>--all-namespaces</code>: Extends the scope to all namespaces in the cluster.</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Backup Critical Data</strong>: Ensure that any critical data or state is backed up before deleting Pods.</li>
<li><strong>Understand Pod Behavior</strong>: Pods managed by Deployments or StatefulSets will be recreated automatically. Standalone Pods will not.</li>
<li><strong>Use with Caution</strong>: Avoid running this command in production environments unless absolutely necessary.</li>
</ul>
<h2 id="h2-example-scenario" class="group relative scroll-mt-24">
        <a href="#h2-example-scenario" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example Scenario
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-example-scenario"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Imagine you are troubleshooting a cluster-wide issue and suspect that some Pods are stuck in a bad state. Deleting all Pods can help reset the cluster and allow controllers to recreate healthy Pods.</p>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>kubectl delete pods --all --all-namespaces</code> command is a powerful tool for managing Kubernetes clusters. Use it wisely and always consider the impact on your applications and workloads. By following best practices, you can ensure a smooth and controlled operation.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Terraform Conditionals: Handling Non-Existent Variables]]></title>
      <link>https://devops-daily.com/posts/terraform-conditionals-if-variable-does-not-exist</link>
      <description><![CDATA[Learn how to use Terraform conditionals to handle cases where a variable does not exist or is not defined.]]></description>
      <pubDate>Sun, 01 Jun 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/terraform-conditionals-if-variable-does-not-exist</guid>
      <category><![CDATA[Terraform]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Terraform]]></category><category><![CDATA[Variables]]></category><category><![CDATA[Conditionals]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To handle non-existent variables in Terraform, use the <code>lookup</code> function or the ternary conditional operator. These techniques allow you to provide default values or handle undefined variables gracefully.</p>
<hr>
<p>Terraform configurations often rely on variables to define dynamic values. However, there are cases where a variable might not be defined. This guide will show you how to handle such scenarios using Terraform conditionals.</p>
<h3 id="h3-why-handle-non-existent-variables" class="group relative scroll-mt-24">
        <a href="#h3-why-handle-non-existent-variables" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Handle Non-Existent Variables?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-why-handle-non-existent-variables"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Flexibility</strong>: Allow configurations to work even when some variables are not defined.</li>
<li><strong>Default Values</strong>: Provide sensible defaults for optional variables.</li>
<li><strong>Error Prevention</strong>: Avoid runtime errors caused by missing variables.</li>
</ul>
<h3 id="h3-using-the-lookup-function" class="group relative scroll-mt-24">
        <a href="#h3-using-the-lookup-function" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using the lookup Function
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-the-lookup-function"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The <code>lookup</code> function retrieves a value from a map and allows you to specify a default value if the key does not exist.</p>
<h4 id="h4-example-using-lookup" class="group relative scroll-mt-24">
        <a href="#h4-example-using-lookup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Using lookup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-example-using-lookup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-hcl"><span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;config&quot;</span> {
  type = map(string)
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;example&quot;</span> {
  value = lookup(var.config, <span class="hljs-string">&quot;key&quot;</span>, <span class="hljs-string">&quot;default-value&quot;</span>)
}
</code></pre><p>In this example, if <code>var.config</code> does not contain the key <code>key</code>, the output will use <code>default-value</code>.</p>
<h3 id="h3-using-the-ternary-conditional-operator" class="group relative scroll-mt-24">
        <a href="#h3-using-the-ternary-conditional-operator" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using the Ternary Conditional Operator
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-the-ternary-conditional-operator"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The ternary operator allows you to check if a variable is defined and provide a fallback value.</p>
<h4 id="h4-example-using-the-ternary-operator" class="group relative scroll-mt-24">
        <a href="#h4-example-using-the-ternary-operator" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Using the Ternary Operator
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h4-example-using-the-ternary-operator"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h4><pre><code class="hljs language-hcl"><span class="hljs-keyword">variable</span> <span class="hljs-string">&quot;optional_var&quot;</span> {
  default = null
}

<span class="hljs-keyword">output</span> <span class="hljs-string">&quot;example&quot;</span> {
  value = var.optional_var != null ? var.optional_var : <span class="hljs-string">&quot;default-value&quot;</span>
}
</code></pre><p>In this example, if <code>var.optional_var</code> is not defined, the output will use <code>default-value</code>.</p>
<h3 id="h3-best-practices" class="group relative scroll-mt-24">
        <a href="#h3-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><strong>Use Defaults</strong>: Define default values for variables whenever possible.</li>
<li><strong>Validate Inputs</strong>: Use <code>validation</code> blocks to enforce constraints on variable values.</li>
<li><strong>Document Variables</strong>: Clearly document which variables are optional and their default values.</li>
</ul>
<p>By using these techniques, you can handle non-existent variables in Terraform gracefully, making your configurations more robust and flexible.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Clone a Git Repository into a Specific Folder]]></title>
      <link>https://devops-daily.com/posts/clone-git-repo-specific-folder</link>
      <description><![CDATA[Want to clone a repository into a custom directory name? Learn how to specify the target folder when cloning Git repositories.]]></description>
      <pubDate>Fri, 30 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/clone-git-repo-specific-folder</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Clone]]></category><category><![CDATA[Directory]]></category><category><![CDATA[Workflow]]></category><category><![CDATA[Setup]]></category>
      <content:encoded><![CDATA[<p>When you clone a repository, Git creates a folder based on the repository name. Sometimes you want a different folder name or need to clone into a specific location. Git lets you specify the target directory when cloning.</p>
<p><strong>TLDR:</strong> To clone into a specific folder, add the folder name after the repository URL: <code>git clone repository-url folder-name</code>. To clone into the current directory, use <code>git clone repository-url .</code> (dot). The folder is created if it does not exist.</p>
<p>In this guide, you&#39;ll learn how to control where Git clones repositories.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You&#39;ll need Git installed on your system and a repository URL to clone. Basic familiarity with the command line and Git clone command will be helpful.</p>
<h2 id="h2-basic-clone-with-custom-folder" class="group relative scroll-mt-24">
        <a href="#h2-basic-clone-with-custom-folder" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Clone with Custom Folder
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-basic-clone-with-custom-folder"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To clone into a specific folder:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone into custom folder</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git my-project

<span class="hljs-comment"># Creates folder named &#x27;my-project&#x27; instead of &#x27;repository&#x27;</span>
<span class="hljs-built_in">cd</span> my-project
</code></pre><p>The folder name you specify does not need to match the repository name.</p>
<h2 id="h2-cloning-into-current-directory" class="group relative scroll-mt-24">
        <a href="#h2-cloning-into-current-directory" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning into Current Directory
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-into-current-directory"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To clone into the current directory (it must be empty):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create and enter directory</span>
<span class="hljs-built_in">mkdir</span> my-project
<span class="hljs-built_in">cd</span> my-project

<span class="hljs-comment"># Clone into current directory</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git .

<span class="hljs-comment"># The dot means &quot;current directory&quot;</span>
</code></pre><p>This is useful when you already created the folder and want to clone into it.</p>
<h2 id="h2-cloning-with-full-path" class="group relative scroll-mt-24">
        <a href="#h2-cloning-with-full-path" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning with Full Path
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-with-full-path"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can specify a complete path:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone to absolute path</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git /home/user/projects/my-app

<span class="hljs-comment"># Or relative path</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git ../other-project

<span class="hljs-comment"># Or with spaces (use quotes)</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git <span class="hljs-string">&quot;My Project Folder&quot;</span>
</code></pre><h2 id="h2-cloning-into-nested-directories" class="group relative scroll-mt-24">
        <a href="#h2-cloning-into-nested-directories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning into Nested Directories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-into-nested-directories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Git creates parent directories if they do not exist:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Creates both &#x27;projects&#x27; and &#x27;frontend&#x27; folders</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git projects/frontend

<span class="hljs-built_in">cd</span> projects/frontend
</code></pre><p>All parent directories are created automatically.</p>
<h2 id="h2-cloning-multiple-branches-into-separate-folders" class="group relative scroll-mt-24">
        <a href="#h2-cloning-multiple-branches-into-separate-folders" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Multiple Branches into Separate Folders
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-multiple-branches-into-separate-folders"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To have different branches in different folders:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone main branch</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git repo-main

<span class="hljs-comment"># Clone to another folder for develop branch</span>
git <span class="hljs-built_in">clone</span> -b develop https://github.com/username/repo.git repo-develop

<span class="hljs-comment"># Clone for feature branch</span>
git <span class="hljs-built_in">clone</span> -b feature-x https://github.com/username/repo.git repo-feature-x
</code></pre><p>Now you can work on multiple branches simultaneously.</p>
<h2 id="h2-cloning-with-project-structure" class="group relative scroll-mt-24">
        <a href="#h2-cloning-with-project-structure" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning with Project Structure
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-with-project-structure"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For organizing multiple related repositories:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create project structure</span>
<span class="hljs-built_in">mkdir</span> -p myproject/{frontend,backend,mobile}

<span class="hljs-comment"># Clone into structure</span>
git <span class="hljs-built_in">clone</span> https://github.com/company/frontend.git myproject/frontend
git <span class="hljs-built_in">clone</span> https://github.com/company/backend.git myproject/backend
git <span class="hljs-built_in">clone</span> https://github.com/company/mobile.git myproject/mobile

<span class="hljs-comment"># Result:</span>
<span class="hljs-comment"># myproject/</span>
<span class="hljs-comment">#   frontend/</span>
<span class="hljs-comment">#   backend/</span>
<span class="hljs-comment">#   mobile/</span>
</code></pre><h2 id="h2-handling-existing-folders" class="group relative scroll-mt-24">
        <a href="#h2-handling-existing-folders" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Handling Existing Folders
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-handling-existing-folders"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If the folder already exists and is not empty:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Try to clone</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git existing-folder

<span class="hljs-comment"># Error: destination path &#x27;existing-folder&#x27; already exists and is not an empty directory</span>

<span class="hljs-comment"># Solutions:</span>
<span class="hljs-comment"># 1. Use different name</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git existing-folder-new

<span class="hljs-comment"># 2. Delete folder first</span>
<span class="hljs-built_in">rm</span> -rf existing-folder
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git existing-folder

<span class="hljs-comment"># 3. Clone into it if empty</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git existing-folder/.
</code></pre><h2 id="h2-cloning-with-ssh-vs-https" class="group relative scroll-mt-24">
        <a href="#h2-cloning-with-ssh-vs-https" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning with SSH vs HTTPS
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-with-ssh-vs-https"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The folder name syntax works with any protocol:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># HTTPS</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git my-folder

<span class="hljs-comment"># SSH</span>
git <span class="hljs-built_in">clone</span> git@github.com:username/repo.git my-folder

<span class="hljs-comment"># Git protocol</span>
git <span class="hljs-built_in">clone</span> git://github.com/username/repo.git my-folder

<span class="hljs-comment"># Local path</span>
git <span class="hljs-built_in">clone</span> /path/to/repo.git my-folder
</code></pre><h2 id="h2-cloning-bare-repositories" class="group relative scroll-mt-24">
        <a href="#h2-cloning-bare-repositories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Bare Repositories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-bare-repositories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To clone as a bare repository (no working directory):</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone bare repository</span>
git <span class="hljs-built_in">clone</span> --bare https://github.com/username/repo.git repo.git

<span class="hljs-comment"># Typically named with .git extension</span>
</code></pre><p>Bare repositories are used for central repos or mirrors.</p>
<h2 id="h2-cloning-into-subdirectory-of-existing-repo" class="group relative scroll-mt-24">
        <a href="#h2-cloning-into-subdirectory-of-existing-repo" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning into Subdirectory of Existing Repo
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-into-subdirectory-of-existing-repo"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You cannot clone into a subdirectory of another Git repository:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># This fails</span>
<span class="hljs-built_in">cd</span> existing-repo
git <span class="hljs-built_in">clone</span> https://github.com/username/other-repo.git subdir

<span class="hljs-comment"># Error: refusing to create alternate object database</span>

<span class="hljs-comment"># Solution: Use submodules</span>
git submodule add https://github.com/username/other-repo.git subdir
</code></pre><h2 id="h2-scripting-multiple-clones" class="group relative scroll-mt-24">
        <a href="#h2-scripting-multiple-clones" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Scripting Multiple Clones
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-scripting-multiple-clones"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Automate cloning multiple repositories:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># clone-all.sh</span>

repos=(
    <span class="hljs-string">&quot;https://github.com/company/frontend:frontend&quot;</span>
    <span class="hljs-string">&quot;https://github.com/company/backend:backend&quot;</span>
    <span class="hljs-string">&quot;https://github.com/company/api:api&quot;</span>
)

<span class="hljs-keyword">for</span> repo <span class="hljs-keyword">in</span> <span class="hljs-string">&quot;<span class="hljs-variable">${repos[@]}</span>&quot;</span>; <span class="hljs-keyword">do</span>
    url=<span class="hljs-string">&quot;<span class="hljs-variable">${repo%:*}</span>&quot;</span>
    folder=<span class="hljs-string">&quot;<span class="hljs-variable">${repo#*:}</span>&quot;</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Cloning <span class="hljs-variable">$url</span> into <span class="hljs-variable">$folder</span>&quot;</span>
    git <span class="hljs-built_in">clone</span> <span class="hljs-string">&quot;<span class="hljs-variable">$url</span>&quot;</span> <span class="hljs-string">&quot;<span class="hljs-variable">$folder</span>&quot;</span>
<span class="hljs-keyword">done</span>
</code></pre><h2 id="h2-cloning-with-custom-configuration" class="group relative scroll-mt-24">
        <a href="#h2-cloning-with-custom-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning with Custom Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-with-custom-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Set configuration while cloning:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone with custom origin name</span>
git <span class="hljs-built_in">clone</span> -o upstream https://github.com/username/repo.git my-folder

<span class="hljs-comment"># Verify</span>
<span class="hljs-built_in">cd</span> my-folder
git remote -v
<span class="hljs-comment"># upstream  https://github.com/username/repo.git (fetch)</span>
</code></pre><h2 id="h2-cloning-specific-branch-to-folder" class="group relative scroll-mt-24">
        <a href="#h2-cloning-specific-branch-to-folder" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Specific Branch to Folder
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-specific-branch-to-folder"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Clone a specific branch into custom folder:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone specific branch</span>
git <span class="hljs-built_in">clone</span> -b develop --single-branch https://github.com/username/repo.git develop-folder

<span class="hljs-built_in">cd</span> develop-folder
git branch
<span class="hljs-comment"># * develop</span>
</code></pre><h2 id="h2-shallow-clone-into-folder" class="group relative scroll-mt-24">
        <a href="#h2-shallow-clone-into-folder" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Shallow Clone into Folder
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-shallow-clone-into-folder"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Clone with limited history into specific folder:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Shallow clone</span>
git <span class="hljs-built_in">clone</span> --depth 1 https://github.com/username/repo.git quick-clone

<span class="hljs-comment"># Only latest commit is cloned</span>
<span class="hljs-built_in">cd</span> quick-clone
git <span class="hljs-built_in">log</span> --oneline
<span class="hljs-comment"># Shows only 1 commit</span>
</code></pre><h2 id="h2-renaming-after-clone" class="group relative scroll-mt-24">
        <a href="#h2-renaming-after-clone" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Renaming After Clone
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-renaming-after-clone"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you cloned with the default name and want to rename:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone with default name</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git

<span class="hljs-comment"># Rename the folder</span>
<span class="hljs-built_in">mv</span> repository my-project

<span class="hljs-built_in">cd</span> my-project
<span class="hljs-comment"># Everything still works</span>
</code></pre><p>Git does not care about the folder name after cloning.</p>
<h2 id="h2-cloning-into-symbolic-link" class="group relative scroll-mt-24">
        <a href="#h2-cloning-into-symbolic-link" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning into Symbolic Link
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-into-symbolic-link"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can clone through symbolic links:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create symbolic link</span>
<span class="hljs-built_in">ln</span> -s /mnt/storage/projects /home/user/dev

<span class="hljs-comment"># Clone into linked location</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git /home/user/dev/my-project

<span class="hljs-comment"># Physically stored at /mnt/storage/projects/my-project</span>
</code></pre><h2 id="h2-common-patterns" class="group relative scroll-mt-24">
        <a href="#h2-common-patterns" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Patterns
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-patterns"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Workspace organization:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># By company</span>
git <span class="hljs-built_in">clone</span> https://github.com/company/repo.git ~/work/company/repo

<span class="hljs-comment"># By language</span>
git <span class="hljs-built_in">clone</span> https://github.com/user/js-project.git ~/projects/javascript/js-project

<span class="hljs-comment"># By status</span>
git <span class="hljs-built_in">clone</span> https://github.com/user/active-project.git ~/active/project
</code></pre><p><strong>Testing different versions:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Current stable</span>
git <span class="hljs-built_in">clone</span> -b main https://github.com/user/repo.git repo-stable

<span class="hljs-comment"># Beta version</span>
git <span class="hljs-built_in">clone</span> -b beta https://github.com/user/repo.git repo-beta

<span class="hljs-comment"># Development</span>
git <span class="hljs-built_in">clone</span> -b develop https://github.com/user/repo.git repo-dev
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use descriptive folder names:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Good: Clear what it is</span>
git <span class="hljs-built_in">clone</span> url company-website-frontend

<span class="hljs-comment"># Less clear: Needs context</span>
git <span class="hljs-built_in">clone</span> url frontend
</code></pre><p>Follow consistent naming:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Consistent pattern</span>
git <span class="hljs-built_in">clone</span> url client-portal-web
git <span class="hljs-built_in">clone</span> url client-portal-api
git <span class="hljs-built_in">clone</span> url client-portal-mobile
</code></pre><p>Organize by project:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">mkdir</span> client-portal
git <span class="hljs-built_in">clone</span> url1 client-portal/web
git <span class="hljs-built_in">clone</span> url2 client-portal/api
git <span class="hljs-built_in">clone</span> url3 client-portal/mobile
</code></pre><p>Use short names for frequent access:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># If you type it often, keep it short</span>
git <span class="hljs-built_in">clone</span> https://github.com/long-company-name/repository-name.git proj
</code></pre><p>Document in team workflows:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># In README or docs:</span>
<span class="hljs-comment"># Clone to: git clone &lt;url&gt; project-frontend</span>
<span class="hljs-comment"># This matches team convention</span>
</code></pre><h2 id="h2-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Error: Folder already exists</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check if folder exists</span>
<span class="hljs-built_in">ls</span> -la folder-name

<span class="hljs-comment"># Remove or use different name</span>
<span class="hljs-built_in">rm</span> -rf folder-name
git <span class="hljs-built_in">clone</span> url folder-name
</code></pre><p><strong>Error: Permission denied</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check parent directory permissions</span>
<span class="hljs-built_in">ls</span> -ld parent-directory

<span class="hljs-comment"># Use sudo if needed (be careful)</span>
<span class="hljs-built_in">sudo</span> git <span class="hljs-built_in">clone</span> url /var/www/project
</code></pre><p><strong>Error: Invalid path</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On Windows, avoid these characters: &lt; &gt; : &quot; / \ | ? *</span>
git <span class="hljs-built_in">clone</span> url valid-folder-name

<span class="hljs-comment"># Not: my-project/feature</span>
<span class="hljs-comment"># Use: my-project-feature</span>
</code></pre><p>Now you know how to clone a Git repository into a specific folder. Simply add the folder name as an argument after the repository URL: <code>git clone url folder-name</code>. This gives you control over your project organization and folder structure.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How do I Resolve Merge Conflicts in a Git Repository?]]></title>
      <link>https://devops-daily.com/posts/how-do-i-resolve-merge-conflicts-in-a-git-repository</link>
      <description><![CDATA[Merge conflicts happen when Git cannot automatically combine changes from different branches. Learn how to identify, understand, and resolve conflicts to keep your development workflow moving forward.]]></description>
      <pubDate>Thu, 22 May 2025 11:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-do-i-resolve-merge-conflicts-in-a-git-repository</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Version Control]]></category><category><![CDATA[Merge Conflicts]]></category><category><![CDATA[Collaboration]]></category><category><![CDATA[Development]]></category>
      <content:encoded><![CDATA[<p>Merge conflicts are a normal part of working with Git in a team environment. They occur when Git cannot automatically determine which changes should take precedence because two branches have modified the same parts of a file in different ways. While they might seem intimidating at first, resolving conflicts is a straightforward process once you understand what Git is showing you.</p>
<p>This guide walks you through identifying, understanding, and resolving merge conflicts so you can confidently merge branches and collaborate with your team.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you encounter a merge conflict, Git marks the conflicted sections in your files with <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>, <code>=======</code>, and <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code> markers. Open the files, manually choose which changes to keep (or combine both), remove the markers, then run <code>git add &lt;file&gt;</code> and <code>git commit</code> to complete the merge.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need a Git repository and basic familiarity with Git commands like commit, merge, and branch. Understanding how branches work will help you grasp why conflicts occur.</p>
<h2 id="h2-understanding-why-conflicts-happen" class="group relative scroll-mt-24">
        <a href="#h2-understanding-why-conflicts-happen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Why Conflicts Happen
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-why-conflicts-happen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Merge conflicts occur when:</p>
<ol>
<li>Two branches modify the same lines in a file</li>
<li>One branch deletes a file while another modifies it</li>
<li>Two branches create different files with the same name</li>
</ol>
<p>Here&#39;s a common scenario:</p>
<pre><code>main branch:      A -&gt; B -&gt; C -&gt; D
                       \
feature branch:         X -&gt; Y -&gt; Z
</code></pre><p>If both commit D and commit Z modified line 10 of <code>config.js</code>, Git won&#39;t know which version to use when merging. It needs you to decide.</p>
<h2 id="h2-identifying-when-you-have-a-conflict" class="group relative scroll-mt-24">
        <a href="#h2-identifying-when-you-have-a-conflict" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Identifying When You Have a Conflict
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-identifying-when-you-have-a-conflict"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you try to merge branches, Git tells you immediately if there are conflicts:</p>
<pre><code class="hljs language-bash">git merge feature-branch
</code></pre><p>Output with conflicts:</p>
<pre><code>Auto-merging src/config.js
CONFLICT (content): Merge conflict in src/config.js
Automatic merge failed; fix conflicts and then commit the result.
</code></pre><p>Check which files have conflicts:</p>
<pre><code class="hljs language-bash">git status
</code></pre><p>You&#39;ll see:</p>
<pre><code>On branch main
You have unmerged paths.
  (fix conflicts and run &quot;git commit&quot;)
  (use &quot;git merge --abort&quot; to abort the merge)

Unmerged paths:
  (use &quot;git add &lt;file&gt;...&quot; to mark resolution)
        both modified:   src/config.js
        both modified:   README.md

no changes added to commit (use &quot;git add&quot; and/or &quot;git commit -a&quot;)
</code></pre><p>The &quot;both modified&quot; label shows files where both branches made changes to the same content.</p>
<h2 id="h2-understanding-conflict-markers" class="group relative scroll-mt-24">
        <a href="#h2-understanding-conflict-markers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding Conflict Markers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-conflict-markers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Open a conflicted file and you&#39;ll see special markers showing the conflicting changes:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">initializeApp</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> config = {
&lt;&lt;&lt;&lt;&lt;&lt;&lt; <span class="hljs-variable constant_">HEAD</span>
    <span class="hljs-attr">apiUrl</span>: <span class="hljs-string">&#x27;https://api.production.com&#x27;</span>,
    <span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>,
    <span class="hljs-attr">retries</span>: <span class="hljs-number">3</span>
=======
    <span class="hljs-attr">apiUrl</span>: <span class="hljs-string">&#x27;https://api.staging.com&#x27;</span>,
    <span class="hljs-attr">timeout</span>: <span class="hljs-number">3000</span>,
    <span class="hljs-attr">maxRetries</span>: <span class="hljs-number">5</span>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature-branch
  };
  <span class="hljs-keyword">return</span> config;
}
</code></pre><p>Here&#39;s what each marker means:</p>
<ul>
<li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code>: Start of changes from your current branch (usually main)</li>
<li><code>=======</code>: Divider between the two versions</li>
<li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature-branch</code>: End of changes from the branch you&#39;re merging</li>
</ul>
<p>Everything between <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code> and <code>=======</code> is what exists in your current branch. Everything between <code>=======</code> and <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature-branch</code> is what exists in the branch you&#39;re merging in.</p>
<h2 id="h2-resolving-conflicts-manually" class="group relative scroll-mt-24">
        <a href="#h2-resolving-conflicts-manually" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resolving Conflicts Manually
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-resolving-conflicts-manually"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To resolve the conflict, you need to:</p>
<ol>
<li>Decide which version to keep (or combine both)</li>
<li>Remove the conflict markers</li>
<li>Mark the file as resolved</li>
</ol>
<h3 id="h3-option-1-keep-changes-from-your-current-branch" class="group relative scroll-mt-24">
        <a href="#h3-option-1-keep-changes-from-your-current-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 1: Keep Changes from Your Current Branch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-option-1-keep-changes-from-your-current-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you want to keep your current branch&#39;s version:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">initializeApp</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> config = {
    <span class="hljs-attr">apiUrl</span>: <span class="hljs-string">&#x27;https://api.production.com&#x27;</span>,
    <span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>,
    <span class="hljs-attr">retries</span>: <span class="hljs-number">3</span>
  };
  <span class="hljs-keyword">return</span> config;
}
</code></pre><p>Remove all the conflict markers and the other branch&#39;s changes.</p>
<h3 id="h3-option-2-keep-changes-from-the-incoming-branch" class="group relative scroll-mt-24">
        <a href="#h3-option-2-keep-changes-from-the-incoming-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 2: Keep Changes from the Incoming Branch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-option-2-keep-changes-from-the-incoming-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you want to keep the feature branch&#39;s version:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">initializeApp</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> config = {
    <span class="hljs-attr">apiUrl</span>: <span class="hljs-string">&#x27;https://api.staging.com&#x27;</span>,
    <span class="hljs-attr">timeout</span>: <span class="hljs-number">3000</span>,
    <span class="hljs-attr">maxRetries</span>: <span class="hljs-number">5</span>
  };
  <span class="hljs-keyword">return</span> config;
}
</code></pre><h3 id="h3-option-3-combine-both-changes" class="group relative scroll-mt-24">
        <a href="#h3-option-3-combine-both-changes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 3: Combine Both Changes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-option-3-combine-both-changes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Often the best solution incorporates both sets of changes:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">initializeApp</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> config = {
    <span class="hljs-attr">apiUrl</span>: <span class="hljs-string">&#x27;https://api.production.com&#x27;</span>,
    <span class="hljs-attr">timeout</span>: <span class="hljs-number">5000</span>,
    <span class="hljs-attr">retries</span>: <span class="hljs-number">3</span>,
    <span class="hljs-attr">maxRetries</span>: <span class="hljs-number">5</span>
  };
  <span class="hljs-keyword">return</span> config;
}
</code></pre><p>In this case, you keep the production API URL and timeout from main, but also add the maxRetries property from the feature branch. The key is understanding what each change does and making an informed decision.</p>
<h2 id="h2-marking-files-as-resolved" class="group relative scroll-mt-24">
        <a href="#h2-marking-files-as-resolved" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Marking Files as Resolved
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-marking-files-as-resolved"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After manually editing the file to resolve conflicts:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Stage the resolved file</span>
git add src/config.js

<span class="hljs-comment"># Check status</span>
git status
</code></pre><p>You&#39;ll see:</p>
<pre><code>On branch main
All conflicts fixed but you are still merging.
  (use &quot;git commit&quot; to conclude merge)

Changes to be committed:
        modified:   src/config.js
</code></pre><p>Once all conflicted files are resolved and staged, complete the merge:</p>
<pre><code class="hljs language-bash">git commit
</code></pre><p>Git will open your editor with a pre-written merge commit message. You can accept it or modify it to include notes about how you resolved the conflicts.</p>
<h2 id="h2-using-command-line-tools-to-choose-a-version" class="group relative scroll-mt-24">
        <a href="#h2-using-command-line-tools-to-choose-a-version" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Command Line Tools to Choose a Version
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-command-line-tools-to-choose-a-version"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you want to quickly accept all changes from one branch or the other without manual editing:</p>
<h3 id="h3-keep-all-changes-from-your-current-branch" class="group relative scroll-mt-24">
        <a href="#h3-keep-all-changes-from-your-current-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Keep all changes from your current branch:
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-all-changes-from-your-current-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># For a specific file</span>
git checkout --ours src/config.js

<span class="hljs-comment"># For all conflicted files</span>
git checkout --ours .
</code></pre><h3 id="h3-keep-all-changes-from-the-incoming-branch" class="group relative scroll-mt-24">
        <a href="#h3-keep-all-changes-from-the-incoming-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Keep all changes from the incoming branch:
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-keep-all-changes-from-the-incoming-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># For a specific file</span>
git checkout --theirs src/config.js

<span class="hljs-comment"># For all conflicted files</span>
git checkout --theirs .
</code></pre><p>After using <code>--ours</code> or <code>--theirs</code>, stage the files:</p>
<pre><code class="hljs language-bash">git add .
git commit
</code></pre><p>This approach is useful when you know one branch&#39;s changes should completely override the other, but use it carefully - you might lose important changes.</p>
<h2 id="h2-aborting-a-merge" class="group relative scroll-mt-24">
        <a href="#h2-aborting-a-merge" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Aborting a Merge
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-aborting-a-merge"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you realize the merge is going wrong or you need to approach it differently:</p>
<pre><code class="hljs language-bash">git merge --abort
</code></pre><p>This returns your repository to the state before you started the merge. You lose any conflict resolution work you&#39;ve done, but your branches remain unchanged.</p>
<h2 id="h2-resolving-conflicts-during-a-rebase" class="group relative scroll-mt-24">
        <a href="#h2-resolving-conflicts-during-a-rebase" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resolving Conflicts During a Rebase
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-resolving-conflicts-during-a-rebase"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Conflicts can also occur during a rebase. The process is similar but with different commands:</p>
<pre><code class="hljs language-bash">git rebase main
</code></pre><p>If conflicts occur:</p>
<pre><code>CONFLICT (content): Merge conflict in src/config.js
error: could not apply abc123... Add new feature
</code></pre><p>Resolve conflicts the same way (edit files, remove markers), then:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Stage resolved files</span>
git add src/config.js

<span class="hljs-comment"># Continue the rebase</span>
git rebase --<span class="hljs-built_in">continue</span>
</code></pre><p>If you want to abort the rebase:</p>
<pre><code class="hljs language-bash">git rebase --abort
</code></pre><h2 id="h2-using-visual-merge-tools" class="group relative scroll-mt-24">
        <a href="#h2-using-visual-merge-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Visual Merge Tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-visual-merge-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Many developers prefer visual tools for resolving conflicts. Git supports various merge tools:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See available merge tools</span>
git mergetool --tool-help

<span class="hljs-comment"># Use a specific tool (example: vimdiff)</span>
git mergetool --tool=vimdiff

<span class="hljs-comment"># Or just run the configured default tool</span>
git mergetool
</code></pre><p>Popular merge tools include:</p>
<ul>
<li><strong>VS Code</strong>: Built-in merge conflict resolver</li>
<li><strong>vimdiff</strong>: Terminal-based, available everywhere</li>
<li><strong>meld</strong>: Graphical tool for Linux</li>
<li><strong>kdiff3</strong>: Cross-platform graphical tool</li>
<li><strong>p4merge</strong>: Free tool from Perforce</li>
</ul>
<p>Configure your preferred tool:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set VS Code as your merge tool</span>
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd <span class="hljs-string">&#x27;code --wait $MERGED&#x27;</span>

<span class="hljs-comment"># Or use meld</span>
git config --global merge.tool meld
</code></pre><h2 id="h2-common-conflict-scenarios" class="group relative scroll-mt-24">
        <a href="#h2-common-conflict-scenarios" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Conflict Scenarios
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-conflict-scenarios"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-both-branches-added-different-lines" class="group relative scroll-mt-24">
        <a href="#h3-both-branches-added-different-lines" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Both Branches Added Different Lines
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-both-branches-added-different-lines"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When both branches add content in the same location:</p>
<pre><code class="hljs language-javascript">&lt;&lt;&lt;&lt;&lt;&lt;&lt; <span class="hljs-variable constant_">HEAD</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">calculateTotal</span>(<span class="hljs-params">items</span>) {
  <span class="hljs-keyword">return</span> items.<span class="hljs-title function_">reduce</span>(<span class="hljs-function">(<span class="hljs-params">sum, item</span>) =&gt;</span> sum + item.<span class="hljs-property">price</span>, <span class="hljs-number">0</span>);
}
=======
<span class="hljs-keyword">function</span> <span class="hljs-title function_">calculateTotal</span>(<span class="hljs-params">items</span>) {
  <span class="hljs-keyword">const</span> total = items.<span class="hljs-title function_">map</span>(<span class="hljs-function"><span class="hljs-params">i</span> =&gt;</span> i.<span class="hljs-property">price</span>).<span class="hljs-title function_">reduce</span>(<span class="hljs-function">(<span class="hljs-params">a, b</span>) =&gt;</span> a + b, <span class="hljs-number">0</span>);
  <span class="hljs-keyword">return</span> total;
}
&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature-branch
</code></pre><p>You might combine the best of both:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">function</span> <span class="hljs-title function_">calculateTotal</span>(<span class="hljs-params">items</span>) {
  <span class="hljs-comment">// Use reduce for clarity and performance</span>
  <span class="hljs-keyword">return</span> items.<span class="hljs-title function_">reduce</span>(<span class="hljs-function">(<span class="hljs-params">sum, item</span>) =&gt;</span> sum + item.<span class="hljs-property">price</span>, <span class="hljs-number">0</span>);
}
</code></pre><h3 id="h3-conflicting-import-statements" class="group relative scroll-mt-24">
        <a href="#h3-conflicting-import-statements" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conflicting Import Statements
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-conflicting-import-statements"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-javascript">&lt;&lt;&lt;&lt;&lt;&lt;&lt; <span class="hljs-variable constant_">HEAD</span>
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">UserService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/user&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">AuthService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/auth&#x27;</span>;
=======
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">UserService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/users&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">AuthenticationService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/authentication&#x27;</span>;
&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature-branch
</code></pre><p>Determine which module names and paths are correct:</p>
<pre><code class="hljs language-javascript"><span class="hljs-keyword">import</span> { <span class="hljs-title class_">UserService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/user&#x27;</span>;
<span class="hljs-keyword">import</span> { <span class="hljs-title class_">AuthenticationService</span> } <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;./services/authentication&#x27;</span>;
</code></pre><h3 id="h3-configuration-changes" class="group relative scroll-mt-24">
        <a href="#h3-configuration-changes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Configuration Changes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-configuration-changes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-string">&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span> <span class="hljs-string">HEAD</span>
<span class="hljs-attr">database:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">localhost</span>
  <span class="hljs-attr">port:</span> <span class="hljs-number">5432</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">production_db</span>
<span class="hljs-string">=======</span>
<span class="hljs-attr">database:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">db.example.com</span>
  <span class="hljs-attr">port:</span> <span class="hljs-number">5432</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">app_database</span>
  <span class="hljs-attr">pool_size:</span> <span class="hljs-number">20</span>
<span class="hljs-string">&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span> <span class="hljs-string">feature-branch</span>
</code></pre><p>Merge relevant settings:</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">database:</span>
  <span class="hljs-attr">host:</span> <span class="hljs-string">localhost</span>
  <span class="hljs-attr">port:</span> <span class="hljs-number">5432</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">production_db</span>
  <span class="hljs-attr">pool_size:</span> <span class="hljs-number">20</span>
</code></pre><h2 id="h2-preventing-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-preventing-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Preventing Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-preventing-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>While conflicts are normal, you can reduce their frequency:</p>
<p><strong>Keep branches short-lived</strong>: Merge feature branches frequently rather than letting them diverge for weeks.</p>
<p><strong>Pull regularly</strong>: Keep your feature branch updated with main:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># While on feature branch</span>
git fetch origin
git merge origin/main
</code></pre><p><strong>Communicate with your team</strong>: If you know someone else is working on the same files, coordinate your changes.</p>
<p><strong>Use smaller commits</strong>: Smaller, focused commits are easier to merge than large, sprawling changes.</p>
<p><strong>Refactor carefully</strong>: Large refactoring changes often create conflicts. Consider doing them on a dedicated branch that gets merged quickly.</p>
<h2 id="h2-testing-after-resolving-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-testing-after-resolving-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Testing After Resolving Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-testing-after-resolving-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After resolving conflicts and completing the merge, always test your code:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run your test suite</span>
npm <span class="hljs-built_in">test</span>

<span class="hljs-comment"># Or whatever your project uses</span>
pytest
go <span class="hljs-built_in">test</span> ./...
cargo <span class="hljs-built_in">test</span>
</code></pre><p>Conflicts might introduce subtle bugs even when the merge looks correct. The changes you merged might work individually but cause issues when combined.</p>
<h2 id="h2-viewing-conflict-history" class="group relative scroll-mt-24">
        <a href="#h2-viewing-conflict-history" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Viewing Conflict History
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-viewing-conflict-history"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To see files that had conflicts in past merges:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Show merge commits</span>
git <span class="hljs-built_in">log</span> --merges --oneline

<span class="hljs-comment"># See details of a specific merge</span>
git show &lt;merge-commit-hash&gt;

<span class="hljs-comment"># See what conflicts were resolved</span>
git <span class="hljs-built_in">log</span> -p -S <span class="hljs-string">&quot;&lt;&lt;&lt;&lt;&lt;&lt;&quot;</span> --all
</code></pre><h2 id="h2-using-git-rerere-for-repeated-conflicts" class="group relative scroll-mt-24">
        <a href="#h2-using-git-rerere-for-repeated-conflicts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Git Rerere for Repeated Conflicts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-git-rerere-for-repeated-conflicts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you frequently encounter the same conflicts (common when repeatedly merging long-lived branches), enable Git&#39;s &quot;reuse recorded resolution&quot; feature:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Enable rerere</span>
git config --global rerere.enabled <span class="hljs-literal">true</span>
</code></pre><p>Now Git remembers how you resolved conflicts and automatically applies the same resolution if the conflict reoccurs. This is helpful during rebases or when syncing branches repeatedly.</p>
<p>Merge conflicts are a natural part of collaborative development. The key is staying calm, understanding what Git is showing you, and making thoughtful decisions about which changes to keep. With practice, resolving conflicts becomes routine rather than stressful, and you&#39;ll develop strategies for avoiding conflicts in the first place.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Set Git Editor for Commit Messages]]></title>
      <link>https://devops-daily.com/posts/set-git-editor-commit-messages</link>
      <description><![CDATA[Want to use your preferred editor for Git commit messages? Learn how to configure Git to use VS Code, Vim, Nano, Emacs, or any editor of your choice.]]></description>
      <pubDate>Thu, 22 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/set-git-editor-commit-messages</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Configuration]]></category><category><![CDATA[Editor]]></category><category><![CDATA[Commit Messages]]></category><category><![CDATA[Development Environment]]></category>
      <content:encoded><![CDATA[<p>Git opens a text editor when you run <code>git commit</code> without the <code>-m</code> flag or when you need to edit messages during rebase or merge. By default, Git uses whatever editor is configured in your shell, which might not be the one you prefer.</p>
<p><strong>TLDR:</strong> To set your Git editor, use <code>git config --global core.editor &quot;editor-command&quot;</code>. For VS Code: <code>git config --global core.editor &quot;code --wait&quot;</code>. For Nano: <code>git config --global core.editor &quot;nano&quot;</code>. For Vim: <code>git config --global core.editor &quot;vim&quot;</code>. The <code>--wait</code> flag is crucial for GUI editors to make Git wait for you to close the file.</p>
<p>In this guide, you&#39;ll learn how to configure Git to use any editor for commit messages.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You&#39;ll need Git installed on your system and your preferred editor installed. Basic familiarity with the command line will help you follow along.</p>
<h2 id="h2-checking-your-current-editor" class="group relative scroll-mt-24">
        <a href="#h2-checking-your-current-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking Your Current Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-your-current-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To see which editor Git is currently using:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check configured editor</span>
git config --global core.editor

<span class="hljs-comment"># If not set, Git uses the default (usually vi/vim)</span>
<span class="hljs-comment"># To see what Git will actually use:</span>
git var GIT_EDITOR
</code></pre><h2 id="h2-setting-vs-code-as-git-editor" class="group relative scroll-mt-24">
        <a href="#h2-setting-vs-code-as-git-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting VS Code as Git Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-vs-code-as-git-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Visual Studio Code is a popular choice:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set VS Code as editor</span>
git config --global core.editor <span class="hljs-string">&quot;code --wait&quot;</span>

<span class="hljs-comment"># Test it</span>
git commit
<span class="hljs-comment"># VS Code opens for your commit message</span>
</code></pre><p>The <code>--wait</code> flag is critical - it tells VS Code to block until you close the file, so Git knows when you&#39;re done editing.</p>
<p>For VS Code Insiders:</p>
<pre><code class="hljs language-bash">git config --global core.editor <span class="hljs-string">&quot;code-insiders --wait&quot;</span>
</code></pre><h2 id="h2-setting-vim-as-git-editor" class="group relative scroll-mt-24">
        <a href="#h2-setting-vim-as-git-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Vim as Git Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-vim-as-git-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Vim is the traditional Unix editor:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Vim</span>
git config --global core.editor <span class="hljs-string">&quot;vim&quot;</span>

<span class="hljs-comment"># Or explicitly use vi</span>
git config --global core.editor <span class="hljs-string">&quot;vi&quot;</span>

<span class="hljs-comment"># For nvim (Neovim)</span>
git config --global core.editor <span class="hljs-string">&quot;nvim&quot;</span>
</code></pre><p>Vim is usually the default on Unix systems, so you might not need to set this.</p>
<h2 id="h2-setting-nano-as-git-editor" class="group relative scroll-mt-24">
        <a href="#h2-setting-nano-as-git-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Nano as Git Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-nano-as-git-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Nano is beginner-friendly with on-screen help:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Nano</span>
git config --global core.editor <span class="hljs-string">&quot;nano&quot;</span>

<span class="hljs-comment"># Test it</span>
git commit
<span class="hljs-comment"># Nano opens with helpful shortcuts at bottom</span>
</code></pre><p>Nano is easier for users who are not comfortable with Vim.</p>
<h2 id="h2-setting-emacs-as-git-editor" class="group relative scroll-mt-24">
        <a href="#h2-setting-emacs-as-git-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Emacs as Git Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-emacs-as-git-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For Emacs users:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Emacs</span>
git config --global core.editor <span class="hljs-string">&quot;emacs&quot;</span>

<span class="hljs-comment"># Or for terminal mode</span>
git config --global core.editor <span class="hljs-string">&quot;emacs -nw&quot;</span>

<span class="hljs-comment"># For GUI Emacs that waits</span>
git config --global core.editor <span class="hljs-string">&quot;emacsclient -c&quot;</span>
</code></pre><h2 id="h2-setting-sublime-text" class="group relative scroll-mt-24">
        <a href="#h2-setting-sublime-text" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Sublime Text
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-sublime-text"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For Sublime Text:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># macOS</span>
git config --global core.editor <span class="hljs-string">&quot;subl -n -w&quot;</span>

<span class="hljs-comment"># Windows</span>
git config --global core.editor <span class="hljs-string">&quot;&#x27;C:/Program Files/Sublime Text/sublime_text.exe&#x27; -w&quot;</span>

<span class="hljs-comment"># Linux</span>
git config --global core.editor <span class="hljs-string">&quot;subl -n -w&quot;</span>
</code></pre><p>The <code>-w</code> flag makes Sublime wait, similar to <code>--wait</code> in VS Code.</p>
<h2 id="h2-setting-atom" class="group relative scroll-mt-24">
        <a href="#h2-setting-atom" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Atom
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-atom"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For Atom editor:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Atom</span>
git config --global core.editor <span class="hljs-string">&quot;atom --wait&quot;</span>
</code></pre><h2 id="h2-setting-notepad-windows" class="group relative scroll-mt-24">
        <a href="#h2-setting-notepad-windows" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Notepad++ (Windows)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-notepad-windows"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For Notepad++ on Windows:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Notepad++ (adjust path if needed)</span>
git config --global core.editor <span class="hljs-string">&quot;&#x27;C:/Program Files/Notepad++/notepad++.exe&#x27; -multiInst -notabbar -nosession -noPlugin&quot;</span>
</code></pre><h2 id="h2-setting-textedit-macos" class="group relative scroll-mt-24">
        <a href="#h2-setting-textedit-macos" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting TextEdit (macOS)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-textedit-macos"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For macOS TextEdit:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set TextEdit</span>
git config --global core.editor <span class="hljs-string">&quot;open -e -W&quot;</span>
</code></pre><p>The <code>-W</code> flag makes the command wait until TextEdit closes.</p>
<h2 id="h2-setting-nano-with-line-numbers" class="group relative scroll-mt-24">
        <a href="#h2-setting-nano-with-line-numbers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Nano with Line Numbers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-nano-with-line-numbers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Configure Nano to show line numbers:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set Nano with line numbers</span>
git config --global core.editor <span class="hljs-string">&quot;nano -l&quot;</span>

<span class="hljs-comment"># Or with multiple options</span>
git config --global core.editor <span class="hljs-string">&quot;nano -l -i&quot;</span>
</code></pre><p>Flags:</p>
<ul>
<li><code>-l</code> shows line numbers</li>
<li><code>-i</code> enables auto-indent</li>
</ul>
<h2 id="h2-using-environment-variables" class="group relative scroll-mt-24">
        <a href="#h2-using-environment-variables" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Environment Variables
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-environment-variables"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Git respects shell environment variables:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Set editor in your shell profile (~/.bashrc, ~/.zshrc, etc.)</span>
<span class="hljs-built_in">export</span> EDITOR=vim
<span class="hljs-built_in">export</span> GIT_EDITOR=code --<span class="hljs-built_in">wait</span>

<span class="hljs-comment"># Git will use these if core.editor is not set</span>
</code></pre><p>The priority order is:</p>
<ol>
<li><code>GIT_EDITOR</code> environment variable</li>
<li><code>core.editor</code> Git config</li>
<li><code>VISUAL</code> environment variable</li>
<li><code>EDITOR</code> environment variable</li>
<li>Default (usually vi)</li>
</ol>
<h2 id="h2-setting-editor-for-specific-repository" class="group relative scroll-mt-24">
        <a href="#h2-setting-editor-for-specific-repository" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Editor for Specific Repository
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-editor-for-specific-repository"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To set an editor for only one repository:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Navigate to repository</span>
<span class="hljs-built_in">cd</span> /path/to/repo

<span class="hljs-comment"># Set editor for this repo only (no --global)</span>
git config core.editor <span class="hljs-string">&quot;nano&quot;</span>

<span class="hljs-comment"># Check it was set</span>
git config core.editor
</code></pre><h2 id="h2-setting-editor-for-different-operations" class="group relative scroll-mt-24">
        <a href="#h2-setting-editor-for-different-operations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Editor for Different Operations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-editor-for-different-operations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can set different editors for different Git operations:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Editor for commit messages</span>
git config --global core.editor <span class="hljs-string">&quot;code --wait&quot;</span>

<span class="hljs-comment"># Editor for diffs</span>
git config --global diff.tool <span class="hljs-string">&quot;meld&quot;</span>

<span class="hljs-comment"># Editor for merge conflicts</span>
git config --global merge.tool <span class="hljs-string">&quot;kdiff3&quot;</span>
</code></pre><h2 id="h2-temporarily-using-a-different-editor" class="group relative scroll-mt-24">
        <a href="#h2-temporarily-using-a-different-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Temporarily Using a Different Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-temporarily-using-a-different-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Override the configured editor for one command:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Use nano for this commit only</span>
GIT_EDITOR=nano git commit

<span class="hljs-comment"># Use vim for this commit</span>
GIT_EDITOR=vim git commit
</code></pre><h2 id="h2-common-issues-and-solutions" class="group relative scroll-mt-24">
        <a href="#h2-common-issues-and-solutions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Issues and Solutions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-issues-and-solutions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Issue: Editor opens but Git says &quot;Aborting commit&quot;</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Problem: Editor is not waiting</span>
git config --global core.editor <span class="hljs-string">&quot;code --wait&quot;</span>
<span class="hljs-comment">#                                       ^^^^^^</span>
<span class="hljs-comment"># The --wait flag is crucial</span>
</code></pre><p><strong>Issue: &quot;error: cannot run code: No such file or directory&quot;</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Problem: Editor is not in PATH</span>
<span class="hljs-comment"># Solution 1: Add full path</span>
git config --global core.editor <span class="hljs-string">&quot;/usr/local/bin/code --wait&quot;</span>

<span class="hljs-comment"># Solution 2: Add editor to PATH</span>
<span class="hljs-built_in">export</span> PATH=<span class="hljs-string">&quot;<span class="hljs-variable">$PATH</span>:/path/to/editor&quot;</span>
</code></pre><p><strong>Issue: Windows path problems</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Use forward slashes and quotes for spaces</span>
git config --global core.editor <span class="hljs-string">&quot;&#x27;C:/Program Files/Editor/editor.exe&#x27; --wait&quot;</span>
</code></pre><h2 id="h2-testing-your-editor-configuration" class="group relative scroll-mt-24">
        <a href="#h2-testing-your-editor-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Testing Your Editor Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-testing-your-editor-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Test the editor works correctly:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Make a change</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;test&quot;</span> &gt;&gt; test.txt
git add test.txt

<span class="hljs-comment"># Commit without -m (opens editor)</span>
git commit

<span class="hljs-comment"># If editor opens correctly, write message and save</span>
<span class="hljs-comment"># Git should complete the commit when you close the editor</span>
</code></pre><h2 id="h2-setting-up-gui-editors-properly" class="group relative scroll-mt-24">
        <a href="#h2-setting-up-gui-editors-properly" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Setting Up GUI Editors Properly
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-setting-up-gui-editors-properly"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For GUI editors, you must include the wait flag:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Good: Editor waits</span>
git config --global core.editor <span class="hljs-string">&quot;code --wait&quot;</span>
git config --global core.editor <span class="hljs-string">&quot;subl -w&quot;</span>
git config --global core.editor <span class="hljs-string">&quot;atom --wait&quot;</span>

<span class="hljs-comment"># Bad: Git does not wait, commits abort</span>
git config --global core.editor <span class="hljs-string">&quot;code&quot;</span>
git config --global core.editor <span class="hljs-string">&quot;subl&quot;</span>
</code></pre><h2 id="h2-multiple-git-accounts-with-different-editors" class="group relative scroll-mt-24">
        <a href="#h2-multiple-git-accounts-with-different-editors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Multiple Git Accounts with Different Editors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-multiple-git-accounts-with-different-editors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Using conditional includes, you can set different editors per project:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># ~/.gitconfig</span>
[includeIf <span class="hljs-string">&quot;gitdir:~/work/&quot;</span>]
    path = ~/.gitconfig-work
[includeIf <span class="hljs-string">&quot;gitdir:~/personal/&quot;</span>]
    path = ~/.gitconfig-personal
</code></pre><p>In <code>~/.gitconfig-work</code>:</p>
<pre><code class="hljs language-bash">[core]
    editor = code --<span class="hljs-built_in">wait</span>
</code></pre><p>In <code>~/.gitconfig-personal</code>:</p>
<pre><code class="hljs language-bash">[core]
    editor = nano
</code></pre><h2 id="h2-resetting-to-default-editor" class="group relative scroll-mt-24">
        <a href="#h2-resetting-to-default-editor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Resetting to Default Editor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-resetting-to-default-editor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To remove your custom editor configuration:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Remove global editor setting</span>
git config --global --<span class="hljs-built_in">unset</span> core.editor

<span class="hljs-comment"># Check what Git will use now</span>
git var GIT_EDITOR
</code></pre><p>Git falls back to environment variables or system defaults.</p>
<h2 id="h2-ide-specific-configurations" class="group relative scroll-mt-24">
        <a href="#h2-ide-specific-configurations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          IDE-Specific Configurations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-ide-specific-configurations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>IntelliJ IDEA / WebStorm:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># macOS</span>
git config --global core.editor <span class="hljs-string">&quot;idea --wait&quot;</span>

<span class="hljs-comment"># Windows</span>
git config --global core.editor <span class="hljs-string">&quot;&#x27;C:/Program Files/JetBrains/IntelliJ IDEA/bin/idea64.exe&#x27; --wait&quot;</span>
</code></pre><p><strong>Eclipse:</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Use built-in Git integration</span>
<span class="hljs-comment"># Or set external editor</span>
git config --global core.editor <span class="hljs-string">&quot;eclipse -w&quot;</span>
</code></pre><h2 id="h2-vim-configuration-for-git" class="group relative scroll-mt-24">
        <a href="#h2-vim-configuration-for-git" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Vim Configuration for Git
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-vim-configuration-for-git"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Customize Vim for Git commit messages:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># In ~/.vimrc</span>
<span class="hljs-string">&quot; Git commit message settings
autocmd FileType gitcommit setlocal spell
autocmd FileType gitcommit setlocal textwidth=72
autocmd FileType gitcommit setlocal colorcolumn=51,73</span>
</code></pre><p>This enables spell check, wraps at 72 characters, and highlights the 50-character subject line limit.</p>
<h2 id="h2-nano-configuration-for-git" class="group relative scroll-mt-24">
        <a href="#h2-nano-configuration-for-git" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Nano Configuration for Git
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-nano-configuration-for-git"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Customize Nano for Git:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># In ~/.nanorc</span>
<span class="hljs-comment"># Git commit message settings</span>
<span class="hljs-built_in">set</span> speller <span class="hljs-string">&quot;aspell -x -c&quot;</span>
<span class="hljs-built_in">set</span> tabsize 4
<span class="hljs-built_in">set</span> smooth
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Choose an editor you&#39;re comfortable with:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># If you&#x27;re new to command line</span>
git config --global core.editor <span class="hljs-string">&quot;nano&quot;</span>

<span class="hljs-comment"># If you know Vim</span>
git config --global core.editor <span class="hljs-string">&quot;vim&quot;</span>

<span class="hljs-comment"># If you prefer GUI</span>
git config --global core.editor <span class="hljs-string">&quot;code --wait&quot;</span>
</code></pre><p>Make sure the wait flag is set:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Always include wait for GUI editors</span>
code --<span class="hljs-built_in">wait</span>    <span class="hljs-comment"># VS Code</span>
subl -w        <span class="hljs-comment"># Sublime</span>
atom --<span class="hljs-built_in">wait</span>    <span class="hljs-comment"># Atom</span>
</code></pre><p>Test before committing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Test editor opens correctly</span>
git commit --amend
<span class="hljs-comment"># Should open editor with last commit message</span>
<span class="hljs-comment"># Close without changes to abort</span>
</code></pre><p>Use shell aliases for quick editor switching:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># In ~/.bashrc or ~/.zshrc</span>
<span class="hljs-built_in">alias</span> git-vim=<span class="hljs-string">&#x27;GIT_EDITOR=vim git&#x27;</span>
<span class="hljs-built_in">alias</span> git-nano=<span class="hljs-string">&#x27;GIT_EDITOR=nano git&#x27;</span>

<span class="hljs-comment"># Use it</span>
git-nano commit  <span class="hljs-comment"># Opens Nano for this commit</span>
git-vim rebase -i HEAD~3  <span class="hljs-comment"># Opens Vim for rebase</span>
</code></pre><p>Now you know how to set your preferred editor for Git commit messages. The key is using <code>git config --global core.editor &quot;your-editor&quot;</code> with the appropriate wait flag for GUI editors. Choose an editor you&#39;re comfortable with to make writing commit messages easier and more efficient.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Why Does the C Preprocessor Interpret "linux" as "1"?]]></title>
      <link>https://devops-daily.com/posts/why-c-preprocessor-interprets-linux-as-one</link>
      <description><![CDATA[Discover why the word 'linux' is predefined as the constant 1 in the C preprocessor on Linux systems, and how this historical quirk can cause unexpected compilation errors.]]></description>
      <pubDate>Thu, 22 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/why-c-preprocessor-interprets-linux-as-one</guid>
      <category><![CDATA[C]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[C]]></category><category><![CDATA[Preprocessor]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Compiler]]></category><category><![CDATA[Debugging]]></category>
      <content:encoded><![CDATA[<p>You&#39;re writing C code and you create a variable named <code>linux</code>, then your code won&#39;t compile. Or worse, it compiles but behaves strangely. What&#39;s going on?</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TL;DR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The C preprocessor on Linux systems automatically defines the macro <code>linux</code> with the value <code>1</code>. This is a legacy feature from older compilers that predefined system names as macros. Modern code should use standard macros like <code>__linux__</code> instead. If you need to use <code>linux</code> as an identifier, you can undefine it with <code>#undef linux</code> or use compiler flags to prevent the predefinition.</p>
<p>This is one of those unexpected behaviors that can waste hours of debugging time if you don&#39;t know about it. The issue comes from how compilers historically handled platform detection.</p>
<p>Let&#39;s say you write this seemingly innocent code:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>

<span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {
    <span class="hljs-type">int</span> linux = <span class="hljs-number">5</span>;
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;linux = %d\n&quot;</span>, linux);
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre><p>When you compile it on a Linux system with gcc:</p>
<pre><code class="hljs language-bash">gcc test.c -o <span class="hljs-built_in">test</span>
</code></pre><p>The preprocessor replaces <code>linux</code> with <code>1</code> before compilation, so your code effectively becomes:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>

<span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {
    <span class="hljs-type">int</span> <span class="hljs-number">1</span> = <span class="hljs-number">5</span>;  <span class="hljs-comment">// Syntax error!</span>
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;1 = %d\n&quot;</span>, <span class="hljs-number">1</span>);
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre><p>This produces a confusing error message like &quot;expected identifier before numeric constant.&quot;</p>
<h2 id="h2-why-does-this-happen" class="group relative scroll-mt-24">
        <a href="#h2-why-does-this-happen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Does This Happen?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-does-this-happen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In the early days of Unix and C, compilers predefined macros for the operating system to help with platform-specific code. The idea was that you could write:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> unix</span>
    <span class="hljs-comment">// Unix-specific code</span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>

<span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> linux</span>
    <span class="hljs-comment">// Linux-specific code</span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>
</code></pre><p>The compiler would define these symbols automatically, so you could check which platform you were compiling for without needing to pass flags.</p>
<p>This seemed convenient at the time, but it had a major problem: it polluted the global namespace with common words like <code>unix</code> and <code>linux</code>. Any variable, function, or struct member with these names would be replaced by the preprocessor.</p>
<h2 id="h2-the-modern-standard" class="group relative scroll-mt-24">
        <a href="#h2-the-modern-standard" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Modern Standard
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-modern-standard"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>C standards organizations recognized this was a bad idea. The C standard now specifies that implementation-defined macros should start with an underscore followed by a capital letter (like <code>__linux__</code> or <code>__unix__</code>).</p>
<p>Modern compilers define proper macros:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> __linux__</span>
    <span class="hljs-comment">// Linux-specific code</span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>

<span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> __unix__</span>
    <span class="hljs-comment">// Unix-specific code</span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>

<span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> __APPLE__</span>
    <span class="hljs-comment">// macOS-specific code</span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>
</code></pre><p>But for backward compatibility, gcc still defines the old <code>linux</code> and <code>unix</code> macros by default when compiling C code (not C++).</p>
<h2 id="h2-seeing-the-predefined-macros" class="group relative scroll-mt-24">
        <a href="#h2-seeing-the-predefined-macros" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Seeing the Predefined Macros
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-seeing-the-predefined-macros"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can ask gcc to show you all its predefined macros:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Show all predefined macros</span>
gcc -dM -E - &lt; /dev/null

<span class="hljs-comment"># Filter for linux-related macros</span>
gcc -dM -E - &lt; /dev/null | grep linux
</code></pre><p>You&#39;ll see output like:</p>
<pre><code>#define __linux 1
#define __linux__ 1
#define linux 1
</code></pre><p>All three macros are defined with the value <code>1</code>.</p>
<h2 id="h2-how-to-work-around-it" class="group relative scroll-mt-24">
        <a href="#h2-how-to-work-around-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Work Around It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-work-around-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you need to use <code>linux</code> as an identifier (variable name, function name, etc.), you have several options.</p>
<p>The simplest is to undefine the macro at the top of your file:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">undef</span> linux</span>

<span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>

<span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {
    <span class="hljs-type">int</span> linux = <span class="hljs-number">5</span>;  <span class="hljs-comment">// Now this works</span>
    <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;linux = %d\n&quot;</span>, linux);
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre><p>Put <code>#undef linux</code> before any includes to avoid issues with headers that might use the macro.</p>
<p>Alternatively, compile with the <code>-std=c99</code> or <code>-std=c11</code> flag, which disables these non-standard predefined macros:</p>
<pre><code class="hljs language-bash">gcc -std=c99 test.c -o <span class="hljs-built_in">test</span>
</code></pre><p>Or use <code>-ansi</code> for strict ANSI C compliance:</p>
<pre><code class="hljs language-bash">gcc -ansi test.c -o <span class="hljs-built_in">test</span>
</code></pre><p>Both approaches prevent gcc from defining <code>linux</code> as a macro.</p>
<h2 id="h2-real-world-example-the-linux-kernel" class="group relative scroll-mt-24">
        <a href="#h2-real-world-example-the-linux-kernel" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Real-World Example: The Linux Kernel
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-real-world-example-the-linux-kernel"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Interestingly, even the Linux kernel itself has to deal with this. If you look at kernel headers, you&#39;ll find code like:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">undef</span> unix</span>
<span class="hljs-meta">#<span class="hljs-keyword">undef</span> linux</span>

<span class="hljs-comment">// ... kernel code</span>
</code></pre><p>The kernel developers have to undefine these macros to avoid conflicts with their own code.</p>
<h2 id="h2-when-this-causes-subtle-bugs" class="group relative scroll-mt-24">
        <a href="#h2-when-this-causes-subtle-bugs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When This Causes Subtle Bugs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-this-causes-subtle-bugs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The real danger isn&#39;t syntax errors (those are obvious). It&#39;s when the code compiles but behaves unexpectedly.</p>
<p>Consider this code:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>

<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">system_info</span> {</span>
    <span class="hljs-type">char</span> *name;
    <span class="hljs-type">int</span> linux;  <span class="hljs-comment">// Meant to be a boolean flag</span>
};

<span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {
    <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">system_info</span> <span class="hljs-title">info</span> =</span> { <span class="hljs-string">&quot;Server01&quot;</span>, <span class="hljs-number">0</span> };

    <span class="hljs-keyword">if</span> (info.linux) {
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Running Linux\n&quot;</span>);
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Not running Linux\n&quot;</span>);
    }

    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre><p>After preprocessor expansion, the struct becomes:</p>
<pre><code class="hljs language-c"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">system_info</span> {</span>
    <span class="hljs-type">char</span> *name;
    <span class="hljs-type">int</span> <span class="hljs-number">1</span>;  <span class="hljs-comment">// Syntax error</span>
};
</code></pre><p>But if you had a different name collision that didn&#39;t cause a syntax error, you might get runtime bugs that are hard to track down.</p>
<h2 id="h2-checking-for-platform-at-compile-time" class="group relative scroll-mt-24">
        <a href="#h2-checking-for-platform-at-compile-time" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking for Platform at Compile Time
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-for-platform-at-compile-time"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re writing portable code and need to check the platform, use the modern macros:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;stdio.h&gt;</span></span>

<span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {
    <span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> __linux__</span>
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Compiled on Linux\n&quot;</span>);
    <span class="hljs-meta">#<span class="hljs-keyword">elif</span> defined(__APPLE__)</span>
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Compiled on macOS\n&quot;</span>);
    <span class="hljs-meta">#<span class="hljs-keyword">elif</span> defined(_WIN32)</span>
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Compiled on Windows\n&quot;</span>);
    <span class="hljs-meta">#<span class="hljs-keyword">else</span></span>
        <span class="hljs-built_in">printf</span>(<span class="hljs-string">&quot;Unknown platform\n&quot;</span>);
    <span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>

    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code></pre><p>These macros are standardized and won&#39;t interfere with your identifiers.</p>
<h2 id="h2-c-doesn39t-have-this-problem" class="group relative scroll-mt-24">
        <a href="#h2-c-doesn39t-have-this-problem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          C++ Doesn&#39;t Have This Problem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-c-doesn39t-have-this-problem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you compile C code as C++ (using <code>g++</code> instead of <code>gcc</code>), the <code>linux</code> macro isn&#39;t defined:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># C compiler - defines linux</span>
gcc test.c -o <span class="hljs-built_in">test</span>

<span class="hljs-comment"># C++ compiler - doesn&#x27;t define linux</span>
g++ test.c -o <span class="hljs-built_in">test</span>
</code></pre><p>This is because C++ has stricter namespace rules, and the standards committee decided not to carry over this legacy behavior.</p>
<h2 id="h2-finding-the-problem-in-your-code" class="group relative scroll-mt-24">
        <a href="#h2-finding-the-problem-in-your-code" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Finding the Problem in Your Code
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-finding-the-problem-in-your-code"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re getting weird errors and suspect the <code>linux</code> macro might be involved, preprocess your code to see what the compiler actually sees:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Preprocess only, output to stdout</span>
gcc -E test.c

<span class="hljs-comment"># Preprocess and save to a file</span>
gcc -E test.c -o test.i
</code></pre><p>Look at the output to see if <code>linux</code> has been replaced with <code>1</code>.</p>
<p>You can also add a check at the top of your file during debugging:</p>
<pre><code class="hljs language-c"><span class="hljs-meta">#<span class="hljs-keyword">ifdef</span> linux</span>
    <span class="hljs-meta">#<span class="hljs-keyword">warning</span> <span class="hljs-string">&quot;linux macro is defined!&quot;</span></span>
<span class="hljs-meta">#<span class="hljs-keyword">endif</span></span>
</code></pre><p>This will produce a warning during compilation if the macro is defined.</p>
<h2 id="h2-other-problematic-predefined-macros" class="group relative scroll-mt-24">
        <a href="#h2-other-problematic-predefined-macros" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Other Problematic Predefined Macros
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-other-problematic-predefined-macros"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>It&#39;s not just <code>linux</code> - there are other common words that get predefined:</p>
<pre><code class="hljs language-c"><span class="hljs-comment">// Other potentially problematic macros</span>
<span class="hljs-meta">#<span class="hljs-keyword">define</span> unix 1</span>
<span class="hljs-meta">#<span class="hljs-keyword">define</span> i386 1  <span class="hljs-comment">// On x86 systems</span></span>
<span class="hljs-meta">#<span class="hljs-keyword">define</span> arm 1   <span class="hljs-comment">// On ARM systems</span></span>
</code></pre><p>If you&#39;re writing portable code or library code, be aware of these. Use the standard <code>__linux__</code>, <code>__unix__</code>, <code>__i386__</code>, <code>__arm__</code> variants instead.</p>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To avoid problems with predefined macros:</p>
<ul>
<li>Use modern platform detection macros (<code>__linux__</code>, <code>__unix__</code>, etc.) instead of legacy ones</li>
<li>If you must use common words as identifiers, undefine problematic macros at the top of your file</li>
<li>Compile with strict standards flags (<code>-std=c99</code>, <code>-std=c11</code>) to disable non-standard extensions</li>
<li>Check preprocessor output (<code>gcc -E</code>) when debugging weird compilation errors</li>
<li>For library code, prefix your identifiers to avoid collisions (<code>mylib_linux</code> instead of <code>linux</code>)</li>
</ul>
<p>The <code>linux</code> macro is a historical artifact that modern C programmers need to be aware of. While it made sense in the 1970s, today it&#39;s mostly a source of confusion. Understanding why it exists and how to work around it will save you debugging time and help you write more portable code.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Docker Differs from a Virtual Machine (And Why It Matters)]]></title>
      <link>https://devops-daily.com/posts/how-docker-differs-from-a-virtual-machine</link>
      <description><![CDATA[Containers and virtual machines both isolate environments, but they work in very different ways. This guide explains the key differences and when to use each.]]></description>
      <pubDate>Sun, 18 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-docker-differs-from-a-virtual-machine</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Virtual Machines]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[Infrastructure]]></category>
      <content:encoded><![CDATA[<h2 id="h2-introduction" class="group relative scroll-mt-24">
        <a href="#h2-introduction" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Introduction
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-introduction"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re new to containerization or just wondering why everyone&#39;s talking about Docker, you might be asking: <em>Isn&#39;t this just a virtual machine in disguise?</em></p>
<p>Not quite.</p>
<p>Docker and virtual machines (VMs) both isolate environments to run software, but they do it in very different ways. Understanding how they differ helps you make better infrastructure decisions, especially when performance, portability, and simplicity are on the line.</p>
<p>In this guide, we&#39;ll compare Docker and VMs by looking at how they work, how they handle resources, and when to use one over the other.</p>
<hr>
<h2 id="h2-what-you39ll-need" class="group relative scroll-mt-24">
        <a href="#h2-what-you39ll-need" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What You&#39;ll Need
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-you39ll-need"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>No tools required to follow along, just basic knowledge of how applications run on Linux or cloud platforms. If you&#39;ve used Docker or a VM provider (like VirtualBox or AWS EC2), that&#39;s a plus.</p>
<hr>
<h2 id="h2-how-virtual-machines-work" class="group relative scroll-mt-24">
        <a href="#h2-how-virtual-machines-work" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How Virtual Machines Work
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-virtual-machines-work"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A virtual machine simulates a full physical machine. It includes:</p>
<ul>
<li>A <strong>hypervisor</strong> (like VirtualBox, VMware, or KVM) to run and manage VMs.</li>
<li>A <strong>guest OS</strong> inside each VM, often a full Linux or Windows distribution.</li>
<li><strong>Apps and dependencies</strong> installed inside the guest OS.</li>
</ul>
<p>Here&#39;s a simplified diagram of what a VM stack looks like:</p>
<pre><code>[ Hardware ]
     ↓
[ Host OS ]
     ↓
[ Hypervisor ]
     ↓
[ Guest OS ]
     ↓
[ App + Dependencies ]
</code></pre><p>Each VM behaves like a full server. That&#39;s powerful, but also heavy. Spinning up multiple VMs means duplicating operating systems, drivers, and system services, which eats up memory and CPU.</p>
<hr>
<h2 id="h2-how-docker-works" class="group relative scroll-mt-24">
        <a href="#h2-how-docker-works" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How Docker Works
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-docker-works"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Docker containers also isolate applications, but they share the host OS kernel instead of running their own.</p>
<p>Docker relies on:</p>
<ul>
<li>The <strong>Docker Engine</strong>, running on the host OS.</li>
<li><strong>Images</strong>, which define the container environment.</li>
<li><strong>Containers</strong>, which are running instances of those images.</li>
</ul>
<p>A container doesn&#39;t boot a full OS, it starts a process inside a lightweight environment that behaves like a tiny virtual server.</p>
<p>Here&#39;s how that looks:</p>
<pre><code>[ Hardware ]
     ↓
[ Host OS ]
     ↓
[ Docker Engine ]
     ↓
[ Container (App + Dependencies) ]
</code></pre><p>Because containers skip the guest OS, they&#39;re faster to start, smaller to ship, and easier to manage.</p>
<hr>
<h2 id="h2-key-differences-at-a-glance" class="group relative scroll-mt-24">
        <a href="#h2-key-differences-at-a-glance" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Differences at a Glance
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-differences-at-a-glance"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Feature</th>
<th>Virtual Machine</th>
<th>Docker Container</th>
</tr>
</thead>
<tbody><tr>
<td>OS Isolation</td>
<td>Full guest OS per VM</td>
<td>Shared host OS kernel</td>
</tr>
<tr>
<td>Resource Usage</td>
<td>High (multiple OS overhead)</td>
<td>Low (just processes + libs)</td>
</tr>
<tr>
<td>Startup Time</td>
<td>Minutes</td>
<td>Seconds or less</td>
</tr>
<tr>
<td>Portability</td>
<td>Lower (OS-specific configs)</td>
<td>High (runs the same everywhere)</td>
</tr>
<tr>
<td>Security Boundary</td>
<td>Stronger (hardware emulation)</td>
<td>Weaker (shared kernel risks)</td>
</tr>
<tr>
<td>Use Case Fit</td>
<td>Legacy apps, full isolation</td>
<td>Microservices, CI/CD, cloud-native apps</td>
</tr>
</tbody></table>
<hr>
<h2 id="h2-example-running-postgresql-on-both" class="group relative scroll-mt-24">
        <a href="#h2-example-running-postgresql-on-both" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Running PostgreSQL on Both
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-example-running-postgresql-on-both"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Let&#39;s say you want to run PostgreSQL locally.</p>
<h3 id="h3-with-a-virtual-machine" class="group relative scroll-mt-24">
        <a href="#h3-with-a-virtual-machine" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          With a Virtual Machine
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-with-a-virtual-machine"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You might:</p>
<ol>
<li>Spin up a VM using VirtualBox.</li>
<li>Install Ubuntu.</li>
<li>Install PostgreSQL inside it.</li>
<li>Open ports and configure networking.</li>
</ol>
<p>That&#39;s a decent approach if you&#39;re mimicking a production server, but it&#39;s resource-intensive and takes time to set up.</p>
<h3 id="h3-with-docker" class="group relative scroll-mt-24">
        <a href="#h3-with-docker" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          With Docker
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-with-docker"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can run the same database with:</p>
<pre><code class="hljs language-bash">docker run --name dev-postgres \
  -e POSTGRES_PASSWORD=devpass \
  -p 5432:5432 \
  -d postgres:15
</code></pre><p>This pulls the image, starts the database, and it&#39;s ready in seconds.</p>
<p>You get an isolated PostgreSQL environment without booting a whole OS, great for local development or testing.</p>
<hr>
<h2 id="h2-when-to-use-docker-vs-vms" class="group relative scroll-mt-24">
        <a href="#h2-when-to-use-docker-vs-vms" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to Use Docker vs. VMs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-to-use-docker-vs-vms"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Here&#39;s a general rule of thumb:</p>
<ul>
<li><strong>Use Docker</strong> for lightweight, fast, and scalable environments, especially for CI/CD, microservices, and local development.</li>
<li><strong>Use VMs</strong> when you need full OS-level isolation, stricter security boundaries, or when running apps that aren&#39;t container-friendly.</li>
</ul>
<p>There&#39;s also a middle ground: many teams run containers <strong>inside</strong> virtual machines for the best of both worlds. For example, running Docker on an EC2 VM or Kubernetes nodes managed via VMs.</p>
<hr>
<h2 id="h2-final-thoughts" class="group relative scroll-mt-24">
        <a href="#h2-final-thoughts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Final Thoughts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-final-thoughts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Docker and virtual machines both help you isolate and manage software, but they solve different problems.</p>
<p>Containers shine when speed and portability matter. VMs are better when you need full-system flexibility and stricter isolation.</p>
<p>Choosing between them isn&#39;t about which one is <em>better</em>, it&#39;s about using the right tool for the job.</p>
<p>Happy coding!</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Clone a Specific Git Branch]]></title>
      <link>https://devops-daily.com/posts/clone-specific-git-branch</link>
      <description><![CDATA[Need to clone just one branch instead of the entire repository? Learn how to clone a specific Git branch directly and save time and disk space.]]></description>
      <pubDate>Mon, 12 May 2025 08:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/clone-specific-git-branch</guid>
      <category><![CDATA[Git]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Git]]></category><category><![CDATA[Clone]]></category><category><![CDATA[Branches]]></category><category><![CDATA[Version Control]]></category><category><![CDATA[Workflows]]></category>
      <content:encoded><![CDATA[<p>When cloning a repository, Git downloads all branches by default, even though you only see the default branch checked out. For large repositories with many branches, this wastes time and disk space. If you only need to work with a specific branch, you can clone just that branch.</p>
<p><strong>TLDR:</strong> To clone a specific branch, use <code>git clone -b branch-name --single-branch repository-url</code>. This downloads only the specified branch and its history. For shallow clones with limited history, add <code>--depth 1</code> to the command.</p>
<p>In this guide, you&#39;ll learn how to clone specific branches efficiently and when to use different cloning strategies.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You&#39;ll need Git installed on your system and the URL of the repository you want to clone. Basic familiarity with Git branches and the clone command will help you understand the options.</p>
<h2 id="h2-cloning-a-specific-branch" class="group relative scroll-mt-24">
        <a href="#h2-cloning-a-specific-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning a Specific Branch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-a-specific-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To clone a specific branch directly:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone only the develop branch</span>
git <span class="hljs-built_in">clone</span> -b develop --single-branch https://github.com/username/repository.git

<span class="hljs-comment"># Clone only a feature branch</span>
git <span class="hljs-built_in">clone</span> -b feature-auth --single-branch https://github.com/username/repository.git
</code></pre><p>The <code>-b</code> flag specifies which branch to clone, and <code>--single-branch</code> tells Git to only fetch that branch&#39;s history. After cloning, you&#39;re checked out to the specified branch with only that branch in your local repository.</p>
<p>Verify what you cloned:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">cd</span> repository

<span class="hljs-comment"># Check current branch</span>
git branch

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># * develop</span>

<span class="hljs-comment"># See all branches including remote</span>
git branch -a

<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># * develop</span>
<span class="hljs-comment">#   remotes/origin/develop</span>
</code></pre><p>Notice that only the specified branch appears, not other branches from the repository.</p>
<h2 id="h2-shallow-clone-of-a-specific-branch" class="group relative scroll-mt-24">
        <a href="#h2-shallow-clone-of-a-specific-branch" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Shallow Clone of a Specific Branch
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-shallow-clone-of-a-specific-branch"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For even faster cloning, combine <code>--single-branch</code> with <code>--depth</code> to limit history:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone with only the latest commit</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch --depth 1 https://github.com/username/repository.git

<span class="hljs-comment"># Clone with the last 10 commits</span>
git <span class="hljs-built_in">clone</span> -b develop --depth 10 --single-branch https://github.com/username/repository.git
</code></pre><p>This approach downloads only the specified number of recent commits, dramatically reducing clone time and disk usage for large repositories.</p>
<p>Shallow clones are perfect for CI/CD pipelines or when you only need to build or test the latest code.</p>
<h2 id="h2-cloning-and-later-fetching-other-branches" class="group relative scroll-mt-24">
        <a href="#h2-cloning-and-later-fetching-other-branches" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning and Later Fetching Other Branches
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-and-later-fetching-other-branches"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you clone with <code>--single-branch</code> but later need other branches, you can fetch them:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone only main branch</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch https://github.com/username/repository.git
<span class="hljs-built_in">cd</span> repository

<span class="hljs-comment"># Later, configure to fetch all branches</span>
git config remote.origin.fetch <span class="hljs-string">&quot;+refs/heads/*:refs/remotes/origin/*&quot;</span>

<span class="hljs-comment"># Fetch all branches</span>
git fetch origin

<span class="hljs-comment"># Check out another branch</span>
git checkout develop
</code></pre><p>This gives you the initial speed benefit of single-branch cloning while maintaining flexibility for future work.</p>
<h2 id="h2-cloning-vs-checking-out-after-clone" class="group relative scroll-mt-24">
        <a href="#h2-cloning-vs-checking-out-after-clone" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning vs. Checking Out After Clone
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-vs-checking-out-after-clone"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>An alternative approach is to clone normally, then immediately switch to your desired branch:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone the repository (gets all branches)</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repository.git
<span class="hljs-built_in">cd</span> repository

<span class="hljs-comment"># Switch to the branch you want</span>
git checkout feature-auth
</code></pre><p>This method makes sense when:</p>
<ul>
<li>You&#39;ll likely need multiple branches</li>
<li>The repository is not large</li>
<li>You want full access to all branches from the start</li>
</ul>
<p>Compare the approaches:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Method 1: Clone specific branch (faster, less disk space)</span>
git <span class="hljs-built_in">clone</span> -b feature-auth --single-branch https://github.com/username/repo.git

<span class="hljs-comment"># Method 2: Clone all, then checkout (more complete, more flexible)</span>
git <span class="hljs-built_in">clone</span> https://github.com/username/repo.git &amp;&amp; <span class="hljs-built_in">cd</span> repo &amp;&amp; git checkout feature-auth
</code></pre><h2 id="h2-using-clone-with-a-custom-directory-name" class="group relative scroll-mt-24">
        <a href="#h2-using-clone-with-a-custom-directory-name" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Clone with a Custom Directory Name
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-clone-with-a-custom-directory-name"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Specify a directory name when cloning:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone into custom directory</span>
git <span class="hljs-built_in">clone</span> -b develop --single-branch https://github.com/username/repository.git my-project

<span class="hljs-built_in">cd</span> my-project
</code></pre><p>This is useful when you want to clone multiple branches into separate directories:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone main branch to one directory</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch https://github.com/username/repo.git repo-main

<span class="hljs-comment"># Clone develop branch to another directory</span>
git <span class="hljs-built_in">clone</span> -b develop --single-branch https://github.com/username/repo.git repo-develop
</code></pre><p>Now you can work on both branches simultaneously without switching.</p>
<h2 id="h2-cloning-non-default-branches" class="group relative scroll-mt-24">
        <a href="#h2-cloning-non-default-branches" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Non-Default Branches
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-non-default-branches"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When cloning a specific branch that is not the default, the syntax is the same:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone a feature branch</span>
git <span class="hljs-built_in">clone</span> -b feature/new-ui --single-branch https://github.com/username/repository.git

<span class="hljs-comment"># Clone a release branch</span>
git <span class="hljs-built_in">clone</span> -b release/v2.0 --single-branch https://github.com/username/repository.git
</code></pre><p>Git does not distinguish between default and non-default branches - any branch can be cloned directly.</p>
<h2 id="h2-converting-a-shallow-clone-to-full-clone" class="group relative scroll-mt-24">
        <a href="#h2-converting-a-shallow-clone-to-full-clone" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Converting a Shallow Clone to Full Clone
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-converting-a-shallow-clone-to-full-clone"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you cloned with <code>--depth</code> and later need the full history:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Fetch all history for current branch</span>
git fetch --unshallow

<span class="hljs-comment"># Now you have complete history</span>
git <span class="hljs-built_in">log</span> --oneline
</code></pre><p>The <code>--unshallow</code> flag converts your shallow clone to a full clone by downloading all missing commits.</p>
<h2 id="h2-adding-more-branches-to-single-branch-clone" class="group relative scroll-mt-24">
        <a href="#h2-adding-more-branches-to-single-branch-clone" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Adding More Branches to Single-Branch Clone
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-adding-more-branches-to-single-branch-clone"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After cloning with <code>--single-branch</code>, fetch specific additional branches:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone only main</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch https://github.com/username/repository.git
<span class="hljs-built_in">cd</span> repository

<span class="hljs-comment"># Fetch a specific branch</span>
git fetch origin develop:develop

<span class="hljs-comment"># Check out the newly fetched branch</span>
git checkout develop
</code></pre><p>This syntax (<code>origin develop:develop</code>) fetches the remote <code>develop</code> branch and creates a local branch with the same name.</p>
<h2 id="h2-cloning-tags" class="group relative scroll-mt-24">
        <a href="#h2-cloning-tags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Tags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-tags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can also clone specific tags:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone at a specific tag</span>
git <span class="hljs-built_in">clone</span> -b v1.0.0 --single-branch https://github.com/username/repository.git

<span class="hljs-comment"># Verify you&#x27;re at the tag</span>
git describe --tags
</code></pre><p>This is useful when you need to work with a specific release version.</p>
<h2 id="h2-using-git-clone-for-cicd" class="group relative scroll-mt-24">
        <a href="#h2-using-git-clone-for-cicd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using Git Clone for CI/CD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-git-clone-for-cicd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>In CI/CD pipelines, cloning specific branches with limited depth speeds up builds:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Fast clone for CI/CD</span>
git <span class="hljs-built_in">clone</span> -b <span class="hljs-variable">$BRANCH_NAME</span> --single-branch --depth 1 https://github.com/username/repo.git

<span class="hljs-comment"># Example in GitHub Actions workflow</span>
- uses: actions/checkout@v3
  with:
    ref: develop
    fetch-depth: 1
</code></pre><p>Most CI/CD systems provide optimized checkout actions that handle this automatically, but understanding the underlying Git commands helps when debugging or creating custom workflows.</p>
<h2 id="h2-checking-clone-configuration" class="group relative scroll-mt-24">
        <a href="#h2-checking-clone-configuration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking Clone Configuration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-checking-clone-configuration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>After cloning, verify your repository configuration:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># See remote configuration</span>
git remote -v

<span class="hljs-comment"># Check fetch configuration</span>
git config --get remote.origin.fetch

<span class="hljs-comment"># If single-branch was used, output is:</span>
<span class="hljs-comment"># +refs/heads/main:refs/remotes/origin/main</span>

<span class="hljs-comment"># For normal clones, output is:</span>
<span class="hljs-comment"># +refs/heads/*:refs/remotes/origin/*</span>
</code></pre><p>This shows whether you have a single-branch or multi-branch clone.</p>
<h2 id="h2-handling-protected-branches" class="group relative scroll-mt-24">
        <a href="#h2-handling-protected-branches" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Handling Protected Branches
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-handling-protected-branches"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When cloning protected branches (like main or master), you might need authentication:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone with HTTPS (prompts for credentials)</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch https://github.com/username/private-repo.git

<span class="hljs-comment"># Clone with SSH (uses SSH key)</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch git@github.com:username/private-repo.git
</code></pre><p>SSH cloning is faster and more secure for repositories you frequently access, as it uses SSH keys instead of passwords.</p>
<h2 id="h2-cloning-specific-branches-from-multiple-repositories" class="group relative scroll-mt-24">
        <a href="#h2-cloning-specific-branches-from-multiple-repositories" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cloning Specific Branches from Multiple Repositories
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cloning-specific-branches-from-multiple-repositories"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When working with microservices or multiple related repositories:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>

<span class="hljs-comment"># Clone specific branch from multiple repos</span>
repos=(
  <span class="hljs-string">&quot;frontend&quot;</span>
  <span class="hljs-string">&quot;backend&quot;</span>
  <span class="hljs-string">&quot;api-gateway&quot;</span>
)

<span class="hljs-keyword">for</span> repo <span class="hljs-keyword">in</span> <span class="hljs-string">&quot;<span class="hljs-variable">${repos[@]}</span>&quot;</span>; <span class="hljs-keyword">do</span>
  git <span class="hljs-built_in">clone</span> -b develop --single-branch \
    <span class="hljs-string">&quot;https://github.com/company/<span class="hljs-variable">$repo</span>.git&quot;</span> \
    <span class="hljs-string">&quot;<span class="hljs-variable">$repo</span>-develop&quot;</span>
<span class="hljs-keyword">done</span>
</code></pre><p>This script clones the develop branch from multiple repositories into separate directories.</p>
<h2 id="h2-sparse-checkout-for-partial-clones" class="group relative scroll-mt-24">
        <a href="#h2-sparse-checkout-for-partial-clones" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Sparse Checkout for Partial Clones
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-sparse-checkout-for-partial-clones"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For even more granular control, combine specific branch cloning with sparse checkout:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Clone specific branch</span>
git <span class="hljs-built_in">clone</span> -b main --single-branch --depth 1 https://github.com/username/repo.git
<span class="hljs-built_in">cd</span> repo

<span class="hljs-comment"># Enable sparse checkout</span>
git sparse-checkout init --cone

<span class="hljs-comment"># Only checkout specific directories</span>
git sparse-checkout <span class="hljs-built_in">set</span> src/app tests
</code></pre><p>This downloads only the specified branch and only checks out specific directories, perfect for monorepos where you only need a subset of the code.</p>
<p>Now you know how to clone specific Git branches efficiently. Using <code>-b</code> with <code>--single-branch</code> gives you fast, focused clones perfect for single-purpose work, CI/CD pipelines, or when working with large repositories where you only need one branch.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Copy Docker Images Between Hosts Without a Repository]]></title>
      <link>https://devops-daily.com/posts/copy-docker-images-between-hosts-withouta-repository</link>
      <description><![CDATA[Learn how to transfer Docker images directly between machines when a container registry is unavailable or impractical.]]></description>
      <pubDate>Sun, 04 May 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/copy-docker-images-between-hosts-withouta-repository</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Infrastructure]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<p>While using container registries like Docker Hub, Harbor, or AWS ECR is the standard way to distribute Docker images, sometimes you need to transfer images directly between hosts. This might be necessary in air-gapped environments, when bandwidth is limited, or when working with sensitive images that shouldn&#39;t be pushed to external services. This guide explains several methods to copy Docker images between machines without using a registry.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before you begin, make sure you have:</p>
<ul>
<li>Docker installed on both source and destination hosts</li>
<li>SSH access between hosts (for some methods)</li>
<li>Sufficient disk space on both machines</li>
<li>Administrator/root access or appropriate Docker permissions</li>
</ul>
<h2 id="h2-method-1-using-docker-save-and-docker-load" class="group relative scroll-mt-24">
        <a href="#h2-method-1-using-docker-save-and-docker-load" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Using docker save and docker load
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-1-using-docker-save-and-docker-load"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most straightforward approach uses Docker&#39;s built-in <code>save</code> and <code>load</code> commands.</p>
<h3 id="h3-step-1-save-the-image-to-a-tar-file-on-the-source-host" class="group relative scroll-mt-24">
        <a href="#h3-step-1-save-the-image-to-a-tar-file-on-the-source-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Save the image to a tar file on the source host
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-1-save-the-image-to-a-tar-file-on-the-source-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Save a single image</span>
docker save my-image:latest &gt; my-image.tar

<span class="hljs-comment"># Save multiple images to the same file</span>
docker save my-image:latest my-other-image:1.0 &gt; my-images.tar

<span class="hljs-comment"># Optional: compress the tar file (smaller but slower)</span>
docker save my-image:latest | gzip &gt; my-image.tar.gz
</code></pre><p>The <code>docker save</code> command preserves all image layers, tags, and history.</p>
<h3 id="h3-step-2-transfer-the-tar-file-to-the-destination-host" class="group relative scroll-mt-24">
        <a href="#h3-step-2-transfer-the-tar-file-to-the-destination-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Transfer the tar file to the destination host
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-2-transfer-the-tar-file-to-the-destination-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can use any file transfer method:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Using scp</span>
scp my-image.tar user@destination-host:/tmp/

<span class="hljs-comment"># Using rsync (more efficient for large files)</span>
rsync -avP my-image.tar user@destination-host:/tmp/
</code></pre><h3 id="h3-step-3-load-the-image-on-the-destination-host" class="group relative scroll-mt-24">
        <a href="#h3-step-3-load-the-image-on-the-destination-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Load the image on the destination host
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-3-load-the-image-on-the-destination-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Load from an uncompressed tar file</span>
docker load &lt; /tmp/my-image.tar

<span class="hljs-comment"># If you compressed the file with gzip</span>
gunzip -c /tmp/my-image.tar.gz | docker load
</code></pre><p>After loading, verify the image is available:</p>
<pre><code class="hljs language-bash">docker images
</code></pre><h2 id="h2-method-2-direct-transfer-via-ssh-pipe" class="group relative scroll-mt-24">
        <a href="#h2-method-2-direct-transfer-via-ssh-pipe" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: Direct Transfer via SSH Pipe
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-2-direct-transfer-via-ssh-pipe"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For a more efficient transfer without using intermediate storage, you can pipe the image directly through SSH:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On the source host, pipe directly to the destination</span>
docker save my-image:latest | ssh user@destination-host <span class="hljs-string">&#x27;docker load&#x27;</span>
</code></pre><p>This method:</p>
<ul>
<li>Avoids storing the tar file on either host</li>
<li>Transfers the image in a single operation</li>
<li>Requires stable SSH connectivity</li>
</ul>
<p>For large images, you can add compression:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># With compression</span>
docker save my-image:latest | gzip | ssh user@destination-host <span class="hljs-string">&#x27;gunzip | docker load&#x27;</span>
</code></pre><h2 id="h2-method-3-using-docker-export-and-docker-import" class="group relative scroll-mt-24">
        <a href="#h2-method-3-using-docker-export-and-docker-import" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 3: Using docker export and docker import
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-3-using-docker-export-and-docker-import"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>An alternative approach is to use <code>docker export</code> and <code>docker import</code>, which works with containers rather than images:</p>
<h3 id="h3-step-1-create-a-container-from-the-image-if-not-already-running" class="group relative scroll-mt-24">
        <a href="#h3-step-1-create-a-container-from-the-image-if-not-already-running" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Create a container from the image (if not already running)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-1-create-a-container-from-the-image-if-not-already-running"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker create --name temp-container my-image:latest
</code></pre><h3 id="h3-step-2-export-the-container-filesystem" class="group relative scroll-mt-24">
        <a href="#h3-step-2-export-the-container-filesystem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Export the container filesystem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-2-export-the-container-filesystem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker <span class="hljs-built_in">export</span> temp-container &gt; my-container.tar
</code></pre><h3 id="h3-step-3-transfer-the-tar-file-to-the-destination-host-as-in-method-1" class="group relative scroll-mt-24">
        <a href="#h3-step-3-transfer-the-tar-file-to-the-destination-host-as-in-method-1" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Transfer the tar file to the destination host (as in Method 1)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-3-transfer-the-tar-file-to-the-destination-host-as-in-method-1"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><h3 id="h3-step-4-import-the-container-on-the-destination" class="group relative scroll-mt-24">
        <a href="#h3-step-4-import-the-container-on-the-destination" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 4: Import the container on the destination
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-4-import-the-container-on-the-destination"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-built_in">cat</span> my-container.tar | docker import - my-image:latest
</code></pre><p><strong>Important differences from save/load:</strong></p>
<ul>
<li><code>export</code>/<code>import</code> flattens the image to a single layer</li>
<li>Image history and layer information is lost</li>
<li>Some metadata like environment variables, working directory, and exposed ports needs to be reconfigured</li>
</ul>
<h2 id="h2-method-4-using-external-storage" class="group relative scroll-mt-24">
        <a href="#h2-method-4-using-external-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 4: Using External Storage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-4-using-external-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For completely disconnected hosts or very large images, using external storage media might be the best option:</p>
<h3 id="h3-step-1-save-the-image-to-external-storage" class="group relative scroll-mt-24">
        <a href="#h3-step-1-save-the-image-to-external-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 1: Save the image to external storage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-1-save-the-image-to-external-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Save directly to an external drive</span>
docker save my-image:latest &gt; /mnt/usb-drive/my-image.tar

<span class="hljs-comment"># Split large images into smaller chunks</span>
docker save my-image:latest | <span class="hljs-built_in">split</span> -b 4G - /mnt/usb-drive/my-image.tar.part-
</code></pre><h3 id="h3-step-2-transport-the-external-storage-to-the-destination-host" class="group relative scroll-mt-24">
        <a href="#h3-step-2-transport-the-external-storage-to-the-destination-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 2: Transport the external storage to the destination host
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-2-transport-the-external-storage-to-the-destination-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><h3 id="h3-step-3-load-the-image-from-external-storage" class="group relative scroll-mt-24">
        <a href="#h3-step-3-load-the-image-from-external-storage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step 3: Load the image from external storage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-step-3-load-the-image-from-external-storage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Load a standard tar file</span>
docker load &lt; /mnt/usb-drive/my-image.tar

<span class="hljs-comment"># Reassemble and load split files</span>
<span class="hljs-built_in">cat</span> /mnt/usb-drive/my-image.tar.part-* | docker load
</code></pre><h2 id="h2-performance-optimization" class="group relative scroll-mt-24">
        <a href="#h2-performance-optimization" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Performance Optimization
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-performance-optimization"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When transferring large images, consider these optimizations:</p>
<h3 id="h3-check-image-size-before-transfer" class="group relative scroll-mt-24">
        <a href="#h3-check-image-size-before-transfer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Check image size before transfer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-check-image-size-before-transfer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker images --format <span class="hljs-string">&quot;{{.Repository}}:{{.Tag}} {{.Size}}&quot;</span> | grep my-image
</code></pre><h3 id="h3-use-compression-selectively" class="group relative scroll-mt-24">
        <a href="#h3-use-compression-selectively" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use compression selectively
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-compression-selectively"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Compression makes the transfer file smaller but requires CPU time:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># For better network efficiency (smaller file)</span>
docker save my-image:latest | gzip | ssh user@destination-host <span class="hljs-string">&#x27;gunzip | docker load&#x27;</span>

<span class="hljs-comment"># For faster local processing (no compression)</span>
docker save my-image:latest | ssh user@destination-host <span class="hljs-string">&#x27;docker load&#x27;</span>
</code></pre><h3 id="h3-remove-unnecessary-images-first" class="group relative scroll-mt-24">
        <a href="#h3-remove-unnecessary-images-first" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Remove unnecessary images first
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-remove-unnecessary-images-first"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Clean up both hosts to ensure adequate space:</p>
<pre><code class="hljs language-bash">docker system prune -a
</code></pre><h2 id="h2-practical-examples" class="group relative scroll-mt-24">
        <a href="#h2-practical-examples" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Examples
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-examples"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-example-1-transferring-a-database-image" class="group relative scroll-mt-24">
        <a href="#h3-example-1-transferring-a-database-image" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 1: Transferring a Database Image
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-1-transferring-a-database-image"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># On source host</span>
docker save postgres:14 | gzip &gt; postgres.tar.gz

<span class="hljs-comment"># Transfer the file</span>
scp postgres.tar.gz user@db-server:/tmp/

<span class="hljs-comment"># On destination host</span>
gunzip -c /tmp/postgres.tar.gz | docker load
</code></pre><h3 id="h3-example-2-moving-a-custom-application-image" class="group relative scroll-mt-24">
        <a href="#h3-example-2-moving-a-custom-application-image" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 2: Moving a Custom Application Image
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-2-moving-a-custom-application-image"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># On source host</span>
docker save mycompany/app:v1.2.3 | ssh user@production-server <span class="hljs-string">&#x27;docker load&#x27;</span>

<span class="hljs-comment"># Verify on destination</span>
ssh user@production-server <span class="hljs-string">&#x27;docker images mycompany/app&#x27;</span>
</code></pre><h3 id="h3-example-3-transferring-multiple-related-images" class="group relative scroll-mt-24">
        <a href="#h3-example-3-transferring-multiple-related-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 3: Transferring Multiple Related Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-3-transferring-multiple-related-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># On source host</span>
docker save myapp:latest myapp-db:latest myapp-cache:latest &gt; myapp-bundle.tar

<span class="hljs-comment"># Transfer and load</span>
rsync -avP myapp-bundle.tar user@destination:/tmp/
ssh user@destination <span class="hljs-string">&#x27;docker load &lt; /tmp/myapp-bundle.tar&#x27;</span>
</code></pre><h2 id="h2-troubleshooting-common-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-common-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Common Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-common-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-insufficient-disk-space" class="group relative scroll-mt-24">
        <a href="#h3-insufficient-disk-space" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Insufficient Disk Space
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-insufficient-disk-space"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When saving large images:</p>
<pre><code>no space left on device
</code></pre><p><strong>Solution</strong>: Use a different partition or streaming method:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check available space</span>
<span class="hljs-built_in">df</span> -h

<span class="hljs-comment"># Stream directly without saving to disk</span>
docker save my-image | ssh user@destination <span class="hljs-string">&#x27;docker load&#x27;</span>
</code></pre><h3 id="h3-corrupted-transfers" class="group relative scroll-mt-24">
        <a href="#h3-corrupted-transfers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Corrupted Transfers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-corrupted-transfers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you get image verification errors:</p>
<pre><code>open /var/lib/docker/.../layer.tar: no such file or directory
</code></pre><p><strong>Solution</strong>: Ensure the transfer is complete and try again with integrity checking:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On source, compute checksum</span>
<span class="hljs-built_in">sha256sum</span> my-image.tar &gt; my-image.tar.sha256

<span class="hljs-comment"># Transfer both files</span>
scp my-image.tar my-image.tar.sha256 user@destination:/tmp/

<span class="hljs-comment"># On destination, verify</span>
<span class="hljs-built_in">cd</span> /tmp &amp;&amp; <span class="hljs-built_in">sha256sum</span> -c my-image.tar.sha256
</code></pre><h3 id="h3-permission-issues" class="group relative scroll-mt-24">
        <a href="#h3-permission-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Permission Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-permission-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code>permission denied
</code></pre><p><strong>Solution</strong>: Check permissions and use sudo when necessary:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Ensure proper permissions</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chown</span> $(<span class="hljs-built_in">whoami</span>) my-image.tar
<span class="hljs-built_in">chmod</span> 644 my-image.tar

<span class="hljs-comment"># Or use sudo for the operation</span>
<span class="hljs-built_in">sudo</span> docker load &lt; my-image.tar
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-tag-images-properly-before-transfer" class="group relative scroll-mt-24">
        <a href="#h3-tag-images-properly-before-transfer" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Tag Images Properly Before Transfer
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tag-images-properly-before-transfer"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Ensure your images have clear tags before saving:</p>
<pre><code class="hljs language-bash">docker tag myimage:latest myimage:v1.2.3
docker save myimage:v1.2.3 &gt; myimage-v1.2.3.tar
</code></pre><h3 id="h3-document-image-dependencies" class="group relative scroll-mt-24">
        <a href="#h3-document-image-dependencies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Document Image Dependencies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-document-image-dependencies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For complex applications, document all required images:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a manifest file</span>
docker images --format <span class="hljs-string">&quot;{{.Repository}}:{{.Tag}}&quot;</span> | grep myapp &gt; image-manifest.txt

<span class="hljs-comment"># Save all listed images</span>
<span class="hljs-built_in">cat</span> image-manifest.txt | xargs docker save &gt; myapp-complete.tar
</code></pre><h3 id="h3-consider-using-docker-compose-for-related-images" class="group relative scroll-mt-24">
        <a href="#h3-consider-using-docker-compose-for-related-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Consider Using docker-compose for Related Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-consider-using-docker-compose-for-related-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For applications with multiple components, use docker-compose to ensure consistency:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># On source, save all images referenced in docker-compose.yml</span>
docker-compose config --services | xargs docker-compose pull
docker-compose config --services | xargs docker-compose images --format <span class="hljs-string">&quot;{{.Repository}}:{{.Tag}}&quot;</span> | <span class="hljs-built_in">sort</span> -u | xargs docker save &gt; application-bundle.tar
</code></pre><h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you know how to transfer Docker images between hosts without a registry, you might want to explore:</p>
<ul>
<li>Setting up a private Docker registry for more permanent solutions</li>
<li>Creating image optimization strategies to reduce transfer sizes</li>
<li>Automating image transfers using scripts or CI/CD pipelines</li>
<li>Implementing proper image versioning and tagging strategies</li>
</ul>
<p>Happy containerizing!</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Why SCTP Is Not Widely Used Despite Its Technical Advantages]]></title>
      <link>https://devops-daily.com/posts/why-sctp-is-not-widely-used</link>
      <description><![CDATA[Explore why Stream Control Transmission Protocol (SCTP) remains niche despite offering features that improve on both TCP and UDP, including NAT issues, lack of OS support, and ecosystem inertia.]]></description>
      <pubDate>Sat, 03 May 2025 11:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/why-sctp-is-not-widely-used</guid>
      <category><![CDATA[Networking]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Networking]]></category><category><![CDATA[SCTP]]></category><category><![CDATA[TCP]]></category><category><![CDATA[UDP]]></category><category><![CDATA[Protocols]]></category>
      <content:encoded><![CDATA[<p><strong>TLDR:</strong> SCTP (Stream Control Transmission Protocol) offers technical improvements over TCP - multi-streaming, multi-homing, and message boundaries - but remains niche due to poor NAT traversal, limited OS support, lack of programming language libraries, and the massive installed base of TCP/UDP infrastructure. Most applications that need SCTP&#39;s features work around TCP&#39;s limitations instead of adopting a new protocol.</p>
<p>SCTP is standardized, technically sound, and solves real problems that TCP and UDP have. Yet if you look at internet traffic, SCTP barely registers. It&#39;s primarily used in telecom (SS7 signaling) and some specialized applications. Here&#39;s why a protocol with clear advantages hasn&#39;t gained wider adoption.</p>
<h2 id="h2-what-sctp-offers" class="group relative scroll-mt-24">
        <a href="#h2-what-sctp-offers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What SCTP Offers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-sctp-offers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>SCTP was designed to combine the best features of TCP and UDP while adding new capabilities:</p>
<h3 id="h3-multi-streaming" class="group relative scroll-mt-24">
        <a href="#h3-multi-streaming" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Multi-Streaming
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multi-streaming"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>TCP has head-of-line blocking - if packet 5 is lost, packets 6-10 must wait even if they arrived successfully. SCTP allows multiple independent streams within one association:</p>
<pre><code>TCP:
Stream: [1][2][3][X][5][6][7]
        └─────┘    └─ Waiting for packet 4

SCTP:
Stream 1: [1][2][3][X][5][6][7]  &lt;- Blocked waiting for packet 4
Stream 2: [1][2][3][4][5][6][7]  &lt;- Continues independently
Stream 3: [1][2][3][4][5][6][7]  &lt;- Not affected
</code></pre><p>For applications like video conferencing (audio + video + data channels), this is valuable. If a video frame is lost, audio can continue without delay.</p>
<h3 id="h3-multi-homing" class="group relative scroll-mt-24">
        <a href="#h3-multi-homing" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Multi-Homing
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-multi-homing"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SCTP can bind to multiple IP addresses simultaneously. If one path fails, it automatically switches to another:</p>
<pre><code>Client                          Server
IP1: 192.168.1.10              IP1: 10.0.0.5
IP2: 10.50.20.15               IP2: 172.16.0.10

Normal path: 192.168.1.10 ←→ 10.0.0.5
Failover:    10.50.20.15  ←→ 172.16.0.10

# If primary path fails, SCTP automatically uses backup
</code></pre><p>This built-in redundancy is perfect for high-availability systems, but you can achieve similar results with TCP and load balancers.</p>
<h3 id="h3-message-boundaries" class="group relative scroll-mt-24">
        <a href="#h3-message-boundaries" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Message Boundaries
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-message-boundaries"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>UDP preserves message boundaries but is unreliable. TCP is reliable but treats data as a byte stream. SCTP gives you both:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># TCP: No message boundaries</span>
send(<span class="hljs-string">&quot;Hello&quot;</span>)
send(<span class="hljs-string">&quot;World&quot;</span>)
<span class="hljs-comment"># Receiver might get: &quot;HelloWorld&quot; or &quot;Hel&quot; + &quot;loWorld&quot; or any split</span>

<span class="hljs-comment"># UDP: Message boundaries preserved but unreliable</span>
send(<span class="hljs-string">&quot;Hello&quot;</span>)  <span class="hljs-comment"># Might arrive</span>
send(<span class="hljs-string">&quot;World&quot;</span>)  <span class="hljs-comment"># Might be lost</span>

<span class="hljs-comment"># SCTP: Message boundaries + reliability</span>
send(<span class="hljs-string">&quot;Hello&quot;</span>)  <span class="hljs-comment"># Arrives as &quot;Hello&quot;</span>
send(<span class="hljs-string">&quot;World&quot;</span>)  <span class="hljs-comment"># Arrives as &quot;World&quot; or is retransmitted until it does</span>
</code></pre><p>This eliminates the need for framing protocols on top of TCP.</p>
<h3 id="h3-built-in-security" class="group relative scroll-mt-24">
        <a href="#h3-built-in-security" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Built-in Security
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-built-in-security"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SCTP includes features to prevent SYN flood attacks and provides better protection against connection hijacking compared to TCP.</p>
<h2 id="h2-why-it39s-not-widely-adopted" class="group relative scroll-mt-24">
        <a href="#h2-why-it39s-not-widely-adopted" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why It&#39;s Not Widely Adopted
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-it39s-not-widely-adopted"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Despite these features, SCTP faces significant barriers:</p>
<h3 id="h3-nat-traversal-problems" class="group relative scroll-mt-24">
        <a href="#h3-nat-traversal-problems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          NAT Traversal Problems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-nat-traversal-problems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Network Address Translation (NAT) is everywhere - home routers, corporate firewalls, cloud load balancers. NAT devices are designed for TCP and UDP, and many don&#39;t understand SCTP:</p>
<pre><code>Client (behind NAT)      NAT Router         Server
     |                       |                 |
     |--SCTP INIT-----------&gt;|                 |
     |                       X (dropped)       |

NAT doesn&#x27;t know how to:
- Track SCTP connections
- Map SCTP ports correctly
- Handle multi-homing
- Process SCTP checksums
</code></pre><p>SCTP packets often get dropped by middleboxes that don&#39;t recognize protocol number 132 (SCTP&#39;s IP protocol number). TCP is protocol 6, UDP is 17 - these are hardcoded into countless devices.</p>
<p>Some firewalls explicitly block unknown protocols:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Typical firewall default rules</span>
iptables -A INPUT -p tcp -j ACCEPT_CHAIN
iptables -A INPUT -p udp -j ACCEPT_CHAIN
iptables -A INPUT -p icmp -j ACCEPT_CHAIN
iptables -A INPUT -j DROP  <span class="hljs-comment"># Drops SCTP and other protocols</span>
</code></pre><h3 id="h3-limited-operating-system-support" class="group relative scroll-mt-24">
        <a href="#h3-limited-operating-system-support" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Limited Operating System Support
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-limited-operating-system-support"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>While SCTP is in the Linux kernel and available on FreeBSD, support elsewhere is poor:</p>
<pre><code>Operating System    Native SCTP Support
------------------  -------------------
Linux              Yes (since 2.6)
FreeBSD            Yes
Windows            No (third-party libraries exist)
macOS              No (removed in recent versions)
iOS/Android        No native support
</code></pre><p>On Windows, you need third-party libraries or user-space implementations, which defeats the performance benefits. macOS had SCTP support but removed it, signaling Apple&#39;s lack of interest.</p>
<h3 id="h3-lack-of-language-and-framework-support" class="group relative scroll-mt-24">
        <a href="#h3-lack-of-language-and-framework-support" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Lack of Language and Framework Support
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-lack-of-language-and-framework-support"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Most programming languages don&#39;t have first-class SCTP support:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># Python - TCP is built-in</span>
<span class="hljs-keyword">import</span> socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  <span class="hljs-comment"># Easy</span>

<span class="hljs-comment"># Python - SCTP requires external library</span>
<span class="hljs-comment"># pip install pysctp</span>
<span class="hljs-keyword">import</span> sctp
sock = sctp.sctpsocket_tcp(socket.AF_INET)  <span class="hljs-comment"># Less obvious</span>

<span class="hljs-comment"># JavaScript/Node.js - No SCTP support at all</span>
<span class="hljs-comment"># Go - No standard library SCTP support</span>
<span class="hljs-comment"># Rust - Third-party crates only</span>
</code></pre><p>Compare this to TCP, which has excellent support everywhere:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// Node.js TCP</span>
<span class="hljs-keyword">const</span> net = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#x27;net&#x27;</span>);
<span class="hljs-keyword">const</span> server = net.<span class="hljs-title function_">createServer</span>(<span class="hljs-function">(<span class="hljs-params">socket</span>) =&gt;</span> {
    socket.<span class="hljs-title function_">write</span>(<span class="hljs-string">&#x27;Hello\n&#x27;</span>);
});
server.<span class="hljs-title function_">listen</span>(<span class="hljs-number">8080</span>);

<span class="hljs-comment">// Node.js SCTP - doesn&#x27;t exist in standard library</span>
</code></pre><h3 id="h3-no-browser-support" class="group relative scroll-mt-24">
        <a href="#h3-no-browser-support" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          No Browser Support
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-no-browser-support"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Web browsers only support TCP (for HTTP/WebSocket) and UDP (for WebRTC). There&#39;s no way to use SCTP from browser JavaScript:</p>
<pre><code class="hljs language-javascript"><span class="hljs-comment">// These work:</span>
<span class="hljs-title function_">fetch</span>(<span class="hljs-string">&#x27;https://example.com&#x27;</span>)           <span class="hljs-comment">// TCP/TLS</span>
<span class="hljs-keyword">new</span> <span class="hljs-title class_">WebSocket</span>(<span class="hljs-string">&#x27;wss://example.com&#x27;</span>)      <span class="hljs-comment">// TCP/TLS</span>
<span class="hljs-keyword">new</span> <span class="hljs-title class_">RTCPeerConnection</span>()                 <span class="hljs-comment">// UDP (WebRTC)</span>

<span class="hljs-comment">// This doesn&#x27;t exist:</span>
<span class="hljs-keyword">new</span> <span class="hljs-title class_">SCTPConnection</span>()  <span class="hljs-comment">// No such API</span>
</code></pre><p>This kills SCTP for any web-based application, which is a huge portion of modern software.</p>
<h3 id="h3-ecosystem-and-tooling-gaps" class="group relative scroll-mt-24">
        <a href="#h3-ecosystem-and-tooling-gaps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Ecosystem and Tooling Gaps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-ecosystem-and-tooling-gaps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The developer ecosystem around TCP/UDP is massive. SCTP has almost nothing:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># TCP debugging tools</span>
tcpdump -i eth0 <span class="hljs-string">&#x27;tcp port 80&#x27;</span>     <span class="hljs-comment"># Packet capture</span>
netstat -an | grep ESTABLISHED     <span class="hljs-comment"># Connection monitoring</span>
ss -t                              <span class="hljs-comment"># Modern socket stats</span>
wireshark                          <span class="hljs-comment"># GUI packet analysis</span>

<span class="hljs-comment"># SCTP debugging</span>
tcpdump -i eth0 <span class="hljs-string">&#x27;sctp&#x27;</span>            <span class="hljs-comment"># Works but limited analysis</span>
<span class="hljs-comment"># Most tools don&#x27;t parse SCTP details well</span>
</code></pre><p>Load balancers, monitoring tools, and network management software are built for TCP/UDP. Adding SCTP support requires significant engineering effort that most vendors don&#39;t prioritize.</p>
<h3 id="h3-application-layer-workarounds" class="group relative scroll-mt-24">
        <a href="#h3-application-layer-workarounds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Application Layer Workarounds
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-application-layer-workarounds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Instead of adopting SCTP, applications work around TCP&#39;s limitations:</p>
<p><strong>Head-of-line blocking?</strong> Open multiple TCP connections:</p>
<pre><code class="hljs language-python"><span class="hljs-comment"># Instead of SCTP multi-streaming, use multiple TCP connections</span>
connections = [
    create_tcp_connection(server, port) <span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">3</span>)
]

<span class="hljs-comment"># Send different data types on different connections</span>
connections[<span class="hljs-number">0</span>].send(audio_data)   <span class="hljs-comment"># Audio stream</span>
connections[<span class="hljs-number">1</span>].send(video_data)   <span class="hljs-comment"># Video stream</span>
connections[<span class="hljs-number">2</span>].send(control_data) <span class="hljs-comment"># Control messages</span>
</code></pre><p>This is what HTTP/2 and HTTP/3 do - they multiplex streams over a single TCP connection (HTTP/2) or use QUIC over UDP (HTTP/3).</p>
<p><strong>Multi-homing?</strong> Use DNS failover or load balancers:</p>
<pre><code class="hljs language-yaml"><span class="hljs-comment"># DNS-based failover</span>
<span class="hljs-attr">server.example.com:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-number">10.0</span><span class="hljs-number">.0</span><span class="hljs-number">.5</span>   <span class="hljs-string">(primary)</span>
  <span class="hljs-bullet">-</span> <span class="hljs-number">10.0</span><span class="hljs-number">.0</span><span class="hljs-number">.6</span>   <span class="hljs-string">(backup)</span>

<span class="hljs-comment"># Client retries on failure - simulates multi-homing</span>
</code></pre><p><strong>Message boundaries?</strong> Add framing:</p>
<pre><code class="hljs language-python"><span class="hljs-keyword">import</span> struct

<span class="hljs-keyword">def</span> <span class="hljs-title function_">send_message</span>(<span class="hljs-params">sock, data</span>):
    <span class="hljs-string">&quot;&quot;&quot;Send length-prefixed message over TCP.&quot;&quot;&quot;</span>
    length = <span class="hljs-built_in">len</span>(data)
    sock.sendall(struct.pack(<span class="hljs-string">&#x27;!I&#x27;</span>, length))  <span class="hljs-comment"># 4-byte length</span>
    sock.sendall(data)

<span class="hljs-keyword">def</span> <span class="hljs-title function_">recv_message</span>(<span class="hljs-params">sock</span>):
    <span class="hljs-string">&quot;&quot;&quot;Receive length-prefixed message from TCP.&quot;&quot;&quot;</span>
    length_bytes = sock.recv(<span class="hljs-number">4</span>)
    length = struct.unpack(<span class="hljs-string">&#x27;!I&#x27;</span>, length_bytes)[<span class="hljs-number">0</span>]

    data = <span class="hljs-string">b&#x27;&#x27;</span>
    <span class="hljs-keyword">while</span> <span class="hljs-built_in">len</span>(data) &lt; length:
        chunk = sock.recv(length - <span class="hljs-built_in">len</span>(data))
        data += chunk

    <span class="hljs-keyword">return</span> data
</code></pre><p>These workarounds are well-understood, documented, and battle-tested. Why learn a new protocol when you can use familiar patterns?</p>
<h2 id="h2-where-sctp-is-actually-used" class="group relative scroll-mt-24">
        <a href="#h2-where-sctp-is-actually-used" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Where SCTP Is Actually Used
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-where-sctp-is-actually-used"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>SCTP isn&#39;t dead - it&#39;s used in specific niches:</p>
<h3 id="h3-telecom-signaling" class="group relative scroll-mt-24">
        <a href="#h3-telecom-signaling" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Telecom Signaling
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-telecom-signaling"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>SS7 (Signaling System 7) over IP uses SCTP for reliability and multi-homing:</p>
<pre><code>Phone Network Signaling:
Cell Tower ←→ [SCTP] ←→ Core Network ←→ [SCTP] ←→ Other Networks

SCTP provides:
- Reliable delivery of signaling messages
- Fast failover between redundant paths
- In-order delivery per stream
</code></pre><p>Telecom companies control their entire network stack and don&#39;t deal with consumer NAT devices, so SCTP works well here.</p>
<h3 id="h3-webrtc-data-channels" class="group relative scroll-mt-24">
        <a href="#h3-webrtc-data-channels" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          WebRTC Data Channels
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-webrtc-data-channels"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>WebRTC uses SCTP for data channels, but it&#39;s encapsulated inside UDP (via DTLS):</p>
<pre><code>WebRTC Stack:
Application Data
    ↓
SCTP (provides reliability, streams, message boundaries)
    ↓
DTLS (encryption)
    ↓
UDP (traverses NAT)
    ↓
Network
</code></pre><p>This &quot;SCTP over UDP&quot; tunneling solves the NAT traversal problem but adds complexity.</p>
<h3 id="h3-diameter-protocol" class="group relative scroll-mt-24">
        <a href="#h3-diameter-protocol" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Diameter Protocol
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-diameter-protocol"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The Diameter protocol (used in mobile networks for authentication and billing) can use SCTP for transport, taking advantage of multi-homing and failover.</p>
<h2 id="h2-could-sctp-still-succeed" class="group relative scroll-mt-24">
        <a href="#h2-could-sctp-still-succeed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Could SCTP Still Succeed?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-could-sctp-still-succeed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For SCTP to gain wider adoption, it would need:</p>
<ol>
<li><p><strong>Universal NAT support</strong> - Every home router and corporate firewall would need SCTP-aware NAT. This would take decades.</p>
</li>
<li><p><strong>Browser support</strong> - Chrome, Firefox, Safari would need to expose SCTP APIs to JavaScript. Unlikely given the focus on HTTP/3 and QUIC.</p>
</li>
<li><p><strong>Language support</strong> - Python, JavaScript, Go, Rust would need standard library SCTP support. Possible but requires champions.</p>
</li>
<li><p><strong>Cloud provider support</strong> - AWS, Azure, GCP would need to support SCTP in load balancers and security groups. Low priority for them.</p>
</li>
</ol>
<p>The reality is that QUIC (Quick UDP Internet Connections) is solving many of the same problems SCTP addressed, but it&#39;s doing so over UDP to avoid NAT issues:</p>
<pre><code>QUIC approach:
- Built on UDP (NAT-friendly)
- Implements reliability in user-space
- Adds multi-streaming
- Adds encryption by default
- Backed by Google/IETF

Result: HTTP/3 uses QUIC, not SCTP
</code></pre><p>QUIC shows that the industry prefers innovating on top of UDP rather than deploying new IP protocols.</p>
<h2 id="h2-practical-advice" class="group relative scroll-mt-24">
        <a href="#h2-practical-advice" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Advice
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-advice"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you&#39;re considering SCTP for a project:</p>
<p><strong>Use SCTP if:</strong></p>
<ul>
<li>You control the entire network (data center to data center)</li>
<li>You&#39;re in telecom/carrier space</li>
<li>You need multi-homing and your network supports it</li>
<li>You&#39;re working with existing SCTP infrastructure</li>
</ul>
<p><strong>Don&#39;t use SCTP if:</strong></p>
<ul>
<li>Your application needs to work across the public internet</li>
<li>You need browser support</li>
<li>You have to traverse NATs</li>
<li>You want wide language/framework support</li>
<li>You need rich tooling and debugging support</li>
</ul>
<p>For most applications, stick with TCP or UDP and use application-layer solutions for the features you need. SCTP is technically excellent but practically difficult in a world built for TCP and UDP.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Access a Docker Container's Shell]]></title>
      <link>https://devops-daily.com/posts/how-to-access-docker-container-shell</link>
      <description><![CDATA[Learn various ways to get shell access to your Docker containers for debugging, configuration, and maintenance tasks.]]></description>
      <pubDate>Sat, 03 May 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-access-docker-container-shell</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Debugging]]></category><category><![CDATA[Administration]]></category>
      <content:encoded><![CDATA[<p>Accessing a shell inside a Docker container is essential for debugging, configuration changes, or installing additional tools. Whether you need to check logs, modify files, or troubleshoot issues, getting terminal access lets you interact with your containerized applications directly. This guide shows you multiple ways to access a container&#39;s shell for different scenarios.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before you begin, make sure you have:</p>
<ul>
<li>Docker installed on your system</li>
<li>At least one Docker container running (or an image you can run)</li>
<li>Basic knowledge of shell commands</li>
</ul>
<h2 id="h2-method-1-using-docker-exec-for-running-containers" class="group relative scroll-mt-24">
        <a href="#h2-method-1-using-docker-exec-for-running-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Using docker exec for Running Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-1-using-docker-exec-for-running-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most common way to get shell access to a running container is with the <code>docker exec</code> command.</p>
<h3 id="h3-basic-syntax" class="group relative scroll-mt-24">
        <a href="#h3-basic-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it &lt;container_name_or_id&gt; &lt;shell&gt;
</code></pre><p>The <code>-it</code> flags are important:</p>
<ul>
<li><code>-i</code> keeps STDIN open (interactive)</li>
<li><code>-t</code> allocates a pseudo-TTY (terminal)</li>
</ul>
<h3 id="h3-getting-a-bash-shell" class="group relative scroll-mt-24">
        <a href="#h3-getting-a-bash-shell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Getting a Bash Shell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-getting-a-bash-shell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For most Linux-based containers that include bash:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it my-container bash
</code></pre><p>This drops you into a bash shell inside the running container, where you can run commands as if you were in a regular Linux environment.</p>
<h3 id="h3-using-sh-for-minimal-containers" class="group relative scroll-mt-24">
        <a href="#h3-using-sh-for-minimal-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using sh for Minimal Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-using-sh-for-minimal-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Many lightweight containers (like Alpine-based images) don&#39;t include bash but do have <code>sh</code>:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it my-alpine-container sh
</code></pre><h3 id="h3-one-off-commands-without-a-shell" class="group relative scroll-mt-24">
        <a href="#h3-one-off-commands-without-a-shell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          One-off Commands Without a Shell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-one-off-commands-without-a-shell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You don&#39;t always need a full shell. For quick checks, specify the command directly:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check container&#x27;s environment variables</span>
docker <span class="hljs-built_in">exec</span> -it my-container <span class="hljs-built_in">env</span>

<span class="hljs-comment"># View a specific file</span>
docker <span class="hljs-built_in">exec</span> -it my-container <span class="hljs-built_in">cat</span> /etc/nginx/nginx.conf
</code></pre><h2 id="h2-method-2-starting-a-new-container-with-shell-access" class="group relative scroll-mt-24">
        <a href="#h2-method-2-starting-a-new-container-with-shell-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: Starting a New Container with Shell Access
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-2-starting-a-new-container-with-shell-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If the container isn&#39;t running yet, you can start it with shell access directly.</p>
<h3 id="h3-run-a-container-with-interactive-shell" class="group relative scroll-mt-24">
        <a href="#h3-run-a-container-with-interactive-shell" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Run a Container with Interactive Shell
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-run-a-container-with-interactive-shell"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker run -it &lt;image_name&gt; &lt;shell&gt;
</code></pre><p>For example:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Start a Ubuntu container with bash</span>
docker run -it ubuntu bash

<span class="hljs-comment"># Start an Alpine container with sh</span>
docker run -it alpine sh
</code></pre><h3 id="h3-run-and-remove-containers-for-exploration" class="group relative scroll-mt-24">
        <a href="#h3-run-and-remove-containers-for-exploration" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Run and Remove Containers for Exploration
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-run-and-remove-containers-for-exploration"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you just want to explore an image, use the <code>--rm</code> flag to automatically remove the container on exit:</p>
<pre><code class="hljs language-bash">docker run --<span class="hljs-built_in">rm</span> -it nginx:alpine sh
</code></pre><p>This is useful for quick exploration without accumulating stopped containers.</p>
<h2 id="h2-method-3-accessing-running-containers-for-different-users" class="group relative scroll-mt-24">
        <a href="#h2-method-3-accessing-running-containers-for-different-users" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 3: Accessing Running Containers for Different Users
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-3-accessing-running-containers-for-different-users"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>By default, <code>docker exec</code> runs commands as the container&#39;s default user. To specify a different user:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Access as root</span>
docker <span class="hljs-built_in">exec</span> -it -u root my-container bash

<span class="hljs-comment"># Access as a specific user by ID</span>
docker <span class="hljs-built_in">exec</span> -it -u 1000 my-container bash
</code></pre><p>This is particularly useful for containers that run as non-root by default.</p>
<h2 id="h2-practical-examples" class="group relative scroll-mt-24">
        <a href="#h2-practical-examples" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Examples
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-examples"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-example-1-debugging-a-web-server" class="group relative scroll-mt-24">
        <a href="#h3-example-1-debugging-a-web-server" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 1: Debugging a Web Server
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-1-debugging-a-web-server"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your NGINX container isn&#39;t serving content correctly:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Access the container</span>
docker <span class="hljs-built_in">exec</span> -it my-nginx bash

<span class="hljs-comment"># Check configuration</span>
<span class="hljs-built_in">cat</span> /etc/nginx/conf.d/default.conf

<span class="hljs-comment"># Check logs</span>
<span class="hljs-built_in">tail</span> -f /var/log/nginx/error.log

<span class="hljs-comment"># Test configuration</span>
nginx -t
</code></pre><h3 id="h3-example-2-fixing-database-permissions" class="group relative scroll-mt-24">
        <a href="#h3-example-2-fixing-database-permissions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 2: Fixing Database Permissions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-2-fixing-database-permissions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For a PostgreSQL container with permission issues:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Access as postgres user</span>
docker <span class="hljs-built_in">exec</span> -it -u postgres my-db bash

<span class="hljs-comment"># Enter psql to check permissions</span>
psql

<span class="hljs-comment"># Or as root to fix system permissions</span>
docker <span class="hljs-built_in">exec</span> -it -u root my-db bash
<span class="hljs-built_in">chown</span> -R postgres:postgres /var/lib/postgresql/data
</code></pre><h3 id="h3-example-3-installing-tools-in-a-container" class="group relative scroll-mt-24">
        <a href="#h3-example-3-installing-tools-in-a-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 3: Installing Tools in a Container
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-3-installing-tools-in-a-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When you need to add debugging tools to a running container:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it my-container bash

<span class="hljs-comment"># On Debian/Ubuntu based containers</span>
apt-get update
apt-get install -y procps net-tools curl

<span class="hljs-comment"># On Alpine based containers</span>
apk add --no-cache procps net-tools curl
</code></pre><p>Remember that changes made this way don&#39;t persist when the container is removed. For permanent changes, update your Dockerfile.</p>
<h2 id="h2-working-with-different-container-types" class="group relative scroll-mt-24">
        <a href="#h2-working-with-different-container-types" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Working with Different Container Types
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-working-with-different-container-types"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-alpine-containers" class="group relative scroll-mt-24">
        <a href="#h3-alpine-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Alpine Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-alpine-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Alpine Linux keeps things minimal. It doesn&#39;t include bash by default:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># This might fail</span>
docker <span class="hljs-built_in">exec</span> -it alpine-container bash

<span class="hljs-comment"># Use sh instead</span>
docker <span class="hljs-built_in">exec</span> -it alpine-container sh

<span class="hljs-comment"># Or install bash first</span>
docker <span class="hljs-built_in">exec</span> -it alpine-container apk add --no-cache bash
docker <span class="hljs-built_in">exec</span> -it alpine-container bash
</code></pre><h3 id="h3-windows-containers" class="group relative scroll-mt-24">
        <a href="#h3-windows-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Windows Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-windows-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For Windows containers, use PowerShell:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it windows-container powershell
</code></pre><h3 id="h3-distroless-containers" class="group relative scroll-mt-24">
        <a href="#h3-distroless-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Distroless Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-distroless-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>&quot;Distroless&quot; images don&#39;t contain a shell at all. For these containers:</p>
<ol>
<li>Use <code>docker cp</code> to copy files in/out</li>
<li>Add a debug version with the same app but including a shell</li>
<li>Use a sidecar container for debugging</li>
</ol>
<h2 id="h2-common-issues-and-solutions" class="group relative scroll-mt-24">
        <a href="#h2-common-issues-and-solutions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Issues and Solutions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-issues-and-solutions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-no-shell-available" class="group relative scroll-mt-24">
        <a href="#h3-no-shell-available" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          No Shell Available
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-no-shell-available"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code>OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: &quot;bash&quot;: executable file not found in $PATH: unknown
</code></pre><p><strong>Solution</strong>: Try a different shell:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it my-container sh
</code></pre><h3 id="h3-tty-problems" class="group relative scroll-mt-24">
        <a href="#h3-tty-problems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TTY Problems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-tty-problems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code>the input device is not a TTY
</code></pre><p><strong>Solution</strong>: You might be running in a non-interactive environment. Remove the <code>-t</code> flag:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -i my-container sh
</code></pre><h3 id="h3-permission-denied" class="group relative scroll-mt-24">
        <a href="#h3-permission-denied" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Permission Denied
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-permission-denied"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code>Error response from daemon: unable to find user myuser
</code></pre><p><strong>Solution</strong>: Check if the user exists in the container or use a numeric user ID instead:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it -u 0 my-container bash  <span class="hljs-comment"># User ID 0 is root</span>
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-security-considerations" class="group relative scroll-mt-24">
        <a href="#h3-security-considerations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Security Considerations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-security-considerations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ol>
<li><strong>Avoid running as root</strong> unless necessary</li>
<li><strong>Don&#39;t leave debugging tools</strong> in production containers</li>
<li><strong>Consider read-only containers</strong> and only mount specific volumes as writable</li>
</ol>
<h3 id="h3-remember-container-ephemerality" class="group relative scroll-mt-24">
        <a href="#h3-remember-container-ephemerality" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Remember Container Ephemerality
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-remember-container-ephemerality"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Changes you make inside a container this way will be lost when the container is removed. For permanent changes:</p>
<ol>
<li><strong>Update your Dockerfile</strong> and rebuild</li>
<li><strong>Use config volumes</strong> for configuration files</li>
<li><strong>Use a docker-compose.override.yml</strong> for development-specific changes</li>
</ol>
<h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you can access your container shells, you might want to:</p>
<ul>
<li>Learn about container orchestration with Docker Compose or Kubernetes</li>
<li>Set up proper logging with volumes or log drivers</li>
<li>Create more optimized Docker images with multi-stage builds</li>
<li>Implement container health checks for better reliability</li>
</ul>
<p>Happy containerizing!</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Network Usage Top/Htop on Linux]]></title>
      <link>https://devops-daily.com/posts/network-usage-top-htop-on-linux</link>
      <description><![CDATA[Monitor real-time network bandwidth usage on Linux with tools like iftop, nethogs, nload, and bmon. Learn which processes are consuming bandwidth, track interface statistics, and identify network bottlenecks.]]></description>
      <pubDate>Sat, 03 May 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/network-usage-top-htop-on-linux</guid>
      <category><![CDATA[Linux]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Linux]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Monitoring]]></category><category><![CDATA[System Administration]]></category><category><![CDATA[Performance]]></category>
      <content:encoded><![CDATA[<p>While <code>top</code> and <code>htop</code> show CPU and memory usage, they don&#39;t display network bandwidth consumption. When you need to see which processes are using network bandwidth, which connections are active, or how much data is flowing through your network interfaces, Linux offers several specialized tools that provide real-time network monitoring similar to how top works for system resources.</p>
<p>This guide covers the best tools for monitoring network usage on Linux, from simple interface statistics to process-level bandwidth tracking.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use <code>nethogs</code> to see bandwidth usage per process (like htop for network). Use <code>iftop</code> to see bandwidth usage per connection. Use <code>nload</code> for a simple interface bandwidth graph. Use <code>bmon</code> for multi-interface monitoring with graphs. Install with your package manager: <code>sudo apt install nethogs iftop nload bmon</code>.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You need Linux with root access to install monitoring tools and capture network traffic. Basic command-line familiarity helps you interpret the output.</p>
<h2 id="h2-iftop-monitor-bandwidth-by-connection" class="group relative scroll-mt-24">
        <a href="#h2-iftop-monitor-bandwidth-by-connection" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          iftop: Monitor Bandwidth by Connection
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iftop-monitor-bandwidth-by-connection"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>iftop shows network usage between your system and remote hosts, similar to how <code>top</code> shows process usage.</p>
<h3 id="h3-installation" class="group relative scroll-mt-24">
        <a href="#h3-installation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install iftop

<span class="hljs-comment"># Red Hat/CentOS/Fedora</span>
<span class="hljs-built_in">sudo</span> yum install iftop

<span class="hljs-comment"># Arch Linux</span>
<span class="hljs-built_in">sudo</span> pacman -S iftop
</code></pre><h3 id="h3-basic-usage" class="group relative scroll-mt-24">
        <a href="#h3-basic-usage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Usage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-usage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Run with sudo (required for packet capture):</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> iftop
</code></pre><p>Output shows connections in real-time:</p>
<pre><code>                 12.5Kb        25.0Kb       37.5Kb        50.0Kb
└────────────────┴─────────────┴────────────────┴─────────────
192.168.1.100  =&gt; api.example.com       5.12Kb  3.24Kb  2.18Kb
              &lt;=                        15.2Kb  12.8Kb  10.4Kb

192.168.1.100  =&gt; cdn.cloudflare.com    1.05Mb  980Kb   750Kb
              &lt;=                        125Kb   98.5Kb  87.2Kb
</code></pre><p>The arrows show traffic direction:</p>
<ul>
<li><code>=&gt;</code> outgoing traffic</li>
<li><code>&lt;=</code> incoming traffic</li>
</ul>
<p>The three columns show bandwidth over 2, 10, and 40 second averages.</p>
<h3 id="h3-useful-options" class="group relative scroll-mt-24">
        <a href="#h3-useful-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Useful Options
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-useful-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Monitor specific interface</span>
<span class="hljs-built_in">sudo</span> iftop -i eth0

<span class="hljs-comment"># Show port numbers instead of service names</span>
<span class="hljs-built_in">sudo</span> iftop -n

<span class="hljs-comment"># Don&#x27;t resolve hostnames (faster)</span>
<span class="hljs-built_in">sudo</span> iftop -N

<span class="hljs-comment"># Show cumulative bandwidth totals</span>
<span class="hljs-built_in">sudo</span> iftop -t

<span class="hljs-comment"># Filter by network</span>
<span class="hljs-built_in">sudo</span> iftop -F 192.168.1.0/24
</code></pre><h3 id="h3-interactive-commands" class="group relative scroll-mt-24">
        <a href="#h3-interactive-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Interactive Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-interactive-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>While iftop is running, press:</p>
<ul>
<li><code>t</code>: Toggle display mode (one line per connection vs two)</li>
<li><code>n</code>: Toggle name resolution</li>
<li><code>p</code>: Show port numbers</li>
<li><code>P</code>: Pause display</li>
<li><code>q</code>: Quit</li>
<li><code>h</code>: Help</li>
</ul>
<h2 id="h2-nethogs-monitor-bandwidth-by-process" class="group relative scroll-mt-24">
        <a href="#h2-nethogs-monitor-bandwidth-by-process" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          nethogs: Monitor Bandwidth by Process
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-nethogs-monitor-bandwidth-by-process"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>nethogs shows which processes are using bandwidth, grouping traffic by application.</p>
<h3 id="h3-installation" class="group relative scroll-mt-24">
        <a href="#h3-installation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install nethogs

<span class="hljs-comment"># Red Hat/CentOS</span>
<span class="hljs-built_in">sudo</span> yum install nethogs

<span class="hljs-comment"># Arch Linux</span>
<span class="hljs-built_in">sudo</span> pacman -S nethogs
</code></pre><h3 id="h3-basic-usage" class="group relative scroll-mt-24">
        <a href="#h3-basic-usage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Usage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-usage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> nethogs
</code></pre><p>Output:</p>
<pre><code>NetHogs version 0.8.6

  PID USER     PROGRAM              DEV        SENT      RECEIVED
 2341 user     /usr/bin/firefox     eth0      125.45     1540.2  KB/sec
 5678 user     /usr/bin/spotify     eth0       45.12      102.5  KB/sec
 8901 user     sshd: user@pts/0     eth0        2.15        5.43 KB/sec
 1234 root     /usr/sbin/apache2    eth0        0.85      12.34  KB/sec

  TOTAL                                        173.57     1660.47 KB/sec
</code></pre><p>This shows exactly which programs are using bandwidth and how much.</p>
<h3 id="h3-useful-options" class="group relative scroll-mt-24">
        <a href="#h3-useful-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Useful Options
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-useful-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Monitor specific interface</span>
<span class="hljs-built_in">sudo</span> nethogs eth0

<span class="hljs-comment"># Set refresh rate (in seconds)</span>
<span class="hljs-built_in">sudo</span> nethogs -d 1

<span class="hljs-comment"># Trace mode (show total since start)</span>
<span class="hljs-built_in">sudo</span> nethogs -t

<span class="hljs-comment"># Monitor multiple interfaces</span>
<span class="hljs-built_in">sudo</span> nethogs eth0 wlan0
</code></pre><h2 id="h2-nload-visual-interface-bandwidth-monitor" class="group relative scroll-mt-24">
        <a href="#h2-nload-visual-interface-bandwidth-monitor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          nload: Visual Interface Bandwidth Monitor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-nload-visual-interface-bandwidth-monitor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>nload provides a simple visual graph of incoming and outgoing bandwidth.</p>
<h3 id="h3-installation" class="group relative scroll-mt-24">
        <a href="#h3-installation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install nload

<span class="hljs-comment"># Red Hat/CentOS</span>
<span class="hljs-built_in">sudo</span> yum install nload

<span class="hljs-comment"># Arch Linux</span>
<span class="hljs-built_in">sudo</span> pacman -S nload
</code></pre><h3 id="h3-basic-usage" class="group relative scroll-mt-24">
        <a href="#h3-basic-usage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Usage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-usage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">nload
</code></pre><p>Output shows ASCII graphs:</p>
<pre><code>Device eth0 [192.168.1.100] (1/2):
================================================================================
Incoming:




                                                    Curr: 1.05 MBit/s
                                                    Avg: 850.23 kBit/s
                                                    Min: 125.45 kBit/s
                                                    Max: 2.15 MBit/s
                                                    Ttl: 1.25 GB
Outgoing:




                                                    Curr: 250.45 kBit/s
                                                    Avg: 180.12 kBit/s
                                                    Min: 15.23 kBit/s
                                                    Max: 512.34 kBit/s
                                                    Ttl: 456.78 MB
</code></pre><h3 id="h3-useful-options" class="group relative scroll-mt-24">
        <a href="#h3-useful-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Useful Options
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-useful-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Monitor specific interface</span>
nload eth0

<span class="hljs-comment"># Monitor multiple interfaces (switch with arrow keys)</span>
nload eth0 wlan0

<span class="hljs-comment"># Set refresh interval in milliseconds</span>
nload -t 500

<span class="hljs-comment"># Set unit (default is adaptive)</span>
nload -u M  <span class="hljs-comment"># Show in MBit/s</span>
</code></pre><h3 id="h3-interactive-keys" class="group relative scroll-mt-24">
        <a href="#h3-interactive-keys" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Interactive Keys
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-interactive-keys"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>←</code> <code>→</code>: Switch between interfaces</li>
<li><code>↑</code> <code>↓</code>: Adjust graph scale</li>
<li><code>q</code>: Quit</li>
</ul>
<h2 id="h2-bmon-bandwidth-monitor-with-multiple-interfaces" class="group relative scroll-mt-24">
        <a href="#h2-bmon-bandwidth-monitor-with-multiple-interfaces" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          bmon: Bandwidth Monitor with Multiple Interfaces
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-bmon-bandwidth-monitor-with-multiple-interfaces"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>bmon provides detailed statistics with nice graphical output for multiple interfaces simultaneously.</p>
<h3 id="h3-installation" class="group relative scroll-mt-24">
        <a href="#h3-installation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install bmon

<span class="hljs-comment"># Red Hat/CentOS</span>
<span class="hljs-built_in">sudo</span> yum install bmon

<span class="hljs-comment"># Arch Linux</span>
<span class="hljs-built_in">sudo</span> pacman -S bmon
</code></pre><h3 id="h3-basic-usage" class="group relative scroll-mt-24">
        <a href="#h3-basic-usage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Usage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-usage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">bmon
</code></pre><p>Output shows interfaces with graphs:</p>
<pre><code> #   Interface                RX Rate         RX #     TX Rate         TX #
─────────────────────────────────────────────────────────────────────────────
 0   eth0                      1.05MBit        145      250KBit          89
                           (RX Bandwidth Graph)
     ▃▄▅▆▇█▇▆▅▄▃▂▁▁▂▃▄▅▆▇▇▆▅▄▃
                           (TX Bandwidth Graph)
     ▁▁▂▂▃▃▄▄▅▅▆▆▇▇▆▆▅▅▄▄▃▃▂▂

 1   wlan0                      45KBit          12       15KBit           8
</code></pre><h3 id="h3-useful-options" class="group relative scroll-mt-24">
        <a href="#h3-useful-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Useful Options
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-useful-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Show bits per second instead of bytes</span>
bmon -b

<span class="hljs-comment"># Set output mode</span>
bmon -o ascii        <span class="hljs-comment"># ASCII graphs</span>
bmon -o curses       <span class="hljs-comment"># Enhanced curses interface (default)</span>

<span class="hljs-comment"># Monitor specific interfaces</span>
bmon -p eth0,wlan0

<span class="hljs-comment"># Set update interval</span>
bmon -r 1000         <span class="hljs-comment"># Update every 1000ms</span>
</code></pre><h2 id="h2-iptraf-ng-interactive-ip-lan-monitor" class="group relative scroll-mt-24">
        <a href="#h2-iptraf-ng-interactive-ip-lan-monitor" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          iptraf-ng: Interactive IP LAN Monitor
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-iptraf-ng-interactive-ip-lan-monitor"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>iptraf-ng provides detailed statistics about IP traffic, including protocol breakdowns and TCP connection monitoring.</p>
<h3 id="h3-installation" class="group relative scroll-mt-24">
        <a href="#h3-installation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Debian/Ubuntu</span>
<span class="hljs-built_in">sudo</span> apt-get install iptraf-ng

<span class="hljs-comment"># Red Hat/CentOS</span>
<span class="hljs-built_in">sudo</span> yum install iptraf-ng
</code></pre><h3 id="h3-basic-usage" class="group relative scroll-mt-24">
        <a href="#h3-basic-usage" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Usage
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-usage"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> iptraf-ng
</code></pre><p>This opens a menu-driven interface:</p>
<pre><code>┌─────────────────────────────────────────────┐
│ IP traffic monitor                          │
│ General interface statistics                │
│ Detailed interface statistics               │
│ Statistical breakdowns...                   │
│   By packet size                            │
│   By TCP/UDP service                        │
│ LAN station monitor                         │
│ Filters...                                  │
│ Configure...                                │
│ Exit                                        │
└─────────────────────────────────────────────┘
</code></pre><p>Select &quot;IP traffic monitor&quot; and choose your interface to see real-time connection details.</p>
<h2 id="h2-vnstat-long-term-bandwidth-statistics" class="group relative scroll-mt-24">
        <a href="#h2-vnstat-long-term-bandwidth-statistics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          vnstat: Long-Term Bandwidth Statistics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-vnstat-long-term-bandwidth-statistics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>vnstat tracks network bandwidth over time (hours, days, months) rather than showing real-time data.</p>
<h3 id="h3-installation-and-setup" class="group relative scroll-mt-24">
        <a href="#h3-installation-and-setup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Installation and Setup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-installation-and-setup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Install vnstat</span>
<span class="hljs-built_in">sudo</span> apt-get install vnstat

<span class="hljs-comment"># Initialize database for interface</span>
<span class="hljs-built_in">sudo</span> vnstat -i eth0 --create

<span class="hljs-comment"># Start vnstat daemon</span>
<span class="hljs-built_in">sudo</span> systemctl start vnstat
<span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> vnstat
</code></pre><p>vnstat runs in the background, collecting statistics.</p>
<h3 id="h3-viewing-statistics" class="group relative scroll-mt-24">
        <a href="#h3-viewing-statistics" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Viewing Statistics
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-viewing-statistics"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Show summary</span>
vnstat

<span class="hljs-comment"># Show hourly stats</span>
vnstat -h

<span class="hljs-comment"># Show daily stats</span>
vnstat -d

<span class="hljs-comment"># Show monthly stats</span>
vnstat -m

<span class="hljs-comment"># Live bandwidth monitor</span>
vnstat -l
</code></pre><p>Example output:</p>
<pre><code> Database updated: 2025-05-03 10:15:23

   eth0 since 2025-01-01

          rx:  125.45 GiB      tx:  45.23 GiB      total:  170.68 GiB

                     rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
       yesterday    1.25 GiB |   450 MiB   |    1.68 GiB |   195.23 kbit/s
           today     450 MiB |   125 MiB   |     575 MiB |   125.45 kbit/s
     ------------------------+-------------+-------------+---------------
     estimated      1.12 GiB |   320 MiB   |    1.42 GiB |
</code></pre><h2 id="h2-combining-tools-for-complete-monitoring" class="group relative scroll-mt-24">
        <a href="#h2-combining-tools-for-complete-monitoring" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Combining Tools for Complete Monitoring
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-combining-tools-for-complete-monitoring"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Use different tools for different needs:</p>
<p><strong>Which process is using bandwidth?</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> nethogs
</code></pre><p><strong>Which remote host am I connected to?</strong></p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> iftop
</code></pre><p><strong>What&#39;s my total interface bandwidth?</strong></p>
<pre><code class="hljs language-bash">nload
</code></pre><p><strong>Long-term bandwidth trends?</strong></p>
<pre><code class="hljs language-bash">vnstat -d
</code></pre><h2 id="h2-creating-simple-bandwidth-alerts" class="group relative scroll-mt-24">
        <a href="#h2-creating-simple-bandwidth-alerts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Creating Simple Bandwidth Alerts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-creating-simple-bandwidth-alerts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Monitor bandwidth and alert if it exceeds a threshold:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-comment"># bandwidth_alert.sh</span>

INTERFACE=<span class="hljs-string">&quot;eth0&quot;</span>
THRESHOLD_MB=100

<span class="hljs-comment"># Get current bandwidth (MB received in last second)</span>
RX1=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/rx_bytes)
<span class="hljs-built_in">sleep</span> 1
RX2=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/rx_bytes)

<span class="hljs-comment"># Calculate bandwidth in MB/s</span>
BANDWIDTH=$(( (<span class="hljs-variable">$RX2</span> - <span class="hljs-variable">$RX1</span>) / <span class="hljs-number">1024</span> / <span class="hljs-number">1024</span> ))

<span class="hljs-keyword">if</span> [ <span class="hljs-variable">$BANDWIDTH</span> -gt <span class="hljs-variable">$THRESHOLD_MB</span> ]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;High bandwidth detected: <span class="hljs-variable">${BANDWIDTH}</span>MB/s&quot;</span>
    <span class="hljs-comment"># Send alert (email, Slack, etc.)</span>
<span class="hljs-keyword">fi</span>
</code></pre><p>Run this periodically with cron:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run every minute</span>
* * * * * /usr/local/bin/bandwidth_alert.sh
</code></pre><h2 id="h2-bandwidth-monitoring-in-scripts" class="group relative scroll-mt-24">
        <a href="#h2-bandwidth-monitoring-in-scripts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Bandwidth Monitoring in Scripts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-bandwidth-monitoring-in-scripts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Get interface statistics programmatically:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Read bytes received/transmitted</span>
<span class="hljs-built_in">cat</span> /sys/class/net/eth0/statistics/rx_bytes
<span class="hljs-built_in">cat</span> /sys/class/net/eth0/statistics/tx_bytes

<span class="hljs-comment"># Or use ip command</span>
ip -s <span class="hljs-built_in">link</span> show eth0
</code></pre><p>Example monitoring script:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>

INTERFACE=<span class="hljs-string">&quot;eth0&quot;</span>

<span class="hljs-keyword">while</span> <span class="hljs-literal">true</span>; <span class="hljs-keyword">do</span>
    RX1=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/rx_bytes)
    TX1=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/tx_bytes)

    <span class="hljs-built_in">sleep</span> 1

    RX2=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/rx_bytes)
    TX2=$(<span class="hljs-built_in">cat</span> /sys/class/net/<span class="hljs-variable">$INTERFACE</span>/statistics/tx_bytes)

    RX_RATE=$(( (<span class="hljs-variable">$RX2</span> - <span class="hljs-variable">$RX1</span>) / <span class="hljs-number">1024</span> ))
    TX_RATE=$(( (<span class="hljs-variable">$TX2</span> - <span class="hljs-variable">$TX1</span>) / <span class="hljs-number">1024</span> ))

    <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;RX: <span class="hljs-variable">${RX_RATE}</span>KB/s  TX: <span class="hljs-variable">${TX_RATE}</span>KB/s&quot;</span>
<span class="hljs-keyword">done</span>
</code></pre><h2 id="h2-troubleshooting-network-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-network-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Network Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-network-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-finding-bandwidth-hogs" class="group relative scroll-mt-24">
        <a href="#h3-finding-bandwidth-hogs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Finding Bandwidth Hogs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-finding-bandwidth-hogs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># See which process is using most bandwidth</span>
<span class="hljs-built_in">sudo</span> nethogs | <span class="hljs-built_in">head</span> -20

<span class="hljs-comment"># See which remote hosts are consuming bandwidth</span>
<span class="hljs-built_in">sudo</span> iftop -n
</code></pre><h3 id="h3-identifying-unusual-traffic" class="group relative scroll-mt-24">
        <a href="#h3-identifying-unusual-traffic" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Identifying Unusual Traffic
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-identifying-unusual-traffic"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Monitor for unexpected connections</span>
<span class="hljs-built_in">sudo</span> iftop -F your-network/24

<span class="hljs-comment"># Watch for high packet rates</span>
<span class="hljs-built_in">sudo</span> bmon
</code></pre><h3 id="h3-checking-interface-errors" class="group relative scroll-mt-24">
        <a href="#h3-checking-interface-errors" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Checking Interface Errors
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-checking-interface-errors"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># See error counts</span>
ip -s <span class="hljs-built_in">link</span> show eth0

<span class="hljs-comment"># Look for errors, drops, or overruns</span>
</code></pre><p>Output:</p>
<pre><code>eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt;
    RX: bytes  packets  errors  dropped overrun mcast
    125G       89M      0       45      0       12K
    TX: bytes  packets  errors  dropped carrier collsns
    45G        67M      0       0       0       0
</code></pre><p>Errors or dropped packets indicate network problems.</p>
<h2 id="h2-quick-reference" class="group relative scroll-mt-24">
        <a href="#h2-quick-reference" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Quick Reference
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-quick-reference"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><table>
<thead>
<tr>
<th>Tool</th>
<th>Best For</th>
<th>Installation</th>
</tr>
</thead>
<tbody><tr>
<td>nethogs</td>
<td>Per-process bandwidth</td>
<td><code>apt install nethogs</code></td>
</tr>
<tr>
<td>iftop</td>
<td>Per-connection bandwidth</td>
<td><code>apt install iftop</code></td>
</tr>
<tr>
<td>nload</td>
<td>Simple interface graphs</td>
<td><code>apt install nload</code></td>
</tr>
<tr>
<td>bmon</td>
<td>Multi-interface monitoring</td>
<td><code>apt install bmon</code></td>
</tr>
<tr>
<td>iptraf-ng</td>
<td>Detailed IP statistics</td>
<td><code>apt install iptraf-ng</code></td>
</tr>
<tr>
<td>vnstat</td>
<td>Historical bandwidth data</td>
<td><code>apt install vnstat</code></td>
</tr>
</tbody></table>
<p>Linux provides rich tools for monitoring network bandwidth at different levels - from per-process usage with nethogs to interface-level statistics with nload. Choose the right tool based on whether you need to identify which program is consuming bandwidth, monitor interface throughput, or track long-term usage trends. These tools are essential for troubleshooting network performance issues and understanding your system&#39;s network activity.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Docker: How to Use Bash with an Alpine Based Docker Image]]></title>
      <link>https://devops-daily.com/posts/docker-alpine-use-bash</link>
      <description><![CDATA[Want to use bash in your Alpine-based Docker container? Learn why Alpine uses sh by default, how to install bash, and best practices for interactive shells and scripts.]]></description>
      <pubDate>Sat, 03 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/docker-alpine-use-bash</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Alpine]]></category><category><![CDATA[Bash]]></category><category><![CDATA[Containers]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Alpine Linux images use <code>sh</code> (BusyBox shell) by default, not bash. To use bash, install it with <code>apk add --no-cache bash</code> in your Dockerfile or at runtime. Then you can run scripts or open an interactive bash shell as needed.</p>
<h2 id="h2-why-alpine-uses-sh-instead-of-bash" class="group relative scroll-mt-24">
        <a href="#h2-why-alpine-uses-sh-instead-of-bash" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Alpine Uses sh Instead of bash
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-alpine-uses-sh-instead-of-bash"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Alpine is designed to be lightweight and secure, so it ships with BusyBox&#39;s <code>sh</code> shell by default. This keeps images small, but means bash isn&#39;t available unless you add it yourself.</p>
<h2 id="h2-how-to-install-bash-in-an-alpine-container" class="group relative scroll-mt-24">
        <a href="#h2-how-to-install-bash-in-an-alpine-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Install bash in an Alpine Container
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-install-bash-in-an-alpine-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Add this line to your Dockerfile:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">RUN</span><span class="language-bash"> apk add --no-cache bash</span>
</code></pre><p><strong>Example Dockerfile:</strong></p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> alpine:<span class="hljs-number">3.20</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> apk add --no-cache bash</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;bash&quot;</span>]</span>
</code></pre><p>Or, for a one-off interactive session:</p>
<pre><code class="hljs language-zsh">docker run -it alpine:3.20 sh
<span class="hljs-comment"># Inside the container:</span>
apk add --no-cache bash
bash
</code></pre><h2 id="h2-running-scripts-with-bash" class="group relative scroll-mt-24">
        <a href="#h2-running-scripts-with-bash" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Running Scripts with bash
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-running-scripts-with-bash"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your script uses bash features (like arrays or advanced syntax), make sure to:</p>
<ul>
<li>Install bash as above</li>
<li>Use <code>#!/bin/bash</code> as the shebang in your script</li>
<li>Run the script with <code>bash script.sh</code> or make it executable</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Only install bash if you need it—stick with sh for simple scripts to keep images small</li>
<li>For multi-stage builds, install bash only in build stages if possible</li>
<li>Document the shell requirements for your scripts</li>
</ul>
<h2 id="h2-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>If you see <code>bash: not found</code>, install it with <code>apk add --no-cache bash</code></li>
<li>If your script fails with syntax errors, check the shebang and shell compatibility</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To use bash in Alpine-based Docker images, just install it with apk and use it as needed. This gives you access to familiar bash features while keeping your images lean and efficient.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Understanding the Difference Between CMD and ENTRYPOINT in Dockerfiles]]></title>
      <link>https://devops-daily.com/posts/difference-between-cmd-and-entrypoint-in-dockerfiles</link>
      <description><![CDATA[Learn how CMD and ENTRYPOINT instructions work, how they interact with each other, and when to use each one for more flexible Docker containers.]]></description>
      <pubDate>Fri, 02 May 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/difference-between-cmd-and-entrypoint-in-dockerfiles</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Dockerfile]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Best Practices]]></category>
      <content:encoded><![CDATA[<p>Understanding the difference between <code>CMD</code> and <code>ENTRYPOINT</code> instructions in a Dockerfile is crucial for creating flexible, usable Docker images. These instructions determine what process runs inside your container and how users can interact with it. This guide explains their differences, how they work together, and when to use each one.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before we begin, make sure you have:</p>
<ul>
<li>Docker installed on your system</li>
<li>Basic familiarity with Dockerfile syntax</li>
<li>Some experience running Docker containers</li>
</ul>
<h2 id="h2-basic-definitions" class="group relative scroll-mt-24">
        <a href="#h2-basic-definitions" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Definitions
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-basic-definitions"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>First, let&#39;s clarify what each instruction does:</p>
<ul>
<li><strong>CMD</strong>: Specifies the default command to run when starting a container</li>
<li><strong>ENTRYPOINT</strong>: Configures the container to run as an executable</li>
</ul>
<p>While they might seem to serve similar purposes, they behave quite differently and are often used together.</p>
<h2 id="h2-cmd-providing-default-commands" class="group relative scroll-mt-24">
        <a href="#h2-cmd-providing-default-commands" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CMD: Providing Default Commands
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cmd-providing-default-commands"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>CMD</code> instruction defines the default command and/or parameters that will be executed when the container runs without specifying a command.</p>
<h3 id="h3-cmd-syntax" class="group relative scroll-mt-24">
        <a href="#h3-cmd-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          CMD Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-cmd-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Docker supports three forms of CMD syntax:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Exec form (preferred)</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;executable&quot;</span>, <span class="hljs-string">&quot;param1&quot;</span>, <span class="hljs-string">&quot;param2&quot;</span>]</span>

<span class="hljs-comment"># As default parameters to ENTRYPOINT</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;param1&quot;</span>, <span class="hljs-string">&quot;param2&quot;</span>]</span>

<span class="hljs-comment"># Shell form</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> <span class="hljs-built_in">command</span> param1 param2</span>
</code></pre><p>The exec form is preferred because it starts the specified command directly, not wrapped in a shell, which allows for proper signal handling and process ID tracking.</p>
<h3 id="h3-basic-cmd-example" class="group relative scroll-mt-24">
        <a href="#h3-basic-cmd-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic CMD Example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-cmd-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span>

<span class="hljs-comment"># Set a default command to run</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;echo&quot;</span>, <span class="hljs-string">&quot;Hello from the container!&quot;</span>]</span>
</code></pre><p>When you run this container without specifying a command, it will output &quot;Hello from the container!&quot;:</p>
<pre><code class="hljs language-bash">docker run my-image
<span class="hljs-comment"># Output: Hello from the container!</span>
</code></pre><h3 id="h3-overriding-cmd" class="group relative scroll-mt-24">
        <a href="#h3-overriding-cmd" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Overriding CMD
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-overriding-cmd"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>The main characteristic of <code>CMD</code> is that it can be easily overridden. Any arguments you provide when running the container replace the <code>CMD</code> instruction entirely:</p>
<pre><code class="hljs language-bash">docker run my-image <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Different message&quot;</span>
<span class="hljs-comment"># Output: Different message</span>
</code></pre><p>In this example, the original <code>CMD</code> is completely ignored and replaced with <code>echo &quot;Different message&quot;</code>.</p>
<h2 id="h2-entrypoint-making-containers-behave-like-executables" class="group relative scroll-mt-24">
        <a href="#h2-entrypoint-making-containers-behave-like-executables" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ENTRYPOINT: Making Containers Behave Like Executables
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-entrypoint-making-containers-behave-like-executables"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>ENTRYPOINT</code> instruction configures a container to run as an executable. It&#39;s used when you want your container to behave like a command-line tool.</p>
<h3 id="h3-entrypoint-syntax" class="group relative scroll-mt-24">
        <a href="#h3-entrypoint-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          ENTRYPOINT Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-entrypoint-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Like <code>CMD</code>, ENTRYPOINT has two forms:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Exec form (preferred)</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;executable&quot;</span>, <span class="hljs-string">&quot;param1&quot;</span>, <span class="hljs-string">&quot;param2&quot;</span>]</span>

<span class="hljs-comment"># Shell form</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> <span class="hljs-built_in">command</span> param1 param2</span>
</code></pre><p>Again, the exec form is recommended for most use cases.</p>
<h3 id="h3-basic-entrypoint-example" class="group relative scroll-mt-24">
        <a href="#h3-basic-entrypoint-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic ENTRYPOINT Example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-entrypoint-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span>

<span class="hljs-comment"># Set the container&#x27;s main executable</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;echo&quot;</span>, <span class="hljs-string">&quot;Hello from&quot;</span>]</span>
</code></pre><p>When you run this container, the <code>ENTRYPOINT</code> command runs:</p>
<pre><code class="hljs language-bash">docker run my-image
<span class="hljs-comment"># Output: Hello from</span>
</code></pre><h3 id="h3-appending-commands-to-entrypoint" class="group relative scroll-mt-24">
        <a href="#h3-appending-commands-to-entrypoint" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Appending Commands to ENTRYPOINT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-appending-commands-to-entrypoint"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Unlike <code>CMD</code>, arguments passed when running the container are appended to the <code>ENTRYPOINT</code> command:</p>
<pre><code class="hljs language-bash">docker run my-image Docker World
<span class="hljs-comment"># Output: Hello from Docker World</span>
</code></pre><p>The words &quot;Docker World&quot; are added as arguments to the <code>echo</code> command defined in the <code>ENTRYPOINT</code>.</p>
<h3 id="h3-overriding-entrypoint" class="group relative scroll-mt-24">
        <a href="#h3-overriding-entrypoint" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Overriding ENTRYPOINT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-overriding-entrypoint"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you need to override the <code>ENTRYPOINT</code> defined in the Dockerfile, you can use the <code>--entrypoint</code> flag:</p>
<pre><code class="hljs language-bash">docker run --entrypoint <span class="hljs-built_in">ls</span> my-image -la
<span class="hljs-comment"># Output: (directory listing)</span>
</code></pre><p>This completely replaces the <code>ENTRYPOINT</code> with the <code>ls</code> command and passes <code>-la</code> as its arguments.</p>
<h2 id="h2-combining-cmd-and-entrypoint" class="group relative scroll-mt-24">
        <a href="#h2-combining-cmd-and-entrypoint" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Combining CMD and ENTRYPOINT
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-combining-cmd-and-entrypoint"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The real power comes when you use <code>CMD</code> and <code>ENTRYPOINT</code> together. The general pattern is:</p>
<ul>
<li><code>ENTRYPOINT</code>: defines the command that always runs</li>
<li><code>CMD</code>: provides default arguments that can be overridden</li>
</ul>
<h3 id="h3-how-they-work-together" class="group relative scroll-mt-24">
        <a href="#h3-how-they-work-together" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How They Work Together
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-how-they-work-together"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span>

<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;echo&quot;</span>, <span class="hljs-string">&quot;Hello&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;World&quot;</span>]</span>
</code></pre><p>When you run this container:</p>
<pre><code class="hljs language-bash">docker run my-image
<span class="hljs-comment"># Output: Hello World</span>
</code></pre><p>If you provide command-line arguments, they replace only the <code>CMD</code> part:</p>
<pre><code class="hljs language-bash">docker run my-image Docker Universe
<span class="hljs-comment"># Output: Hello Docker Universe</span>
</code></pre><p>This makes your containers more flexible while maintaining their core behavior.</p>
<h2 id="h2-practical-use-cases" class="group relative scroll-mt-24">
        <a href="#h2-practical-use-cases" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Use Cases
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-use-cases"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-use-case-1-cli-tools" class="group relative scroll-mt-24">
        <a href="#h3-use-case-1-cli-tools" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use Case 1: CLI Tools
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-case-1-cli-tools"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you&#39;re containerizing a command-line tool, use <code>ENTRYPOINT</code> to make the container behave like that tool:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.11</span>-slim

<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> requirements.txt .</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> pip install --no-cache-dir -r requirements.txt</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>

<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;python&quot;</span>, <span class="hljs-string">&quot;my-cli-tool.py&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;--help&quot;</span>]</span>
</code></pre><p>Users can run this container as if it were the CLI tool itself:</p>
<pre><code class="hljs language-bash">docker run my-cli-tool --input file.txt --output results.txt
</code></pre><h3 id="h3-use-case-2-configurable-services" class="group relative scroll-mt-24">
        <a href="#h3-use-case-2-configurable-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use Case 2: Configurable Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-case-2-configurable-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>When building service containers that need configuration options:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> node:<span class="hljs-number">18</span>-alpine

<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> package*.json ./</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> npm ci --only=production</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> . .</span>

<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;server.js&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;--port&quot;</span>, <span class="hljs-string">&quot;8080&quot;</span>]</span>
</code></pre><p>Users can run the service with default settings or override them:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run with default port</span>
docker run my-service

<span class="hljs-comment"># Run with custom port</span>
docker run my-service --port 3000
</code></pre><h3 id="h3-use-case-3-initialization-scripts" class="group relative scroll-mt-24">
        <a href="#h3-use-case-3-initialization-scripts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Use Case 3: Initialization Scripts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-use-case-3-initialization-scripts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>For containers that need initialization logic:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> postgres:<span class="hljs-number">14</span>

<span class="hljs-keyword">COPY</span><span class="language-bash"> ./init-db.sh /docker-entrypoint-initdb.d/</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;docker-entrypoint.sh&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;postgres&quot;</span>]</span>
</code></pre><p>The initialization script will always run because it&#39;s part of the image&#39;s entrypoint logic, but users can change how the database runs.</p>
<h2 id="h2-shell-form-vs-exec-form-important-differences" class="group relative scroll-mt-24">
        <a href="#h2-shell-form-vs-exec-form-important-differences" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Shell Form vs. Exec Form: Important Differences
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-shell-form-vs-exec-form-important-differences"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When using the shell form (<code>CMD command param1 param2</code>), Docker wraps your command in <code>/bin/sh -c</code>, which has several implications:</p>
<ol>
<li><strong>Process Handling</strong>: Your application runs as a subprocess of <code>/bin/sh</code>, not as PID 1</li>
<li><strong>Signal Handling</strong>: SIGTERM and other signals go to the shell, not your application</li>
<li><strong>Environment Variables</strong>: Shell form allows for environment variable expansion</li>
</ol>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Shell form with variable expansion</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Hello, <span class="hljs-variable">$NAME</span>&quot;</span></span>

<span class="hljs-comment"># Exec form doesn&#x27;t expand variables the same way</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;echo&quot;</span>, <span class="hljs-string">&quot;Hello, <span class="hljs-variable">$NAME</span>&quot;</span>]  <span class="hljs-comment"># $NAME will be treated literally</span></span>
</code></pre><p>For proper signal handling and to avoid unnecessary processes, the exec form is generally recommended.</p>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-use-entrypoint-for-the-main-command" class="group relative scroll-mt-24">
        <a href="#h3-1-use-entrypoint-for-the-main-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Use ENTRYPOINT for the Main Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-use-entrypoint-for-the-main-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Good: Fixed entrypoint with configurable parameters</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;nginx&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;-g&quot;</span>, <span class="hljs-string">&quot;daemon off;&quot;</span>]</span>
</code></pre><h3 id="h3-2-make-images-work-out-of-the-box" class="group relative scroll-mt-24">
        <a href="#h3-2-make-images-work-out-of-the-box" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Make Images Work Out of the Box
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-make-images-work-out-of-the-box"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Default command makes container usable immediately</span>
<span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.11</span>
<span class="hljs-keyword">COPY</span><span class="language-bash"> app.py /app/</span>
<span class="hljs-keyword">WORKDIR</span><span class="language-bash"> /app</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;python&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;app.py&quot;</span>]</span>
</code></pre><h3 id="h3-3-prefer-exec-form-over-shell-form" class="group relative scroll-mt-24">
        <a href="#h3-3-prefer-exec-form-over-shell-form" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Prefer Exec Form Over Shell Form
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-prefer-exec-form-over-shell-form"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Preferred: Exec form</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;node&quot;</span>, <span class="hljs-string">&quot;server.js&quot;</span>]</span>

<span class="hljs-comment"># Avoid: Shell form</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> node server.js</span>
</code></pre><h3 id="h3-4-include-health-checks-for-services" class="group relative scroll-mt-24">
        <a href="#h3-4-include-health-checks-for-services" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Include Health Checks for Services
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-include-health-checks-for-services"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> nginx:alpine
<span class="hljs-keyword">COPY</span><span class="language-bash"> nginx.conf /etc/nginx/nginx.conf</span>
<span class="hljs-keyword">HEALTHCHECK</span><span class="language-bash"> --interval=30s --<span class="hljs-built_in">timeout</span>=3s \
  CMD curl -f http://localhost/ || <span class="hljs-built_in">exit</span> 1</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;nginx&quot;</span>]</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;-g&quot;</span>, <span class="hljs-string">&quot;daemon off;&quot;</span>]</span>
</code></pre><h2 id="h2-troubleshooting-common-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-common-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Common Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-common-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-problem-container-exits-immediately" class="group relative scroll-mt-24">
        <a href="#h3-problem-container-exits-immediately" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Problem: Container Exits Immediately
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-problem-container-exits-immediately"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This often happens with the shell form of <code>ENTRYPOINT</code> or <code>CMD</code> when the specified command completes quickly:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># This will exit immediately</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;Hello World&quot;</span></span>
</code></pre><p><strong>Solution</strong>: For long-running services, ensure they stay in the foreground:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># This will keep the container running</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;nginx&quot;</span>, <span class="hljs-string">&quot;-g&quot;</span>, <span class="hljs-string">&quot;daemon off;&quot;</span>]</span>
</code></pre><h3 id="h3-problem-commands-not-found" class="group relative scroll-mt-24">
        <a href="#h3-problem-commands-not-found" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Problem: Commands Not Found
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-problem-commands-not-found"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker run my-image
<span class="hljs-comment"># /bin/sh: 1: my-command: not found</span>
</code></pre><p><strong>Solution</strong>: Check paths and ensure commands are available in the container:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># Use absolute paths when necessary</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;/usr/local/bin/my-command&quot;</span>]</span>

<span class="hljs-comment"># Or ensure your PATH is set properly</span>
<span class="hljs-keyword">ENV</span> PATH=<span class="hljs-string">&quot;/app/bin:${PATH}&quot;</span>
</code></pre><h3 id="h3-problem-arguments-not-working-as-expected" class="group relative scroll-mt-24">
        <a href="#h3-problem-arguments-not-working-as-expected" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Problem: Arguments Not Working as Expected
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-problem-arguments-not-working-as-expected"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker run my-image --config=/etc/myapp.conf
<span class="hljs-comment"># Error: Unknown option: --config=/etc/myapp.conf</span>
</code></pre><p><strong>Solution</strong>: Ensure your <code>ENTRYPOINT</code> script properly handles arguments:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">ENTRYPOINT</span><span class="language-bash"> [<span class="hljs-string">&quot;./entrypoint.sh&quot;</span>]</span>
</code></pre><p>With <code>entrypoint.sh</code>:</p>
<pre><code class="hljs language-bash"><span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-built_in">set</span> -e

<span class="hljs-comment"># Handle specific arguments or pass them through</span>
<span class="hljs-built_in">exec</span> myapp <span class="hljs-string">&quot;<span class="hljs-variable">$@</span>&quot;</span>
</code></pre><h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you understand how <code>CMD</code> and <code>ENTRYPOINT</code> work, you might want to:</p>
<ul>
<li>Review your existing Dockerfiles to apply these best practices</li>
<li>Create more user-friendly container interfaces</li>
<li>Explore Docker&#39;s init systems for better process management</li>
<li>Learn about multi-stage builds to optimize your Docker images</li>
</ul>
<p>Happy containerizing!</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Start a Stopped Docker Container with a Different Command]]></title>
      <link>https://devops-daily.com/posts/start-stopped-docker-container-different-command</link>
      <description><![CDATA[Need to run a different command in a stopped Docker container? Learn your options for changing the startup command, including docker commit, docker run --entrypoint, and best practices for debugging or recovery.]]></description>
      <pubDate>Fri, 02 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/start-stopped-docker-container-different-command</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Entrypoint]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can&#39;t directly change the command of a stopped Docker container when restarting it with <code>docker start</code>. Instead, create a new container from the same image with a different command or entrypoint. Use <code>docker run --entrypoint</code> or <code>docker commit</code> for advanced cases.</p>
<h2 id="h2-why-can39t-you-change-the-command-with-docker-start" class="group relative scroll-mt-24">
        <a href="#h2-why-can39t-you-change-the-command-with-docker-start" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Can&#39;t You Change the Command with docker start?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-can39t-you-change-the-command-with-docker-start"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you create a container with <code>docker run</code>, the command and entrypoint are set at creation. <code>docker start</code> always uses the original command—you can&#39;t override it for an existing container.</p>
<h2 id="h2-option-1-create-a-new-container-with-a-different-command" class="group relative scroll-mt-24">
        <a href="#h2-option-1-create-a-new-container-with-a-different-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 1: Create a New Container with a Different Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-option-1-create-a-new-container-with-a-different-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The most reliable way is to start a new container from the same image, specifying the new command:</p>
<pre><code class="hljs language-bash">docker run -it my-image /bin/bash
</code></pre><p>Or, to override the entrypoint:</p>
<pre><code class="hljs language-bash">docker run -it --entrypoint /bin/sh my-image
</code></pre><p>This gives you a fresh container with your chosen command.</p>
<h2 id="h2-option-2-use-docker-commit-to-save-changes-advanced" class="group relative scroll-mt-24">
        <a href="#h2-option-2-use-docker-commit-to-save-changes-advanced" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 2: Use docker commit to Save Changes (Advanced)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-option-2-use-docker-commit-to-save-changes-advanced"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you need to preserve changes made in the stopped container (like files or installed packages), you can commit it to a new image:</p>
<pre><code class="hljs language-bash">docker commit my-container my-temp-image
</code></pre><p>Then run a new container from that image with a different command:</p>
<pre><code class="hljs language-bash">docker run -it my-temp-image /bin/bash
</code></pre><h2 id="h2-option-3-use-docker-exec-for-running-containers" class="group relative scroll-mt-24">
        <a href="#h2-option-3-use-docker-exec-for-running-containers" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 3: Use docker exec for Running Containers
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-option-3-use-docker-exec-for-running-containers"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If the container is running, you can start a new process inside it:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it my-container /bin/bash
</code></pre><p>But this doesn&#39;t work if the container is stopped.</p>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Use <code>docker run</code> with a new command for most cases.</li>
<li>Use <code>docker commit</code> only if you need to preserve changes from the stopped container.</li>
<li>For debugging, override the entrypoint or command as needed.</li>
<li>Clean up old containers and images to avoid clutter.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can&#39;t change the command of a stopped Docker container when restarting it, but you can create a new container from the same image (or a committed image) with any command you need. This gives you flexibility for debugging, recovery, or running alternate workflows.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Copy Files from Docker Containers to the Host Machine]]></title>
      <link>https://devops-daily.com/posts/copy-files-from-docker-container-to-host</link>
      <description><![CDATA[Learn efficient ways to extract and retrieve files from your running or stopped Docker containers to your host filesystem.]]></description>
      <pubDate>Thu, 01 May 2025 10:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/copy-files-from-docker-container-to-host</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Containers]]></category><category><![CDATA[Data Management]]></category><category><![CDATA[File Transfer]]></category>
      <content:encoded><![CDATA[<p>When working with Docker containers, you&#39;ll often need to retrieve files generated or modified inside them. Whether you&#39;re extracting application logs, database dumps, or processed data, Docker provides several ways to copy files from containers to your host machine. This guide explores the different approaches and helps you choose the right one for your use case.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before proceeding, make sure you have:</p>
<ul>
<li>Docker installed on your system</li>
<li>Basic familiarity with Docker commands and concepts</li>
<li>Terminal or command prompt access on your host machine</li>
</ul>
<h2 id="h2-method-1-using-docker-cp-command" class="group relative scroll-mt-24">
        <a href="#h2-method-1-using-docker-cp-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Using docker cp Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-1-using-docker-cp-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>docker cp</code> command is the simplest and most direct way to copy files from a container to your host machine.</p>
<h3 id="h3-basic-syntax" class="group relative scroll-mt-24">
        <a href="#h3-basic-syntax" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Basic Syntax
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-basic-syntax"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash">docker <span class="hljs-built_in">cp</span> &lt;container_id_or_name&gt;:&lt;src_path&gt; &lt;dest_path&gt;
</code></pre><h3 id="h3-copying-a-single-file" class="group relative scroll-mt-24">
        <a href="#h3-copying-a-single-file" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Copying a Single File
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-copying-a-single-file"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To copy a specific file from a container to your current directory:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Copy a configuration file from a container</span>
docker <span class="hljs-built_in">cp</span> my-nginx:/etc/nginx/nginx.conf ./nginx.conf
</code></pre><p>This command copies the nginx.conf file from the container named &quot;my-nginx&quot; to your current directory.</p>
<h3 id="h3-copying-a-directory" class="group relative scroll-mt-24">
        <a href="#h3-copying-a-directory" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Copying a Directory
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-copying-a-directory"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>To copy an entire directory:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Copy the logs directory from a container to the host</span>
docker <span class="hljs-built_in">cp</span> my-app:/var/log/app ./container-logs
</code></pre><p>This recursively copies all contents from the container&#39;s <code>/var/log/app</code> directory to a local <code>container-logs</code> directory.</p>
<h3 id="h3-copying-from-a-stopped-container" class="group relative scroll-mt-24">
        <a href="#h3-copying-from-a-stopped-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Copying from a Stopped Container
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-copying-from-a-stopped-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>One advantage of <code>docker cp</code> is that it works with stopped containers too:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Copy data from a stopped container</span>
docker <span class="hljs-built_in">cp</span> crashed-app:/var/log/app/error.log ./crash-report.log
</code></pre><h2 id="h2-method-2-using-volumes-for-real-time-access" class="group relative scroll-mt-24">
        <a href="#h2-method-2-using-volumes-for-real-time-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: Using Volumes for Real-time Access
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-2-using-volumes-for-real-time-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>While not strictly a copying method, Docker volumes provide direct access to container files from the host, which is often more convenient for ongoing development.</p>
<h3 id="h3-creating-a-volume-mount" class="group relative scroll-mt-24">
        <a href="#h3-creating-a-volume-mount" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Creating a Volume Mount
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-creating-a-volume-mount"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Run a container with a volume mount</span>
docker run -d --name db-container -v $(<span class="hljs-built_in">pwd</span>)/data:/var/lib/postgresql/data postgres:14
</code></pre><p>With this approach, anything written to <code>/var/lib/postgresql/data</code> inside the container is automatically available in the <code>./data</code> directory on your host.</p>
<h3 id="h3-accessing-files-through-existing-volumes" class="group relative scroll-mt-24">
        <a href="#h3-accessing-files-through-existing-volumes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Accessing Files Through Existing Volumes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-accessing-files-through-existing-volumes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you already have a running container with volumes, you can find the volume mount information:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Inspect container volumes</span>
docker inspect -f <span class="hljs-string">&#x27;{{ .Mounts }}&#x27;</span> my-container
</code></pre><p>Then you can access the files directly through the volume mount path on your host system.</p>
<h2 id="h2-method-3-using-docker-export-for-complete-filesystem" class="group relative scroll-mt-24">
        <a href="#h2-method-3-using-docker-export-for-complete-filesystem" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 3: Using docker export for Complete Filesystem
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-3-using-docker-export-for-complete-filesystem"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you need to extract the entire filesystem from a container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Export the entire container filesystem to a tar archive</span>
docker <span class="hljs-built_in">export</span> my-container &gt; container-filesystem.tar

<span class="hljs-comment"># Extract specific files from the archive</span>
tar -xf container-filesystem.tar path/to/file

<span class="hljs-comment"># Or extract everything</span>
<span class="hljs-built_in">mkdir</span> container-extract
tar -xf container-filesystem.tar -C container-extract
</code></pre><p>This approach is useful for:</p>
<ul>
<li>Creating backups of container state</li>
<li>Analyzing the complete filesystem</li>
<li>Migrating container data between hosts</li>
</ul>
<h2 id="h2-method-4-using-docker-exec-with-tar" class="group relative scroll-mt-24">
        <a href="#h2-method-4-using-docker-exec-with-tar" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 4: Using docker exec with tar
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-4-using-docker-exec-with-tar"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For more control over the extraction process, you can combine <code>docker exec</code> with the <code>tar</code> command:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Create a tar archive inside the container and extract it on the host</span>
docker <span class="hljs-built_in">exec</span> my-container tar -cz -C /path/to/directory files | tar -xz -C ./destination
</code></pre><p>This method streams the files directly without needing temporary storage in the container, which is efficient for large files or systems with limited container disk space.</p>
<h3 id="h3-example-extracting-log-files" class="group relative scroll-mt-24">
        <a href="#h3-example-extracting-log-files" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example: Extracting Log Files
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-extracting-log-files"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Extract all log files from a container&#x27;s /var/log directory</span>
docker <span class="hljs-built_in">exec</span> web-app tar -cz -C /var/log . | tar -xz -C ./logs
</code></pre><h2 id="h2-method-5-using-docker-run-to-create-one-off-copies" class="group relative scroll-mt-24">
        <a href="#h2-method-5-using-docker-run-to-create-one-off-copies" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 5: Using docker run to Create One-off Copies
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-5-using-docker-run-to-create-one-off-copies"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For containers based on images you control, you can create a one-off container specifically to copy files:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Run a temporary container to copy data and remove it afterward</span>
docker run --<span class="hljs-built_in">rm</span> -v $(<span class="hljs-built_in">pwd</span>):/target my-image <span class="hljs-built_in">cp</span> -r /data/output /target
</code></pre><p>This pattern is useful in CI/CD pipelines where you need to extract build artifacts.</p>
<h2 id="h2-practical-examples" class="group relative scroll-mt-24">
        <a href="#h2-practical-examples" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Practical Examples
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-practical-examples"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-example-1-extracting-a-database-backup" class="group relative scroll-mt-24">
        <a href="#h3-example-1-extracting-a-database-backup" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 1: Extracting a Database Backup
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-1-extracting-a-database-backup"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Create a PostgreSQL dump and copy it to the host</span>
docker <span class="hljs-built_in">exec</span> postgres-db pg_dump -U postgres mydatabase &gt; mydatabase.sql
</code></pre><h3 id="h3-example-2-copying-built-application-artifacts" class="group relative scroll-mt-24">
        <a href="#h3-example-2-copying-built-application-artifacts" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 2: Copying Built Application Artifacts
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-2-copying-built-application-artifacts"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Copy build artifacts from a Node.js container</span>
docker <span class="hljs-built_in">cp</span> node-builder:/app/dist ./dist
</code></pre><h3 id="h3-example-3-extracting-generated-reports" class="group relative scroll-mt-24">
        <a href="#h3-example-3-extracting-generated-reports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example 3: Extracting Generated Reports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-3-extracting-generated-reports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># Extract all PDF reports from a container</span>
<span class="hljs-built_in">mkdir</span> -p ./reports
docker <span class="hljs-built_in">exec</span> report-generator tar -cz -C /app/reports . | tar -xz -C ./reports
</code></pre><h2 id="h2-performance-considerations" class="group relative scroll-mt-24">
        <a href="#h2-performance-considerations" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Performance Considerations
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-performance-considerations"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When copying large files or directories, consider these performance tips:</p>
<ol>
<li><p><strong>Use compression when appropriate</strong>: The tar method with the <code>-z</code> flag compresses data during transfer, which can be faster for text-heavy files but slower for already-compressed content.</p>
</li>
<li><p><strong>Consider bandwidth limitations</strong>: If you&#39;re copying across a network, large transfers might impact other services.</p>
</li>
<li><p><strong>Avoid copying unnecessary files</strong>: Be specific about what you copy rather than grabbing entire directories.</p>
</li>
<li><p><strong>Use volumes for frequent access</strong>: If you need ongoing access to files, volumes are more efficient than repeated copy operations.</p>
</li>
</ol>
<h2 id="h2-troubleshooting-common-issues" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-common-issues" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting Common Issues
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-common-issues"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-permission-problems" class="group relative scroll-mt-24">
        <a href="#h3-permission-problems" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Permission Problems
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-permission-problems"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you encounter permission issues when copying files:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Copy files and preserve permissions</span>
docker <span class="hljs-built_in">cp</span> --archive my-container:/path/to/files ./destination
</code></pre><p>The <code>--archive</code> flag preserves ownership, permissions, and timestamps.</p>
<h3 id="h3-container-path-not-found" class="group relative scroll-mt-24">
        <a href="#h3-container-path-not-found" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Container Path Not Found
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-container-path-not-found"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Make sure you&#39;re using the correct path inside the container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Check the exact path by exploring the container filesystem</span>
docker <span class="hljs-built_in">exec</span> my-container <span class="hljs-built_in">ls</span> -la /path/to/check
</code></pre><h3 id="h3-file-ownership" class="group relative scroll-mt-24">
        <a href="#h3-file-ownership" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          File Ownership
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-file-ownership"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Files copied from containers often have different ownership than expected:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Change ownership after copying</span>
<span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chown</span> -R $(<span class="hljs-built_in">id</span> -u):$(<span class="hljs-built_in">id</span> -g) ./copied-files
</code></pre><h2 id="h2-next-steps" class="group relative scroll-mt-24">
        <a href="#h2-next-steps" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Next Steps
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-next-steps"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Now that you know how to copy files from Docker containers, you might want to explore:</p>
<ul>
<li>Setting up automated backup systems for container data</li>
<li>Creating data processing pipelines that extract container results</li>
<li>Implementing proper volume management for persistent container data</li>
<li>Using Docker Compose to simplify complex data sharing scenarios</li>
</ul>
<p>Happy containerizing!</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Get docker-compose to Always Re-create Containers from Fresh Images]]></title>
      <link>https://devops-daily.com/posts/docker-compose-always-recreate-containers</link>
      <description><![CDATA[Want to make sure docker-compose always uses the latest image and re-creates containers? Learn the right flags, workflow, and best practices to avoid stale containers in development and CI.]]></description>
      <pubDate>Thu, 01 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/docker-compose-always-recreate-containers</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[docker-compose]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To make docker-compose always re-create containers from fresh images, use <code>docker-compose pull</code> to get the latest images, then run <code>docker-compose up --force-recreate --build</code>. This ensures containers are rebuilt or replaced, not reused from cache.</p>
<h2 id="h2-why-containers-might-not-be-re-created" class="group relative scroll-mt-24">
        <a href="#h2-why-containers-might-not-be-re-created" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Containers Might Not Be Re-created
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-containers-might-not-be-re-created"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>By default, <code>docker-compose up</code> reuses existing containers if they already exist, even if the image has changed. This can lead to running old code or missing updates, especially in development or CI.</p>
<h2 id="h2-the-solution-use-the-right-flags" class="group relative scroll-mt-24">
        <a href="#h2-the-solution-use-the-right-flags" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Solution: Use the Right Flags
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-solution-use-the-right-flags"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><code>--force-recreate</code>: Forces docker-compose to remove and re-create containers, even if nothing changed in the config.</li>
<li><code>--build</code>: Builds images before starting containers (useful if you have local Dockerfiles).</li>
<li><code>--pull</code>: Always attempt to pull newer images before building (Compose V2 only, or use <code>docker-compose pull</code> first).</li>
</ul>
<p><strong>Recommended workflow:</strong></p>
<pre><code class="hljs language-bash">docker-compose pull           <span class="hljs-comment"># Get the latest images from the registry</span>
docker-compose up --build --force-recreate
</code></pre><p>Or, with Compose V2 (Docker CLI):</p>
<pre><code class="hljs language-bash">docker compose up --build --force-recreate --pull always
</code></pre><h2 id="h2-example" class="group relative scroll-mt-24">
        <a href="#h2-example" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-example"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Suppose you updated your app image in a registry. To make sure your containers use the new image:</p>
<pre><code class="hljs language-bash">docker-compose pull app
<span class="hljs-comment"># Then:</span>
docker-compose up --build --force-recreate app
</code></pre><p>This will:</p>
<ul>
<li>Pull the latest image for <code>app</code></li>
<li>Build any local images if needed</li>
<li>Remove and re-create the <code>app</code> container</li>
</ul>
<h2 id="h2-cleaning-up-old-containers-and-images" class="group relative scroll-mt-24">
        <a href="#h2-cleaning-up-old-containers-and-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Cleaning Up Old Containers and Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-cleaning-up-old-containers-and-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you want to remove stopped containers and unused images:</p>
<pre><code class="hljs language-bash">docker-compose down --rmi all --volumes
</code></pre><ul>
<li><code>--rmi all</code>: Remove all images used by services</li>
<li><code>--volumes</code>: Remove named volumes declared in the <code>volumes</code> section</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Use <code>--force-recreate</code> in development to avoid stale containers</li>
<li>Use <code>--pull</code> or <code>docker-compose pull</code> to always get the latest images</li>
<li>For CI/CD, script these steps to ensure clean deploys</li>
<li>Document your workflow for your team</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To always get fresh containers from the latest images, combine <code>docker-compose pull</code> with <code>docker-compose up --build --force-recreate</code>. This keeps your environment up to date and avoids surprises from cached or outdated containers.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Terraform: Failed to install provider, does not match checksums from dependency lock file]]></title>
      <link>https://devops-daily.com/posts/terraform-provider-checksum-mismatch</link>
      <description><![CDATA[Troubleshoot the Terraform error about provider checksums not matching the dependency lock file and learn safe fixes and best practices.]]></description>
      <pubDate>Thu, 01 May 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/terraform-provider-checksum-mismatch</guid>
      <category><![CDATA[Terraform]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Terraform]]></category><category><![CDATA[Troubleshooting]]></category><category><![CDATA[Providers]]></category><category><![CDATA[Security]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The error &quot;Failed to install provider, does not match checksums from dependency lock file&quot; means Terraform downloaded a provider binary whose checksum did not match what&#39;s recorded in <code>.terraform.lock.hcl</code>. Common causes are an outdated lock file, platform differences, corrupted downloads, or using a provider mirror with different checksums. The safe fixes are: inspect and refresh the lock file, clear local caches, regenerate platform-specific checksums, or use short-lived remote sandboxes when testing. Follow the step-by-step checklist below to resolve the issue without weakening supply-chain protections.</p>
<hr>
<p>When Terraform complains that a provider&#39;s checksum does not match the dependency lock file, it is protecting you from a potentially tampered or unexpected provider binary. That protection is useful, but it can also block legitimate changes like a provider upgrade or when you switch platforms. Use the following steps to diagnose and fix the problem.</p>
<h2 id="h2-quick-checklist-start-here" class="group relative scroll-mt-24">
        <a href="#h2-quick-checklist-start-here" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Quick checklist (start here)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-quick-checklist-start-here"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li>Confirm which provider and platform Terraform reports in the error message.</li>
<li>Run <code>terraform init -upgrade</code> to refresh provider versions and update the lock file if you intend to accept newer checksums.</li>
<li>If you must reproduce a specific lock state, restore the original <code>.terraform.lock.hcl</code> from version control or recreate it with <code>terraform providers lock</code> for the target platforms.</li>
<li>Clear local plugin caches and re-run <code>terraform init</code>.</li>
</ol>
<p>Work through those in order - the first two items resolve most cases.</p>
<h2 id="h2-why-this-happens" class="group relative scroll-mt-24">
        <a href="#h2-why-this-happens" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why this happens
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-this-happens"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>The <code>.terraform.lock.hcl</code> file pins provider download checksums for specific platforms. If the provider binary downloaded during <code>terraform init</code> has a different checksum, Terraform aborts to prevent unexpected code from executing.</li>
<li>Common legitimate causes:<ul>
<li>The lock file is stale and a provider was released or patched upstream.</li>
<li>You switched OS or architecture (for example, from macOS to Linux) and the lock file does not contain checksums for the new platform.</li>
<li>A download was corrupted or a proxy / mirror returned a different binary.</li>
<li>A private provider mirror or alternate registry with different signed binaries.</li>
</ul>
</li>
</ul>
<h2 id="h2-step-by-step-fixes" class="group relative scroll-mt-24">
        <a href="#h2-step-by-step-fixes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Step-by-step fixes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-step-by-step-fixes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ol>
<li>Inspect the error and .terraform.lock.hcl</li>
</ol>
<p>Before the code: check the exact provider and platform referenced in the error and open your lock file to compare.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># show the last init error output (run this in the root where terraform init failed)</span>
terraform init
</code></pre><ul>
<li>What this does: repeats init and prints the failing provider and platform details.</li>
<li>Why it matters: you need the provider name, version, and platform that triggered the checksum mismatch.</li>
</ul>
<p>Open <code>.terraform.lock.hcl</code> and find the provider block for the provider name and version reported in the error. That block contains checksums keyed by platform.</p>
<ol start="2">
<li>Refresh the lock file when you want the latest provider</li>
</ol>
<p>Before the code: if you are intentionally updating providers or accepting the registry&#39;s latest artifacts, run init with upgrade to refresh the lock file.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># refresh provider constraints and update lock file</span>
terraform init -upgrade
</code></pre><ul>
<li>What this does: asks Terraform to check for newer provider versions and update <code>.terraform.lock.hcl</code> with new checksums.</li>
<li>Why it matters: this is the correct action when you intend to move to a newer provider release.</li>
</ul>
<ol start="3">
<li>Regenerate lock checksums for specific platforms</li>
</ol>
<p>Before the code: when developing on one platform but CI or other machines use different OS/arch combinations, generate a lock file that includes checksums for all target platforms.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># generate lock entries for linux_amd64 and darwin_amd64</span>
terraform providers lock -platform=linux_amd64 -platform=darwin_amd64
</code></pre><ul>
<li>What this does: creates or updates <code>.terraform.lock.hcl</code> to include checksums for the requested platforms.</li>
<li>Why it matters: Terraform needs matching checksums for every platform that will download the provider. This prevents mismatches in CI or teammates&#39; machines.</li>
</ul>
<ol start="4">
<li>Clear corrupted local downloads and re-init</li>
</ol>
<p>Before the code: if a download was corrupted or a proxy returned a bad file, remove the local plugin cache and re-run init.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># remove the working terraform directory and provider cache</span>
<span class="hljs-built_in">rm</span> -rf .terraform
<span class="hljs-built_in">rm</span> -rf ~/.terraform.d/plugin-cache
<span class="hljs-comment"># then re-init</span>
terraform init
</code></pre><ul>
<li>What this does: forces Terraform to re-download providers from the registry or mirror.</li>
<li>Why it matters: corrupted cached files can trigger checksum mismatches even when the lock file is correct.</li>
</ul>
<ol start="5">
<li>If you use a provider mirror or private registry</li>
</ol>
<ul>
<li>Verify the mirror&#39;s integrity: the mirror must publish the same signed artifacts and checksums as the public registry, otherwise checksums will differ.</li>
<li>If the mirror alters binaries, coordinate with the mirror owner to publish matching checksums or pin the mirror in your CLI config using <code>provider_installation</code> in <code>~/.terraformrc</code> or <code>terraform.rc</code>.</li>
</ul>
<p>Example <code>provider_installation</code> that uses a filesystem mirror:</p>
<pre><code class="hljs language-hcl"><span class="hljs-comment"># ~/.terraformrc</span>
provider_installation {
  filesystem_mirror {
    path    = <span class="hljs-string">&quot;/opt/terraform-providers&quot;</span>
  }
  direct {
    exclude = [<span class="hljs-string">&quot;registry.terraform.io/*/*&quot;</span>]
  }
}
</code></pre><ul>
<li>What this does: tells Terraform to prefer providers from the local filesystem mirror.</li>
<li>Why it matters: a mirror with different binaries will cause checksum mismatches unless the lock file has matching entries.</li>
</ul>
<ol start="6">
<li>When it is OK to remove the lock file</li>
</ol>
<p>If you are experimenting locally and understand the risk, you can regenerate the lock file. Prefer <code>terraform init -upgrade</code> or <code>terraform providers lock</code> instead of just deleting the lock file. If you do remove it, commit the regenerated <code>.terraform.lock.hcl</code> to version control so other users have the same checksums.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># risky: remove the lock file and re-init (only for experiments)</span>
<span class="hljs-built_in">rm</span> .terraform.lock.hcl
terraform init
</code></pre><ul>
<li>What this does: removes protection and allows Terraform to create a fresh lock file based on whatever it downloads.</li>
<li>Why it matters: avoid this on shared branches unless you coordinate the provider change.</li>
</ul>
<h2 id="h2-best-practices-to-avoid-this-in-the-future" class="group relative scroll-mt-24">
        <a href="#h2-best-practices-to-avoid-this-in-the-future" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best practices to avoid this in the future
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices-to-avoid-this-in-the-future"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Commit <code>.terraform.lock.hcl</code> to version control for all Terraform roots. That keeps everyone using the same provider checksums.</li>
<li>Use <code>terraform providers lock -platform=</code> to include CI and local platforms in the lock file.</li>
<li>Pin provider versions in your configuration to avoid surprise upgrades: <code>version = &quot;~&gt; 4.0&quot;</code>.</li>
<li>Use short-lived sandbox backends for testing provider upgrades before changing main state.</li>
<li>If you operate a provider mirror, keep it synchronized with the upstream registry and publish matching checksums.</li>
</ul>
<h2 id="h2-troubleshooting-flow-ascii" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting-flow-ascii" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting flow (ASCII)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting-flow-ascii"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The steps below show a simple flow to resolve checksum issues.</p>
<pre><code>Error: checksum mismatch
    |
    v
Inspect error -&gt; check .terraform.lock.hcl -&gt;
  if outdated -&gt; terraform init -upgrade -&gt; done
  else if missing platforms -&gt; terraform providers lock -platform=... -&gt; done
  else -&gt; clear cache (rm -rf .terraform) -&gt; terraform init
</code></pre><h2 id="h2-short-practical-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-short-practical-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Short practical conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-short-practical-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When Terraform blocks provider installation with a checksum mismatch, treat it as a safety signal. Start by refreshing the lock file with <code>terraform init -upgrade</code> if you expect newer providers, or generate platform checksums with <code>terraform providers lock</code> when CI and local machines differ. Only clear caches or remove the lock file when you understand the risk and have a plan to commit and distribute the updated lock file.</p>
<p>Next steps you can explore: automate lockfile generation for CI platforms, add pre-commit checks that validate <code>.terraform.lock.hcl</code>, and use provider mirrors carefully with matching checksum publication.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Difference Between Running and Starting a Docker Container]]></title>
      <link>https://devops-daily.com/posts/docker-run-vs-docker-start</link>
      <description><![CDATA[Confused about 'docker run' vs 'docker start'? Learn the difference between running and starting a Docker container, with practical examples and best practices for your workflow.]]></description>
      <pubDate>Wed, 30 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/docker-run-vs-docker-start</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker run</code> creates and starts a new container from an image, while <code>docker start</code> restarts an existing, stopped container. Use <code>run</code> for new containers, and <code>start</code> to bring back a container you previously stopped.</p>
<h2 id="h2-what-does-docker-run-do" class="group relative scroll-mt-24">
        <a href="#h2-what-does-docker-run-do" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Does docker run Do?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-does-docker-run-do"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker run</code> is the main command to create and launch a new container. It does several things at once:</p>
<ul>
<li>Creates a new container from the specified image</li>
<li>Assigns it a unique ID and (optionally) a name</li>
<li>Sets up networking, storage, and environment variables</li>
<li>Starts the container&#39;s main process</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code class="hljs language-bash">docker run -d --name my-nginx -p 8080:80 nginx
</code></pre><p>This creates a new container named <code>my-nginx</code> from the <code>nginx</code> image and starts it in the background.</p>
<h2 id="h2-what-does-docker-start-do" class="group relative scroll-mt-24">
        <a href="#h2-what-does-docker-start-do" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Does docker start Do?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-does-docker-start-do"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker start</code> is used to restart a container that was previously created (and stopped). It does not create a new container or change its configuration.</p>
<p><strong>Example:</strong></p>
<pre><code class="hljs language-bash">docker stop my-nginx  <span class="hljs-comment"># Stop the container</span>
<span class="hljs-comment"># ... do something ...</span>
docker start my-nginx <span class="hljs-comment"># Start it again</span>
</code></pre><ul>
<li>The container keeps its data, configuration, and name.</li>
<li>Any changes made to the container&#39;s filesystem persist.</li>
</ul>
<h2 id="h2-key-differences" class="group relative scroll-mt-24">
        <a href="#h2-key-differences" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Differences
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-differences"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><code>docker run</code> creates a new container every time you use it.</li>
<li><code>docker start</code> only works on containers that already exist (but are stopped).</li>
<li>You can only use <code>docker run</code> with an image; <code>docker start</code> uses a container name or ID.</li>
<li><code>docker run</code> lets you set options (ports, env vars, volumes) at creation; <code>docker start</code> does not.</li>
</ul>
<h2 id="h2-when-to-use-each-command" class="group relative scroll-mt-24">
        <a href="#h2-when-to-use-each-command" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When to Use Each Command
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-to-use-each-command"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Use <code>docker run</code> when you want a fresh container, possibly with new options.</li>
<li>Use <code>docker start</code> to restart a stopped container with the same settings and data.</li>
<li>For stateless or short-lived containers, <code>docker run</code> is common.</li>
<li>For persistent services or debugging, <code>docker start</code> is handy.</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Name your containers with <code>--name</code> for easier management.</li>
<li>Use <code>docker ps -a</code> to see all containers (running and stopped).</li>
<li>Remove containers you no longer need with <code>docker rm</code> to avoid clutter.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker run</code> and <code>docker start</code> serve different purposes: one creates and starts new containers, the other restarts existing ones. Use the right command for your workflow to keep your Docker environment organized and efficient.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Can I Inspect the File System of a Failed Docker Build?]]></title>
      <link>https://devops-daily.com/posts/inspect-filesystem-of-failed-docker-build</link>
      <description><![CDATA[Want to debug a failed Docker build? Learn practical ways to inspect the build's file system, including interactive debugging with buildkit, temporary containers, and troubleshooting tips.]]></description>
      <pubDate>Tue, 29 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/inspect-filesystem-of-failed-docker-build</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Troubleshooting]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To inspect the file system of a failed Docker build, use multi-stage builds to save intermediate images, add debug steps (like <code>sleep</code> or <code>tail</code>), or leverage BuildKit&#39;s <code>--target</code> and <code>--output</code> features. This lets you start a shell in the failed state and debug interactively.</p>
<h2 id="h2-why-is-this-useful" class="group relative scroll-mt-24">
        <a href="#h2-why-is-this-useful" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Is This Useful?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-is-this-useful"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When a Docker build fails, you often want to see what files, environment variables, or installed packages are present at the failure point. This helps you debug missing files, permissions, or unexpected build behavior.</p>
<h2 id="h2-method-1-add-a-debug-step-sleep-or-tail" class="group relative scroll-mt-24">
        <a href="#h2-method-1-add-a-debug-step-sleep-or-tail" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Add a Debug Step (sleep or tail)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-1-add-a-debug-step-sleep-or-tail"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Temporarily add a line to your Dockerfile before the failing step:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">RUN</span><span class="language-bash"> <span class="hljs-built_in">sleep</span> infinity</span>
</code></pre><p>or</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">RUN</span><span class="language-bash"> <span class="hljs-built_in">tail</span> -f /dev/null</span>
</code></pre><p>Build the image:</p>
<pre><code class="hljs language-bash">docker build -t debug-image .
</code></pre><p>In another terminal, find the running container:</p>
<pre><code class="hljs language-bash">docker ps
</code></pre><p>Start a shell in the container:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it &lt;container_id&gt; /bin/bash
</code></pre><p>Now you can inspect the file system, check logs, and debug interactively. When done, remove the debug line from your Dockerfile.</p>
<h2 id="h2-method-2-use-multi-stage-builds-to-save-intermediate-state" class="group relative scroll-mt-24">
        <a href="#h2-method-2-use-multi-stage-builds-to-save-intermediate-state" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: Use Multi-Stage Builds to Save Intermediate State
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-2-use-multi-stage-builds-to-save-intermediate-state"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your build uses multi-stage builds, you can tag an intermediate stage and run a container from it:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span> as builder
<span class="hljs-comment"># ... build steps ...</span>

<span class="hljs-keyword">FROM</span> builder as debug-stage
<span class="hljs-comment"># Add a debug step if needed</span>
</code></pre><p>Build up to the debug stage:</p>
<pre><code class="hljs language-bash">docker build --target debug-stage -t debug-image .
docker run -it debug-image /bin/bash
</code></pre><h2 id="h2-method-3-use-buildkit39s-outputtypelocal" class="group relative scroll-mt-24">
        <a href="#h2-method-3-use-buildkit39s-outputtypelocal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 3: Use BuildKit&#39;s --output=type=local
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-3-use-buildkit39s-outputtypelocal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>With BuildKit enabled, you can export the build&#39;s file system to a local directory:</p>
<pre><code class="hljs language-bash">docker build --output <span class="hljs-built_in">type</span>=<span class="hljs-built_in">local</span>,dest=./output .
</code></pre><p>This writes the final build context to <code>./output</code>, so you can inspect files directly on your host.</p>
<h2 id="h2-method-4-commit-a-stopped-container-if-build-got-far-enough" class="group relative scroll-mt-24">
        <a href="#h2-method-4-commit-a-stopped-container-if-build-got-far-enough" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 4: Commit a Stopped Container (if build got far enough)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-method-4-commit-a-stopped-container-if-build-got-far-enough"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your build ran a container that exited, you can commit it to an image:</p>
<pre><code class="hljs language-bash">docker ps -a  <span class="hljs-comment"># Find the exited container</span>
<span class="hljs-comment"># Then:</span>
docker commit &lt;container_id&gt; debug-image
docker run -it debug-image /bin/bash
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Remove debug steps after you&#39;re done to keep images clean.</li>
<li>Use multi-stage builds to avoid leaking secrets or build tools into final images.</li>
<li>For complex builds, consider using BuildKit for advanced debugging features.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Inspecting the file system of a failed Docker build is easy with debug steps, multi-stage builds, or BuildKit&#39;s output features. Use these techniques to troubleshoot and fix build issues faster.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[docker: 'build' requires 1 argument. See 'docker build --help']]></title>
      <link>https://devops-daily.com/posts/docker-build-requires-1-argument</link>
      <description><![CDATA[Getting the error 'docker: build requires 1 argument'? Learn what it means, why it happens, and how to fix it with practical examples for your Docker workflow.]]></description>
      <pubDate>Mon, 28 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/docker-build-requires-1-argument</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Troubleshooting]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The error <code>docker: &quot;build&quot; requires 1 argument. See &#39;docker build --help&#39;</code> means you forgot to specify the build context (usually a directory) when running <code>docker build</code>. Always provide a path (like <code>.</code>) as the last argument.</p>
<h2 id="h2-why-does-this-error-happen" class="group relative scroll-mt-24">
        <a href="#h2-why-does-this-error-happen" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Does This Error Happen?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-does-this-error-happen"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>When you run <code>docker build</code>, Docker expects a build context—a directory containing your <code>Dockerfile</code> and any files needed for the build. If you don&#39;t provide this argument, Docker doesn&#39;t know what to build.</p>
<p><strong>Example of the error:</strong></p>
<pre><code class="hljs language-bash">docker build
<span class="hljs-comment"># Output:</span>
<span class="hljs-comment"># docker: &quot;build&quot; requires 1 argument. See &#x27;docker build --help&#x27;.</span>
</code></pre><h2 id="h2-how-to-fix-it" class="group relative scroll-mt-24">
        <a href="#h2-how-to-fix-it" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Fix It
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-fix-it"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Add the build context (usually <code>.</code> for the current directory) at the end of your command:</p>
<pre><code class="hljs language-bash">docker build .
</code></pre><p>Or, if your <code>Dockerfile</code> is in a different directory:</p>
<pre><code class="hljs language-bash">docker build /path/to/context
</code></pre><p>You can also tag your image at the same time:</p>
<pre><code class="hljs language-bash">docker build -t my-image .
</code></pre><h2 id="h2-common-pitfalls" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common Pitfalls
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Forgetting the <code>.</code> or path at the end of the command.</li>
<li>Using <code>docker build -t my-image</code> without the context (should be <code>docker build -t my-image .</code>).</li>
<li>Running the command from the wrong directory (make sure your <code>Dockerfile</code> is in the context directory).</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Always double-check your build context before running <code>docker build</code>.</li>
<li>Use <code>docker build -t &lt;name&gt; .</code> for most local builds.</li>
<li>For CI/CD, use absolute paths or ensure the working directory is correct.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The <code>docker: &quot;build&quot; requires 1 argument</code> error is a simple fix—just add the build context (like <code>.</code>) to your command. This ensures Docker knows where to find your <code>Dockerfile</code> and build resources.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Exposing a Port on a Live Docker Container]]></title>
      <link>https://devops-daily.com/posts/expose-port-on-live-docker-container</link>
      <description><![CDATA[Need to access a service running inside a Docker container, but forgot to expose the port? Learn your options for exposing ports on a running container, workarounds, and best practices for future-proof setups.]]></description>
      <pubDate>Sun, 27 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/expose-port-on-live-docker-container</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can&#39;t directly expose a new port on a running Docker container. To make a service accessible, you need to publish the port when starting the container. If you forgot, you can use workarounds like <code>docker commit</code> + <code>docker run</code>, or use tools like <code>socat</code> or <code>docker network connect</code> for advanced cases. Plan ahead to avoid surprises.</p>
<h2 id="h2-why-can39t-you-expose-a-port-on-a-live-container" class="group relative scroll-mt-24">
        <a href="#h2-why-can39t-you-expose-a-port-on-a-live-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Can&#39;t You Expose a Port on a Live Container?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-can39t-you-expose-a-port-on-a-live-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Docker&#39;s port publishing (<code>-p</code> or <code>--publish</code>) is set up when the container starts. It creates a network mapping from the host to the container. Once running, Docker doesn&#39;t let you add new port mappings to an existing container for security and technical reasons.</p>
<h2 id="h2-what-are-your-options" class="group relative scroll-mt-24">
        <a href="#h2-what-are-your-options" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          What Are Your Options?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-what-are-your-options"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-1-stop-and-re-run-the-container-with-the-port-published" class="group relative scroll-mt-24">
        <a href="#h3-1-stop-and-re-run-the-container-with-the-port-published" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          1. Stop and Re-Run the Container with the Port Published
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-1-stop-and-re-run-the-container-with-the-port-published"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>This is the most reliable approach:</p>
<pre><code class="hljs language-bash">docker stop my-container
docker <span class="hljs-built_in">rm</span> my-container
docker run -d --name my-container -p 8080:8080 my-image
</code></pre><ul>
<li>Use the same image and options, but add <code>-p</code> for the port you need.</li>
<li>If you need to preserve data, use named volumes or bind mounts.</li>
</ul>
<h3 id="h3-2-create-a-new-image-from-the-running-container-not-ideal" class="group relative scroll-mt-24">
        <a href="#h3-2-create-a-new-image-from-the-running-container-not-ideal" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          2. Create a New Image from the Running Container (Not Ideal)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-2-create-a-new-image-from-the-running-container-not-ideal"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If you can&#39;t easily recreate the container, you can commit its state and start a new one:</p>
<pre><code class="hljs language-bash">docker commit my-container my-temp-image
docker run -d --name my-new-container -p 8080:8080 my-temp-image
</code></pre><ul>
<li>This captures the current filesystem state, but not environment variables or volumes.</li>
<li>Use only as a last resort.</li>
</ul>
<h3 id="h3-3-use-socat-or-similar-tools-as-a-proxy" class="group relative scroll-mt-24">
        <a href="#h3-3-use-socat-or-similar-tools-as-a-proxy" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          3. Use socat or Similar Tools as a Proxy
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-3-use-socat-or-similar-tools-as-a-proxy"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can run a sidecar container that forwards traffic from the host to the running container:</p>
<pre><code class="hljs language-bash">docker run -d --network container:my-container -p 8080:8080 alpine/socat TCP-LISTEN:8080,fork TCP:localhost:8080
</code></pre><ul>
<li>This listens on the host and forwards to the target port in the running container.</li>
<li>Useful for quick fixes, but not a long-term solution.</li>
</ul>
<h3 id="h3-4-use-docker-network-connect-advanced" class="group relative scroll-mt-24">
        <a href="#h3-4-use-docker-network-connect-advanced" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          4. Use docker network connect (Advanced)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-4-use-docker-network-connect-advanced"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If your container is on a user-defined bridge network, you can connect another container to the same network and use it as a proxy. This doesn&#39;t publish a port to the host, but allows inter-container communication.</p>
<h2 id="h2-best-practices-for-the-future" class="group relative scroll-mt-24">
        <a href="#h2-best-practices-for-the-future" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices for the Future
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices-for-the-future"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Always publish needed ports with <code>-p</code> or <code>--publish</code> when starting containers.</li>
<li>Use Docker Compose or scripts to manage container options consistently.</li>
<li>Document which ports your services need.</li>
<li>For production, use orchestration tools (like Kubernetes) for dynamic port management.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You can&#39;t expose a new port on a live Docker container, but you have workarounds. The best fix is to stop and re-run the container with the correct port mapping. For emergencies, use tools like <code>socat</code> to forward traffic. Plan your port mappings ahead to avoid downtime and surprises.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Using SSH Keys Inside a Docker Container]]></title>
      <link>https://devops-daily.com/posts/using-ssh-keys-in-docker-container</link>
      <description><![CDATA[Need to use SSH keys in your Docker container for git, automation, or remote access? Learn secure ways to provide SSH keys, best practices for builds, and how to avoid common pitfalls.]]></description>
      <pubDate>Sat, 26 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/using-ssh-keys-in-docker-container</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[SSH]]></category><category><![CDATA[Security]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To use SSH keys inside a Docker container, mount your key at runtime or use Docker&#39;s SSH agent forwarding. Never bake private keys into images. This guide covers secure patterns for development, CI, and production, with practical examples and troubleshooting tips.</p>
<h2 id="h2-why-use-ssh-keys-in-a-container" class="group relative scroll-mt-24">
        <a href="#h2-why-use-ssh-keys-in-a-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Use SSH Keys in a Container?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-use-ssh-keys-in-a-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You might need SSH keys in a container to:</p>
<ul>
<li>Clone private git repositories</li>
<li>Connect to remote servers for automation</li>
<li>Use tools like Ansible or rsync over SSH</li>
</ul>
<h2 id="h2-the-wrong-way-copying-keys-into-images" class="group relative scroll-mt-24">
        <a href="#h2-the-wrong-way-copying-keys-into-images" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Wrong Way: Copying Keys into Images
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-wrong-way-copying-keys-into-images"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><strong>Never copy your private SSH keys into a Docker image.</strong> This exposes secrets to anyone with access to the image and risks leaking credentials if the image is pushed to a registry.</p>
<h2 id="h2-the-right-way-mounting-ssh-keys-at-runtime" class="group relative scroll-mt-24">
        <a href="#h2-the-right-way-mounting-ssh-keys-at-runtime" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Right Way: Mounting SSH Keys at Runtime
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-right-way-mounting-ssh-keys-at-runtime"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>The safest approach is to mount your SSH key into the container at runtime:</p>
<pre><code class="hljs language-bash">docker run -v <span class="hljs-variable">$HOME</span>/.ssh/id_rsa:/root/.ssh/id_rsa:ro -it my-image
</code></pre><ul>
<li>This makes your private key available only while the container runs.</li>
<li>Use <code>:ro</code> to mount read-only.</li>
<li>Set permissions inside the container if needed:</li>
</ul>
<pre><code class="hljs language-bash"><span class="hljs-built_in">chmod</span> 600 /root/.ssh/id_rsa
</code></pre><p>You can also mount your entire <code>.ssh</code> directory:</p>
<pre><code class="hljs language-bash">docker run -v <span class="hljs-variable">$HOME</span>/.ssh:/root/.ssh:ro -it my-image
</code></pre><h2 id="h2-using-ssh-agent-forwarding-recommended-for-ci-and-builds" class="group relative scroll-mt-24">
        <a href="#h2-using-ssh-agent-forwarding-recommended-for-ci-and-builds" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using SSH Agent Forwarding (Recommended for CI and Builds)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-ssh-agent-forwarding-recommended-for-ci-and-builds"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>For build-time access (e.g., cloning private repos in a Dockerfile), use Docker&#39;s SSH agent forwarding (Docker 18.09+):</p>
<ol>
<li>Start your SSH agent and add your key:</li>
</ol>
<pre><code class="hljs language-bash"><span class="hljs-built_in">eval</span> <span class="hljs-string">&quot;<span class="hljs-subst">$(ssh-agent -s)</span>&quot;</span>
ssh-add ~/.ssh/id_rsa
</code></pre><ol start="2">
<li>Build with SSH forwarding:</li>
</ol>
<pre><code class="hljs language-bash">docker build --ssh default .
</code></pre><ol start="3">
<li>In your Dockerfile, use:</li>
</ol>
<pre><code class="hljs language-dockerfile"><span class="hljs-comment"># syntax=docker/dockerfile:1.2</span>
<span class="hljs-keyword">FROM</span> alpine
<span class="hljs-keyword">RUN</span><span class="language-bash"> apk add --no-cache openssh git</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> --mount=<span class="hljs-built_in">type</span>=ssh git <span class="hljs-built_in">clone</span> git@github.com:yourorg/private-repo.git</span>
</code></pre><ul>
<li>The key is never copied into the image.</li>
<li>Works for multi-stage builds and CI pipelines.</li>
</ul>
<h2 id="h2-using-ssh-keys-for-remote-access" class="group relative scroll-mt-24">
        <a href="#h2-using-ssh-keys-for-remote-access" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Using SSH Keys for Remote Access
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-using-ssh-keys-for-remote-access"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you need to SSH from inside a running container:</p>
<ol>
<li>Mount your key as above.</li>
<li>Make sure the container has an SSH client installed (e.g., <code>apt-get install -y openssh-client</code>).</li>
<li>Use <code>ssh</code> as usual:</li>
</ol>
<pre><code class="hljs language-bash">ssh -i /root/.ssh/id_rsa user@remote-host
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Never commit or bake private keys into images or version control.</li>
<li>Use agent forwarding for build-time access.</li>
<li>Mount keys at runtime for interactive or automation use.</li>
<li>Set correct permissions (<code>chmod 600</code>) on private keys.</li>
<li>Use separate deploy keys or service accounts for automation.</li>
<li>Clean up keys and known_hosts after use in CI/CD jobs.</li>
</ul>
<h2 id="h2-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>If you see <code>Permission denied (publickey)</code>, check key permissions and SSH config.</li>
<li>If mounting doesn&#39;t work, check your Docker version and volume syntax.</li>
<li>For multi-user containers, mount keys to the correct user&#39;s home directory.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Using SSH keys in Docker containers is safe and flexible when you mount them at runtime or use agent forwarding. Avoid copying secrets into images, and follow best practices to keep your credentials secure in every environment.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[Connecting to PostgreSQL in a Docker Container from Outside]]></title>
      <link>https://devops-daily.com/posts/connecting-to-postgresql-in-a-docker-container-from-outside</link>
      <description><![CDATA[Expose PostgreSQL safely and connect from your host or another machine using Docker and Docker Compose. Covers port publishing, listen addresses, pg_hba.conf basics, and common troubleshooting.]]></description>
      <pubDate>Fri, 25 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/connecting-to-postgresql-in-a-docker-container-from-outside</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[Networking]]></category><category><![CDATA[Docker Compose]]></category><category><![CDATA[Security]]></category>
      <content:encoded><![CDATA[<p>You have PostgreSQL running in a container and you want to connect from outside the container - from your laptop, a CI job, or another machine. This guide shows practical ways to expose the database for local development while keeping security in mind.</p>
<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Publish the container port to your host with <code>-p 5432:5432</code>, then connect to <code>localhost:5432</code>.</li>
<li>In Docker Compose, set <code>ports: [&quot;5432:5432&quot;]</code> on the <code>db</code> service.</li>
<li>For remote machines, bind to all addresses and open the host firewall carefully. Limit access with <code>pg_hba.conf</code> CIDR rules.</li>
<li>If connection fails, check container logs, port conflicts, <code>listen_addresses</code>, and <code>pg_hba.conf</code>.</li>
</ul>
<p>Quick mental model:</p>
<pre><code>Client        Host               Docker NAT           Container
------        ----               ----------           ---------
psql -&gt; 127.0.0.1:5432  -&gt;  host:5432  -&gt;  container:5432 (PostgreSQL)
</code></pre><h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Docker Desktop 4.x or Docker Engine 24.x+</li>
<li>psql 14+ (install with your package manager if you do not have it)</li>
</ul>
<h2 id="h2-option-1-docker-cli-publish-port-5432-and-connect-from-host" class="group relative scroll-mt-24">
        <a href="#h2-option-1-docker-cli-publish-port-5432-and-connect-from-host" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 1: Docker CLI - publish port 5432 and connect from host
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-option-1-docker-cli-publish-port-5432-and-connect-from-host"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Start PostgreSQL with a password and publish the port. Then connect using <code>psql</code> from your machine.</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># Start a local Postgres with a persistent volume and a strong password</span>
docker run --name pg-local --<span class="hljs-built_in">rm</span> \
  -e POSTGRES_PASSWORD=<span class="hljs-string">&#x27;P@ssw0rd-Dev&#x27;</span> \
  -e POSTGRES_DB=<span class="hljs-string">&#x27;appdb&#x27;</span> \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16
</code></pre><p>Connect from your host:</p>
<pre><code class="hljs language-bash">psql <span class="hljs-string">&quot;postgresql://postgres:P@ssw0rd-Dev@localhost:5432/appdb&quot;</span>
</code></pre><p>Why this works:</p>
<ul>
<li><code>-p 5432:5432</code> publishes the container&#39;s 5432 on your host. On macOS and Windows, Docker Desktop publishes to <code>localhost</code>. On Linux, it binds to the host interface.</li>
<li>PostgreSQL listens on the container&#39;s 0.0.0.0 by default in this image, and with a password set you can authenticate.</li>
</ul>
<p>If you cannot connect:</p>
<ul>
<li>Check the container logs for startup errors:</li>
</ul>
<pre><code class="hljs language-bash">docker logs pg-local | <span class="hljs-built_in">tail</span> -n 50
</code></pre><ul>
<li>Check that 5432 is actually published and free on the host:</li>
</ul>
<pre><code class="hljs language-bash">docker ps | grep pg-local
lsof -i :5432 | <span class="hljs-built_in">cat</span>
</code></pre><h2 id="h2-option-2-docker-compose-declarative-setup-with-ports" class="group relative scroll-mt-24">
        <a href="#h2-option-2-docker-compose-declarative-setup-with-ports" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Option 2: Docker Compose - declarative setup with ports
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-option-2-docker-compose-declarative-setup-with-ports"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Compose makes the setup repeatable for your team.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">version:</span> <span class="hljs-string">&#x27;3.9&#x27;</span>
<span class="hljs-attr">services:</span>
  <span class="hljs-attr">db:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:16</span>
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">POSTGRES_PASSWORD:</span> <span class="hljs-string">P@ssw0rd-Dev</span>
      <span class="hljs-attr">POSTGRES_DB:</span> <span class="hljs-string">appdb</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;5432:5432&#x27;</span> <span class="hljs-comment"># host:container</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">pgdata:/var/lib/postgresql/data</span>
    <span class="hljs-attr">healthcheck:</span>
      <span class="hljs-attr">test:</span> [<span class="hljs-string">&#x27;CMD-SHELL&#x27;</span>, <span class="hljs-string">&#x27;pg_isready -U postgres&#x27;</span>]
      <span class="hljs-attr">interval:</span> <span class="hljs-string">5s</span>
      <span class="hljs-attr">timeout:</span> <span class="hljs-string">3s</span>
      <span class="hljs-attr">retries:</span> <span class="hljs-number">5</span>
<span class="hljs-attr">volumes:</span>
  <span class="hljs-attr">pgdata:</span>
</code></pre><p>Connect from your host the same way:</p>
<pre><code class="hljs language-bash">psql <span class="hljs-string">&quot;postgresql://postgres:P@ssw0rd-Dev@localhost:5432/appdb&quot;</span>
</code></pre><h3 id="h3-binding-to-all-interfaces-for-remote-clients" class="group relative scroll-mt-24">
        <a href="#h3-binding-to-all-interfaces-for-remote-clients" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Binding to all interfaces for remote clients
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-binding-to-all-interfaces-for-remote-clients"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>If another machine on your network needs access, publish the port and make sure the Postgres server is reachable through the host&#39;s IP address.</p>
<pre><code class="hljs language-yaml"><span class="hljs-attr">services:</span>
  <span class="hljs-attr">db:</span>
    <span class="hljs-attr">image:</span> <span class="hljs-string">postgres:16</span>
    <span class="hljs-attr">command:</span> [<span class="hljs-string">&#x27;postgres&#x27;</span>, <span class="hljs-string">&#x27;-c&#x27;</span>, <span class="hljs-string">&#x27;listen_addresses=*&#x27;</span>]
    <span class="hljs-attr">environment:</span>
      <span class="hljs-attr">POSTGRES_PASSWORD:</span> <span class="hljs-string">P@ssw0rd-Dev</span>
      <span class="hljs-attr">POSTGRES_DB:</span> <span class="hljs-string">appdb</span>
    <span class="hljs-attr">ports:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;5432:5432&#x27;</span>
    <span class="hljs-attr">volumes:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">pgdata:/var/lib/postgresql/data</span>
</code></pre><p>Then:</p>
<ol>
<li><p>Make sure your host firewall allows TCP 5432 from the specific source network.</p>
</li>
<li><p>Limit which clients can authenticate by adjusting <code>pg_hba.conf</code> entries. You can inject a minimal file with a bind mount for local dev:</p>
</li>
</ol>
<pre><code class="hljs language-bash"><span class="hljs-built_in">cat</span> &gt; /tmp/pg_hba.conf &lt;&lt;<span class="hljs-string">&#x27;HBA&#x27;</span>
<span class="hljs-comment"># TYPE  DATABASE  USER      ADDRESS        METHOD</span>
host    all       all       192.168.1.0/24 scram-sha-256
HBA

docker run --name pg-remote --<span class="hljs-built_in">rm</span> \
  -e POSTGRES_PASSWORD=<span class="hljs-string">&#x27;P@ssw0rd-Dev&#x27;</span> \
  -p 5432:5432 \
  -v /tmp/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16 -c listen_addresses=<span class="hljs-string">&#x27;*&#x27;</span>
</code></pre><p>Note: on first initialization, the database populates default config files under <code>/var/lib/postgresql/data</code>. Mounting <code>pg_hba.conf</code> like this will override it for development. In production, use baked images or config management instead of ad-hoc binds.</p>
<h2 id="h2-verifying-from-the-container-side" class="group relative scroll-mt-24">
        <a href="#h2-verifying-from-the-container-side" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Verifying from the container side
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-verifying-from-the-container-side"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Run a quick query to confirm the server is listening and accepting connections.</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it pg-local psql -U postgres -d appdb -c <span class="hljs-string">&quot;show listen_addresses;&quot;</span>
docker <span class="hljs-built_in">exec</span> -it pg-local psql -U postgres -d appdb -c <span class="hljs-string">&quot;select 1;&quot;</span>
</code></pre><p>You can also inspect the active <code>pg_hba.conf</code> location and reload configuration:</p>
<pre><code class="hljs language-bash">docker <span class="hljs-built_in">exec</span> -it pg-local psql -U postgres -d appdb -c <span class="hljs-string">&quot;show hba_file;&quot;</span>
docker <span class="hljs-built_in">exec</span> -it pg-local psql -U postgres -d appdb -c <span class="hljs-string">&quot;select pg_reload_conf();&quot;</span>
</code></pre><h2 id="h2-connecting-from-another-container" class="group relative scroll-mt-24">
        <a href="#h2-connecting-from-another-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Connecting from another container
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-connecting-from-another-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your app runs in another container, connect over a user-defined network rather than publishing 5432.</p>
<pre><code class="hljs language-bash">docker network create devnet || <span class="hljs-literal">true</span>
docker run -d --name db --network devnet \
  -e POSTGRES_PASSWORD=<span class="hljs-string">&#x27;P@ssw0rd-Dev&#x27;</span> -e POSTGRES_DB=<span class="hljs-string">&#x27;appdb&#x27;</span> \
  postgres:16

<span class="hljs-comment"># Use the service name as the host inside the same network</span>
docker run --<span class="hljs-built_in">rm</span> --network devnet \
  --entrypoint psql \
  postgres:16 \
  <span class="hljs-string">&quot;postgresql://postgres:P@ssw0rd-Dev@db:5432/appdb&quot;</span> -c <span class="hljs-string">&#x27;select 1;&#x27;</span>
</code></pre><p>This keeps the database private to the network while still reachable by your application container.</p>
<h2 id="h2-common-pitfalls-and-fixes" class="group relative scroll-mt-24">
        <a href="#h2-common-pitfalls-and-fixes" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Common pitfalls and fixes
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-common-pitfalls-and-fixes"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Port already in use: pick another host port with <code>-p 15432:5432</code> and connect to <code>localhost:15432</code>.</li>
<li>Wrong hostname: use <code>localhost</code> from your machine, or the host IP for remote clients. Do not use <code>0.0.0.0</code> as a client target.</li>
<li>Firewalls: on Linux servers, open 5432 with ufw or iptables only for the subnets you trust.</li>
<li>Password errors: confirm the username, database name, and password. The default admin user is <code>postgres</code>.</li>
<li>Config not reloading: use <code>select pg_reload_conf();</code> or restart the container after changing config files.</li>
</ul>
<h3 id="h3-quick-connectivity-checklist" class="group relative scroll-mt-24">
        <a href="#h3-quick-connectivity-checklist" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Quick connectivity checklist
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-quick-connectivity-checklist"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-bash"><span class="hljs-comment"># 1) Is the container healthy and listening?</span>
docker ps | grep postgres
docker logs pg-local | <span class="hljs-built_in">tail</span> -n 50

<span class="hljs-comment"># 2) Is the host port published and free?</span>
docker port pg-local 5432 | <span class="hljs-built_in">cat</span>
lsof -i :5432 | <span class="hljs-built_in">cat</span>

<span class="hljs-comment"># 3) Can psql connect locally?</span>
psql <span class="hljs-string">&quot;postgresql://postgres:P@ssw0rd-Dev@localhost:5432/appdb&quot;</span> -c <span class="hljs-string">&#x27;select version();&#x27;</span>
</code></pre><p>With these patterns you can safely expose Postgres for local development, connect from your host, and optionally allow remote clients when needed. Prefer private Docker networks for app-to-DB traffic, and only publish 5432 when you must, with limited CIDRs and a firewall in front.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How to Use sudo Inside a Docker Container]]></title>
      <link>https://devops-daily.com/posts/how-to-use-sudo-in-docker-container</link>
      <description><![CDATA[Need to run commands as root or another user inside your Docker container? Learn when and how to use sudo, why it's often unnecessary, and best practices for secure container builds.]]></description>
      <pubDate>Fri, 25 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/how-to-use-sudo-in-docker-container</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[sudo]]></category><category><![CDATA[Containers]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Most Docker containers run as root by default, so you usually don&#39;t need <code>sudo</code> to run privileged commands. If you want to use <code>sudo</code> (for multi-user images or extra security), you&#39;ll need to install it and configure users. This guide shows how, with practical examples and best practices.</p>
<h2 id="h2-why-isn39t-sudo-available-by-default" class="group relative scroll-mt-24">
        <a href="#h2-why-isn39t-sudo-available-by-default" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Why Isn&#39;t sudo Available by Default?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-why-isn39t-sudo-available-by-default"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Docker containers are designed to be lightweight and secure. By default, most images run as root, so you can install packages or modify the system without <code>sudo</code>. Many base images (like Alpine, Ubuntu, Debian) don&#39;t include <code>sudo</code> to keep images small.</p>
<h2 id="h2-running-as-root-no-sudo-needed" class="group relative scroll-mt-24">
        <a href="#h2-running-as-root-no-sudo-needed" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Running as Root (No sudo Needed)
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-running-as-root-no-sudo-needed"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If your container runs as root (the default), just run commands directly:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; apt-get install -y curl</span>
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;bash&quot;</span>]</span>
</code></pre><p>Inside the container:</p>
<pre><code class="hljs language-bash"><span class="hljs-comment"># You&#x27;re already root</span>
apt-get update
</code></pre><h2 id="h2-adding-sudo-to-a-container" class="group relative scroll-mt-24">
        <a href="#h2-adding-sudo-to-a-container" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Adding sudo to a Container
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-adding-sudo-to-a-container"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>If you want to use <code>sudo</code> (for example, to switch between users or for development parity), you need to install it and set up users:</p>
<pre><code class="hljs language-dockerfile"><span class="hljs-keyword">FROM</span> ubuntu:<span class="hljs-number">22.04</span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> apt-get update &amp;&amp; apt-get install -y <span class="hljs-built_in">sudo</span></span>
<span class="hljs-keyword">RUN</span><span class="language-bash"> useradd -m devuser &amp;&amp; <span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;devuser ALL=(ALL) NOPASSWD:ALL&quot;</span> &gt;&gt; /etc/sudoers</span>
<span class="hljs-keyword">USER</span> devuser
<span class="hljs-keyword">CMD</span><span class="language-bash"> [<span class="hljs-string">&quot;bash&quot;</span>]</span>
</code></pre><p>Now, inside the container:</p>
<pre><code class="hljs language-bash"><span class="hljs-built_in">sudo</span> apt-get update
</code></pre><p>This works just like on a regular Linux system.</p>
<h2 id="h2-when-should-you-use-sudo-in-docker" class="group relative scroll-mt-24">
        <a href="#h2-when-should-you-use-sudo-in-docker" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          When Should You Use sudo in Docker?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-when-should-you-use-sudo-in-docker"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Development images:</strong> To mimic a real user environment or test scripts that require sudo.</li>
<li><strong>Multi-user containers:</strong> If your container runs as a non-root user but needs to escalate privileges for some tasks.</li>
<li><strong>Security best practices:</strong> For production, it&#39;s better to run as a non-root user and only use sudo when absolutely necessary.</li>
</ul>
<h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>Avoid running production containers as root unless required.</li>
<li>Only install <code>sudo</code> if you need it—otherwise, keep images minimal.</li>
<li>Use the <code>USER</code> directive in your Dockerfile to specify a non-root user.</li>
<li>For one-off commands, you can override the user at runtime:</li>
</ul>
<pre><code class="hljs language-bash">docker run -u root my-image <span class="hljs-built_in">whoami</span>
</code></pre><h2 id="h2-troubleshooting" class="group relative scroll-mt-24">
        <a href="#h2-troubleshooting" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Troubleshooting
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-troubleshooting"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>If you see <code>sudo: command not found</code>, install it in your Dockerfile.</li>
<li>If you get permission errors, check your user and group settings.</li>
<li>For Alpine images, use <code>apk add sudo</code> instead of <code>apt-get install sudo</code>.</li>
</ul>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>You rarely need <code>sudo</code> in Docker containers, since most run as root by default. If you do need it, install and configure it in your Dockerfile, and use the <code>USER</code> directive for better security. Keep your images minimal and only add what you need for your use case.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[How Can I Trigger a Kubernetes Scheduled Job Manually?]]></title>
      <link>https://devops-daily.com/posts/trigger-kubernetes-scheduled-job-manually</link>
      <description><![CDATA[Learn how to manually trigger a Kubernetes Scheduled Job to run on demand. Understand the steps, commands, and best practices for this operation.]]></description>
      <pubDate>Fri, 25 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/trigger-kubernetes-scheduled-job-manually</guid>
      <category><![CDATA[Kubernetes]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Kubernetes]]></category><category><![CDATA[Scheduled Jobs]]></category><category><![CDATA[CronJobs]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<p>Kubernetes Scheduled Jobs, also known as CronJobs, are designed to run tasks at specific intervals. But what if you need to trigger a Scheduled Job manually? This can be useful for testing, debugging, or running a task outside its regular schedule.</p>
<p>In this guide, you&#39;ll learn how to manually trigger a Kubernetes Scheduled Job, along with best practices and potential pitfalls.</p>
<h2 id="h2-prerequisites" class="group relative scroll-mt-24">
        <a href="#h2-prerequisites" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Prerequisites
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-prerequisites"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Before proceeding, ensure the following:</p>
<ul>
<li>You have <code>kubectl</code> installed and configured to access your Kubernetes cluster.</li>
<li>You have permissions to create and manage Jobs in the cluster.</li>
<li>You understand the structure of the CronJob you want to trigger.</li>
</ul>
<h2 id="h2-understanding-cronjobs-and-jobs" class="group relative scroll-mt-24">
        <a href="#h2-understanding-cronjobs-and-jobs" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Understanding CronJobs and Jobs
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-understanding-cronjobs-and-jobs"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>A CronJob in Kubernetes creates Jobs based on a schedule. Each Job represents a single execution of the task defined in the CronJob.</p>
<h3 id="h3-example-cronjob-yaml" class="group relative scroll-mt-24">
        <a href="#h3-example-cronjob-yaml" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example CronJob YAML
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-example-cronjob-yaml"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><pre><code class="hljs language-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">batch/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">CronJob</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">example-cronjob</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">schedule:</span> <span class="hljs-string">&#x27;*/5 * * * *&#x27;</span>
  <span class="hljs-attr">jobTemplate:</span>
    <span class="hljs-attr">spec:</span>
      <span class="hljs-attr">template:</span>
        <span class="hljs-attr">spec:</span>
          <span class="hljs-attr">containers:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">example</span>
              <span class="hljs-attr">image:</span> <span class="hljs-string">busybox</span>
              <span class="hljs-attr">command:</span> [<span class="hljs-string">&#x27;echo&#x27;</span>, <span class="hljs-string">&#x27;Hello, Kubernetes!&#x27;</span>]
          <span class="hljs-attr">restartPolicy:</span> <span class="hljs-string">OnFailure</span>
</code></pre><p>This CronJob runs every 5 minutes and executes a simple <code>echo</code> command.</p>
<h2 id="h2-triggering-a-cronjob-manually" class="group relative scroll-mt-24">
        <a href="#h2-triggering-a-cronjob-manually" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Triggering a CronJob Manually
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-triggering-a-cronjob-manually"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><h3 id="h3-method-1-create-a-job-from-the-cronjob-template" class="group relative scroll-mt-24">
        <a href="#h3-method-1-create-a-job-from-the-cronjob-template" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 1: Create a Job from the CronJob Template
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-method-1-create-a-job-from-the-cronjob-template"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>You can manually create a Job using the CronJob&#39;s template. This bypasses the schedule and runs the task immediately.</p>
<pre><code class="hljs language-bash">kubectl create job --from=cronjob/example-cronjob manual-job
</code></pre><h3 id="h3-explanation" class="group relative scroll-mt-24">
        <a href="#h3-explanation" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Explanation
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-explanation"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><ul>
<li><code>kubectl create job</code>: Creates a new Job.</li>
<li><code>--from=cronjob/example-cronjob</code>: Specifies the CronJob to use as a template.</li>
<li><code>manual-job</code>: The name of the new Job.</li>
</ul>
<h3 id="h3-method-2-edit-the-cronjob-schedule" class="group relative scroll-mt-24">
        <a href="#h3-method-2-edit-the-cronjob-schedule" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Method 2: Edit the CronJob Schedule
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h3-method-2-edit-the-cronjob-schedule"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h3><p>Temporarily change the CronJob&#39;s schedule to run immediately. For example, set the schedule to <code>&quot;* * * * *&quot;</code> to run every minute.</p>
<pre><code class="hljs language-bash">kubectl edit cronjob example-cronjob
</code></pre><p>After the CronJob runs, revert the schedule to its original value.</p>
<pre><code>+-------------------+
|   Kubernetes      |
|                   |
| +---------------+ |
| |   CronJob     | |
| +---------------+ |
| +---------------+ |
| |   Job         | |
| +---------------+ |
| +---------------+ |
| |   Pod         | |
| +---------------+ |
+-------------------+
</code></pre><h2 id="h2-best-practices" class="group relative scroll-mt-24">
        <a href="#h2-best-practices" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Best Practices
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-best-practices"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Use Unique Names</strong>: When creating Jobs manually, use unique names to avoid conflicts.</li>
<li><strong>Monitor Logs</strong>: Check the logs of the Job to ensure it executed successfully.</li>
<li><strong>Revert Changes</strong>: If you edit the CronJob schedule, remember to revert it after the task runs.</li>
</ul>
<h2 id="h2-example-scenario" class="group relative scroll-mt-24">
        <a href="#h2-example-scenario" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Example Scenario
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-example-scenario"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Imagine you have a CronJob that backs up a database every night. You need to run the backup manually during the day to test a new configuration. By creating a Job from the CronJob template, you can trigger the backup without waiting for the scheduled time.</p>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>Manually triggering a Kubernetes Scheduled Job is a straightforward process that can be invaluable for testing and debugging. By following the methods and best practices outlined here, you can run tasks on demand while maintaining the integrity of your cluster.</p>
]]></content:encoded>
    </item>
    <item>
      <title><![CDATA[What Is the Difference Between 'docker compose' and 'docker-compose'?]]></title>
      <link>https://devops-daily.com/posts/docker-compose-vs-docker-compose</link>
      <description><![CDATA[Confused about 'docker compose' vs 'docker-compose'? Learn the key differences, why the new command exists, and which one you should use for your projects.]]></description>
      <pubDate>Thu, 24 Apr 2025 09:00:00 GMT</pubDate>
      <guid isPermaLink="true">https://devops-daily.com/posts/docker-compose-vs-docker-compose</guid>
      <category><![CDATA[Docker]]></category>
      <author><![CDATA[DevOps Daily Team]]></author>
      <category><![CDATA[Docker]]></category><category><![CDATA[docker-compose]]></category><category><![CDATA[CLI]]></category><category><![CDATA[DevOps]]></category>
      <content:encoded><![CDATA[<h2 id="h2-tldr" class="group relative scroll-mt-24">
        <a href="#h2-tldr" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          TLDR
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-tldr"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker compose</code> is the modern, built-in Docker CLI command for managing multi-container apps, while <code>docker-compose</code> is the legacy standalone tool. Both use the same YAML files, but <code>docker compose</code> is the future and offers better integration, new features, and improved performance.</p>
<h2 id="h2-the-old-way-docker-compose" class="group relative scroll-mt-24">
        <a href="#h2-the-old-way-docker-compose" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The Old Way: docker-compose
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-old-way-docker-compose"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker-compose</code> (with a hyphen) is the original tool for running multi-container Docker applications. It&#39;s a separate Python-based binary you install with pip or your package manager:</p>
<pre><code class="hljs language-bash">pip install docker-compose
<span class="hljs-comment"># or</span>
brew install docker-compose
</code></pre><p>You run it like this:</p>
<pre><code class="hljs language-bash">docker-compose up
</code></pre><h2 id="h2-the-new-way-docker-compose" class="group relative scroll-mt-24">
        <a href="#h2-the-new-way-docker-compose" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          The New Way: docker compose
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-the-new-way-docker-compose"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker compose</code> (with a space) is the new subcommand built directly into the Docker CLI. It&#39;s written in Go, ships with Docker Desktop and recent Docker Engine versions, and is the official replacement for the old tool.</p>
<p>You use it like this:</p>
<pre><code class="hljs language-bash">docker compose up
</code></pre><p>No need to install anything extra—just update Docker.</p>
<h2 id="h2-key-differences" class="group relative scroll-mt-24">
        <a href="#h2-key-differences" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Key Differences
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-key-differences"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li><strong>Integration:</strong> <code>docker compose</code> is part of the main Docker CLI, so you get a consistent experience and better support for new Docker features.</li>
<li><strong>Performance:</strong> The new command is faster and uses less memory, especially for large projects.</li>
<li><strong>Features:</strong> Some new features (like Compose profiles, better volume/network handling, and Compose Spec support) are only available in <code>docker compose</code>.</li>
<li><strong>Compatibility:</strong> Both commands use the same <code>docker-compose.yml</code> files, but some edge-case flags or behaviors may differ. Check the <a href="https://docs.docker.com/compose/migrate/">Compose V2 migration guide</a> if you run into issues.</li>
<li><strong>Maintenance:</strong> <code>docker-compose</code> (the old tool) is in maintenance mode. All new development is on <code>docker compose</code>.</li>
</ul>
<h2 id="h2-which-should-you-use" class="group relative scroll-mt-24">
        <a href="#h2-which-should-you-use" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Which Should You Use?
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-which-should-you-use"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><ul>
<li>For new projects, always use <code>docker compose</code>.</li>
<li>For old scripts or CI pipelines, you can keep using <code>docker-compose</code> for now, but plan to migrate.</li>
<li>If you hit a missing feature or bug, check if you&#39;re using the latest Docker version.</li>
</ul>
<h2 id="h2-how-to-check-your-version" class="group relative scroll-mt-24">
        <a href="#h2-how-to-check-your-version" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          How to Check Your Version
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-how-to-check-your-version"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p>To see which Compose you have:</p>
<pre><code class="hljs language-bash">docker compose version
<span class="hljs-comment"># or</span>
docker-compose version
</code></pre><p>If you see a warning about Compose V1 being deprecated, it&#39;s time to switch.</p>
<h2 id="h2-conclusion" class="group relative scroll-mt-24">
        <a href="#h2-conclusion" class="no-underline text-inherit hover:text-inherit focus:outline-none focus:ring-0 focus:ring-offset-0">
          Conclusion
        </a>
        <button 
          class="copy-heading-link absolute -left-8 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-all duration-200 p-1.5 rounded-md hover:bg-muted/80 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-muted-foreground hover:text-foreground"
          aria-label="Copy link to section"
          data-heading-id="h2-conclusion"
        >
          <svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 
              d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" />
            </svg>
          </button>
        </h2><p><code>docker compose</code> is the modern, supported way to manage multi-container Docker apps. It replaces the old <code>docker-compose</code> tool, brings new features, and is the best choice for future-proofing your workflow. Update your Docker installation and start using the new command for a smoother experience.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>