<?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: Dmitriy (s8kur)</title>
    <description>The latest articles on DEV Community by Dmitriy (s8kur) (@s8kur).</description>
    <link>https://dev.to/s8kur</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%2F4213933%2Fd16779e4-5763-4d20-818f-07797ef423f8.jpg</url>
      <title>DEV Community: Dmitriy (s8kur)</title>
      <link>https://dev.to/s8kur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/s8kur"/>
    <language>en</language>
    <item>
      <title>Why your monitor says a crash-looping Docker container is up, and how to catch it</title>
      <dc:creator>Dmitriy (s8kur)</dc:creator>
      <pubDate>Wed, 28 Oct 2026 22:05:09 +0000</pubDate>
      <link>https://dev.to/s8kur/why-your-monitor-says-a-crash-looping-docker-container-is-up-and-how-to-catch-it-290c</link>
      <guid>https://dev.to/s8kur/why-your-monitor-says-a-crash-looping-docker-container-is-up-and-how-to-catch-it-290c</guid>
      <description>&lt;p&gt;A container that crashes every few seconds can sit behind a green uptime check for hours. This post is about why that happens and the free ways I now use to catch it, whatever monitoring tool you run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a crash loop looks like
&lt;/h2&gt;

&lt;p&gt;Most compose files set a restart policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;   &lt;span class="c1"&gt;# or: always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the process exits, Docker starts it again. If it crashes on startup, for example because a database is unreachable or a config value is wrong, you get a loop: start, run for a few seconds, exit, wait, start again. Docker increases the delay between restarts (it starts at 100 ms and doubles, up to a cap), and resets it once the container has stayed up for 10 seconds.&lt;/p&gt;

&lt;p&gt;If you run &lt;code&gt;docker ps&lt;/code&gt; at the wrong moment, you see this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STATUS
Up 2 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it again a bit later and you might see &lt;code&gt;Restarting (1) 5 seconds ago&lt;/code&gt;. The container is broken, but a lot of the time it looks alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why normal checks miss it or flap
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Is it running" checks.&lt;/strong&gt; A check that asks Docker whether the container state is &lt;code&gt;running&lt;/code&gt; will say yes for every sample that lands in the short window between start and crash. Depending on your interval and how long the app lives, you get mostly green with the occasional red.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain HTTP checks.&lt;/strong&gt; These do better, but not always. If the app serves a page or a health endpoint for a few seconds before it dies, some probes succeed. If you also require two or three consecutive failures before alerting, which is a sensible way to avoid noise, the successful probes in between keep resetting that counter. You end up with a check that flaps or never alerts at all.&lt;/p&gt;

&lt;p&gt;The useful signal is not "is it up right now" but "how many times has it restarted lately". Docker already tracks that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free way 1: watch RestartCount
&lt;/h2&gt;

&lt;p&gt;Every container has a restart counter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s1"&gt;'{{.RestartCount}}'&lt;/span&gt; app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The number only goes up while that container exists. If you recreate it (for example &lt;code&gt;docker compose up&lt;/code&gt; after an image change), the new container starts at 0. A healthy service should keep this number flat. If it climbs a few times in ten minutes, something is wrong, even if every HTTP check you sampled was fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free way 2: the events stream
&lt;/h2&gt;

&lt;p&gt;Docker emits an event every time a container dies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker events &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="nv"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;die &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Time}} {{.Actor.Attributes.name}} exit={{.Actor.Attributes.exitCode}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is good for seeing a loop live, or for piping into a log. It is a stream, so you need something that keeps running and counts events. If that watcher stops, you miss events, so I prefer polling RestartCount for alerting and use events for debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free way 3: HEALTHCHECK plus autoheal
&lt;/h2&gt;

&lt;p&gt;If your image defines a &lt;code&gt;HEALTHCHECK&lt;/code&gt;, Docker reports &lt;code&gt;starting&lt;/code&gt;, &lt;code&gt;healthy&lt;/code&gt; or &lt;code&gt;unhealthy&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;docker inspect &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s1"&gt;'{{.State.Health.Status}}'&lt;/span&gt; app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker itself does not restart a container because it is unhealthy. The popular willfarrell/autoheal container watches for unhealthy containers that carry an &lt;code&gt;autoheal=true&lt;/code&gt; label (or all of them, if you configure it) and restarts them.&lt;/p&gt;

&lt;p&gt;This is useful, but know its limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It only helps when the process keeps running but stops working. A crash loop is the opposite case: the process exits, and the restart policy is already restarting it.&lt;/li&gt;
&lt;li&gt;It restarts, it does not tell you. Something that keeps getting fixed every few minutes can stay broken for weeks without anyone noticing.&lt;/li&gt;
&lt;li&gt;It needs access to the Docker socket, which is effectively root on the host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I treat healthchecks as a signal to alert on, and autoheal as an optional extra.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small script that alerts on a restart loop
&lt;/h2&gt;

&lt;p&gt;This script polls RestartCount and prints an alert when the count rises N or more times within M minutes. I tested it against a container started with &lt;code&gt;--restart always&lt;/code&gt; and a command that exits after 2 seconds; it alerted within a minute.&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="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# restart-watch.sh CONTAINER [N] [M_MINUTES] [INTERVAL_SECONDS]&lt;/span&gt;
&lt;span class="c"&gt;# Alerts when RestartCount rises N or more times within M minutes.&lt;/span&gt;
&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;every&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; container [n] [minutes] [interval]"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;hist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;   &lt;span class="c"&gt;# lines of "epoch count"&lt;/span&gt;
&lt;span class="nv"&gt;alerted&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="k"&gt;while&lt;/span&gt; :&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;now&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;cnt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;docker inspect &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s1"&gt;'{{.RestartCount}}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cannot inspect &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$every&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="nv"&gt;hist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n%s %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hist&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$now&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cnt&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nb"&gt;cut&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;now &lt;span class="o"&gt;-&lt;/span&gt; m&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="s1"&gt;'NF==2 &amp;amp;&amp;amp; $1&amp;gt;=cut'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;oldest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hist&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n1&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;rise&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;cnt &lt;span class="o"&gt;-&lt;/span&gt; oldest&lt;span class="k"&gt;))&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rise&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;hist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$now&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$cnt&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;rise&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;   &lt;span class="c"&gt;# container recreated&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$rise&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$alerted&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="s2"&gt;: restart loop, &lt;/span&gt;&lt;span class="nv"&gt;$rise&lt;/span&gt;&lt;span class="s2"&gt; restarts in &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;m&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; min (RestartCount=&lt;/span&gt;&lt;span class="nv"&gt;$cnt&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
      &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$msg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
      &lt;span class="c"&gt;# curl -fsS -d "$msg" https://ntfy.sh/your-topic&lt;/span&gt;
      &lt;span class="nv"&gt;alerted&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
    &lt;span class="k"&gt;fi
  else
    &lt;/span&gt;&lt;span class="nv"&gt;alerted&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;sleep&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$every&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it as &lt;code&gt;./restart-watch.sh app 3 10 30&lt;/code&gt;: alert if &lt;code&gt;app&lt;/code&gt; restarts 3 times in 10 minutes, checking every 30 seconds. Replace the &lt;code&gt;echo&lt;/code&gt; with whatever you use for notifications (the commented line posts to ntfy). It alerts once per loop and re-arms when the count goes quiet. If the count goes backwards, the container was recreated and the history resets. Run it under systemd or in a small container with the socket mounted read-only, and keep the same caveat about socket access as above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure: I build Vigil
&lt;/h2&gt;

&lt;p&gt;I am the developer of Vigil, a self-hosted monitoring and incident tool, so read this part with that in mind.&lt;/p&gt;

&lt;p&gt;I added it to Vigil Core 1.31.0. The Docker check now samples RestartCount, and by default 3 restarts within 10 minutes marks the monitor down with a message like &lt;code&gt;restart loop: 3 restarts in 10 min&lt;/code&gt;. A HEALTHCHECK status of &lt;code&gt;unhealthy&lt;/code&gt; also counts as down by default. Both are configurable under Advanced (the threshold, the window, and turning either off). This is in the free, Apache 2.0 Core. Automatically restarting the container through a hook is part of the paid Commercial edition.&lt;/p&gt;

&lt;p&gt;Someone also reported this exact case for Uptime Kuma in &lt;a href="https://github.com/louislam/uptime-kuma/issues/7956" rel="noopener noreferrer"&gt;issue #7956&lt;/a&gt;, so it is a common gap, not a quirk of one tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guide: &lt;a href="https://vigil-uptime.com/guides/auto-restart-on-failure/" rel="noopener noreferrer"&gt;https://vigil-uptime.com/guides/auto-restart-on-failure/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/sikurdev/vigil-core" rel="noopener noreferrer"&gt;https://github.com/sikurdev/vigil-core&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever you use, the main point stands: alert on the restart count, not only on whether the container is up right now.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was drafted with help from an AI assistant and reviewed by me. The script was tested on a real container before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>monitoring</category>
      <category>selfhosted</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
