<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roman Pinchuk</title>
    <description>The latest articles on DEV Community by Roman Pinchuk (@romanpinchuk).</description>
    <link>https://dev.to/romanpinchuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F327954%2F2d7b9dbe-75e2-4a4c-bc3c-153603c4c6e3.png</url>
      <title>DEV Community: Roman Pinchuk</title>
      <link>https://dev.to/romanpinchuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/romanpinchuk"/>
    <language>en</language>
    <item>
      <title>Stop Downloading Duplicate Browsers: Use System Chrome with Puppeteer and Playwright</title>
      <dc:creator>Roman Pinchuk</dc:creator>
      <pubDate>Sun, 02 Aug 2026 11:09:53 +0000</pubDate>
      <link>https://dev.to/romanpinchuk/stop-downloading-duplicate-browsers-use-system-chrome-with-puppeteer-and-playwright-3flo</link>
      <guid>https://dev.to/romanpinchuk/stop-downloading-duplicate-browsers-use-system-chrome-with-puppeteer-and-playwright-3flo</guid>
      <description>&lt;p&gt;Browser automation tools are convenient until each project quietly downloads another browser. On macOS, Puppeteer and Playwright can each keep several gigabytes of Chromium builds in their caches, even when Google Chrome is already installed and up to date.&lt;/p&gt;

&lt;p&gt;For local automation that only needs Chrome, I use the system browser instead. That reclaimed more than 4 GB on my machine and still lets Puppeteer, Playwright Test, Playwright CLI, and Playwright MCP do their jobs.&lt;/p&gt;

&lt;p&gt;This is a local-development optimization, not a replacement for Playwright's pinned browsers. Keep reading for the trade-offs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check what is using the space
&lt;/h2&gt;

&lt;p&gt;Puppeteer and Playwright keep their downloaded browsers in separate macOS caches. Check their sizes before deleting anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/.cache/puppeteer 2&amp;gt;/dev/null
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/Library/Caches/ms-playwright 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;~/.cache/puppeteer&lt;/code&gt; contains Puppeteer's downloaded Chrome or Chrome for Testing builds. &lt;code&gt;~/Library/Caches/ms-playwright&lt;/code&gt; contains the browsers installed for Playwright.&lt;/p&gt;

&lt;p&gt;First make sure that regular Google Chrome is installed at the standard macOS location:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Google Chrome is available"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Point Puppeteer at system Chrome
&lt;/h2&gt;

&lt;p&gt;Set &lt;code&gt;PUPPETEER_EXECUTABLE_PATH&lt;/code&gt; to make Puppeteer use the already-installed Google Chrome executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PUPPETEER_EXECUTABLE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add that export to the shell profile you use for local automation, such as &lt;code&gt;~/.zshrc&lt;/code&gt;, if it should persist between terminals.&lt;/p&gt;

&lt;p&gt;Puppeteer can also be configured explicitly in code. This is useful when a project should be self-contained instead of relying on its caller's environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;executablePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headless&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;networkidle2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a real workflow, such as PDF generation, before removing the cache. It confirms that permissions, launch arguments, and any fonts used by your automation work with system Chrome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Playwright to use Chrome
&lt;/h2&gt;

&lt;p&gt;Playwright treats installed, branded browsers as channels. Choosing the &lt;code&gt;chrome&lt;/code&gt; channel selects the regular Google Chrome installation rather than Playwright's bundled Chromium.&lt;/p&gt;

&lt;p&gt;For Playwright Test, configure the project with &lt;code&gt;channel: 'chrome'&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;devices&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Google Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Desktop Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For one-off browsing with Playwright CLI, select the same channel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;playwright-cli open https://example.com &lt;span class="nt"&gt;--browser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playwright MCP accepts the browser either as an argument or an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @playwright/mcp@latest &lt;span class="nt"&gt;--browser&lt;/span&gt; chrome

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PLAYWRIGHT_MCP_BROWSER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Chrome is installed somewhere nonstandard, Playwright MCP also provides &lt;code&gt;--executable-path&lt;/code&gt; for an explicit executable location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optionally default Playwright CLI to Chrome
&lt;/h2&gt;

&lt;p&gt;Passing &lt;code&gt;--browser=chrome&lt;/code&gt; is explicit and works well for one-off commands. If every local &lt;code&gt;playwright-cli&lt;/code&gt; session should use regular Chrome, use the CLI's global configuration instead of a shell function. Create &lt;code&gt;~/.playwright/cli.config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.playwright
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"browserName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chromium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"launchOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chrome"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The global config applies to every &lt;code&gt;playwright-cli&lt;/code&gt; command, including &lt;code&gt;open&lt;/code&gt;, without modifying &lt;code&gt;~/.zshrc&lt;/code&gt;. A project-level &lt;code&gt;.playwright/cli.config.json&lt;/code&gt; or an explicit option still overrides it when a workflow needs a different browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;playwright-cli open https://example.com
playwright-cli open https://example.com &lt;span class="nt"&gt;--browser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Skipping downloads is not browser selection
&lt;/h2&gt;

&lt;p&gt;This environment variable prevents Playwright from downloading browser binaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; tell Playwright which browser to launch. Without &lt;code&gt;channel: 'chrome'&lt;/code&gt;, &lt;code&gt;--browser=chrome&lt;/code&gt;, a Playwright CLI global or project config, &lt;code&gt;PLAYWRIGHT_MCP_BROWSER=chrome&lt;/code&gt;, or another explicit configuration, a workflow may still expect Playwright's bundled Chromium.&lt;/p&gt;

&lt;p&gt;Likewise, &lt;code&gt;PUPPETEER_EXECUTABLE_PATH&lt;/code&gt; selects an executable for Puppeteer; it does not remove browser files which have already been downloaded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean caches after verification
&lt;/h2&gt;

&lt;p&gt;Once the Puppeteer script and relevant Playwright workflows succeed with Chrome, remove the downloaded browser caches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.cache/puppeteer
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/Library/Caches/ms-playwright
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the size check again to confirm the disk space has been recovered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/.cache/puppeteer ~/Library/Caches/ms-playwright 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next project that needs a managed browser can download it again. If cache location is the concern rather than cache size, Puppeteer supports &lt;code&gt;PUPPETEER_CACHE_DIR&lt;/code&gt; and Playwright supports &lt;code&gt;PLAYWRIGHT_BROWSERS_PATH&lt;/code&gt; to store downloads elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep managed browsers where they matter
&lt;/h2&gt;

&lt;p&gt;System Chrome is a good choice for local Chrome-only automation. It is not a substitute for the browser binaries pinned by Playwright:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Playwright-managed browsers when testing Chromium, Firefox, or WebKit.&lt;/li&gt;
&lt;li&gt;Use them in CI when reproducibility matters more than saving local disk space.&lt;/li&gt;
&lt;li&gt;Keep the official Playwright Docker or DevContainer image for containerized tests. Its matching browser binaries live inside the container image, so deleting host caches does not affect those runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical split is simple: use system Chrome for local automation that targets Chrome, and keep Playwright's managed browsers where cross-browser coverage and repeatability are part of the requirement.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Keep automating.&lt;/em&gt; 🫡&lt;/p&gt;

</description>
      <category>automation</category>
      <category>performance</category>
      <category>playwright</category>
    </item>
    <item>
      <title>Docker Engine v29: Fixing "API Version Mismatch" Error</title>
      <dc:creator>Roman Pinchuk</dc:creator>
      <pubDate>Sun, 02 Aug 2026 10:53:47 +0000</pubDate>
      <link>https://dev.to/romanpinchuk/docker-engine-v29-fixing-api-version-mismatch-error-15j6</link>
      <guid>https://dev.to/romanpinchuk/docker-engine-v29-fixing-api-version-mismatch-error-15j6</guid>
      <description>&lt;p&gt;If you've recently upgraded to &lt;strong&gt;Docker Engine - Community Version 29&lt;/strong&gt;, you might have hit a frustrating API version mismatch error.&lt;/p&gt;

&lt;p&gt;Specifically, you might see an error indicating that a minimum API version &lt;code&gt;&amp;gt;= 1.44&lt;/code&gt; is required. This often happens when your tools or CI/CD agents are trying to communicate with the updated daemon using an older API protocol, and the new Docker default policies are too strict.&lt;/p&gt;

&lt;p&gt;As an Automation Engineer, I encounter this when legacy scripts or older &lt;code&gt;docker-compose&lt;/code&gt; binaries clash with the bleeding-edge runtime. We need a way to bridge that gap without downgrading the entire engine.&lt;/p&gt;

&lt;p&gt;Here is the quick fix to force Docker to accept a lower minimum API version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Configure &lt;code&gt;daemon.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The solution is to explicitly tell the Docker daemon to support an older API version. We do this by modifying (or creating) the &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;We are going to set the &lt;code&gt;min-api-version&lt;/code&gt; to &lt;code&gt;1.32&lt;/code&gt;. This is a robust baseline that supports most tools while still allowing the daemon to run its latest core.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Edit the Configuration
&lt;/h3&gt;

&lt;p&gt;Open the daemon configuration file in your text editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/docker/daemon.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add (or merge) the following configuration object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"min-api-version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.32"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; If your &lt;code&gt;daemon.json&lt;/code&gt; already contains other settings (like insecure registries or log drivers), make sure you append this key correctly to the existing JSON object. Invalid JSON will prevent Docker from starting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Restart Docker Service
&lt;/h3&gt;

&lt;p&gt;Configuration changes only apply after a service restart. Reload the daemon:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Verify the Fix
&lt;/h3&gt;

&lt;p&gt;Ensure the service is back up and verify the API negotiation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now see that the daemon is willing to speak with older clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;Docker v29 pushes the envelope on API standards. By default, it may deprecate older API versions to encourage security and feature parity. However, in the real world of enterprise automation, we don't always control the client version (e.g., a Jenkins plugin or a vendor-locked utility).&lt;/p&gt;

&lt;p&gt;Setting &lt;code&gt;"min-api-version": "1.32"&lt;/code&gt; effectively lowers the "minimum height requirement" for this ride, letting your existing automation suite continue to function with the modern engine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Keep automating.&lt;/em&gt; 🫡&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
