<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>#Docker — Seconds to Midnight</title><description>Content tagged with #Docker.</description><link>https://dbuho.me</link><language>en</language><copyright>© 2026 Damián Búho</copyright><managingEditor>damian.buho@proton.me (Damián Búho)</managingEditor><webMaster>damian.buho@proton.me (Damián Búho)</webMaster><lastBuildDate>Thu, 12 Nov 2026 16:25:24 GMT</lastBuildDate><category>Resilience</category><ttl>60</ttl><image><url>https://dbuho.me/favicon-48x48.png</url><title>#Docker — Seconds to Midnight</title><link>https://dbuho.me</link></image><atom:link rel="self" type="application/rss+xml" href="https://dbuho.me/tags/docker.rss"/><item><title>Post: What is image distillation?</title><link>https://dbuho.me/post/what-is-image-distillation/?utm_source=tag-docker&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBT8KSGE56K90ATV87MDZH</guid><description>There are at least four ways to go about building container images: Small distributions, like Alpine Cut-down server versions (e.g., debian-slim ) Whatever tf Ubuntu Chiseled is Distroless I use a fifth one.</description><pubDate>Tue, 16 Jun 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;There are at least four ways to go about building container images:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small distributions, like Alpine&lt;/li&gt;
&lt;li&gt;Cut-down server versions (e.g., &lt;code&gt;debian-slim&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Whatever tf Ubuntu Chiseled is&lt;/li&gt;
&lt;li&gt;Distroless&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use a fifth one.&lt;/p&gt;
&lt;h2&gt;Pain&lt;/h2&gt;
&lt;p&gt;In my experience, no one really likes building Alpine images, but because they&amp;#39;re so lean, people feel forced to. MUSL, busybox, ash, python issues, package names often differ, command flags vary slightly, and so on.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve used Ubuntu/Debian as an image base since 2018 because my developers were Debian-oriented and felt much more confident whenever they had to operate inside containers to debug.&lt;/p&gt;
&lt;p&gt;In production, though, Debian-based images are far from perfect. Debian has long confused &amp;#39;paleolithic&amp;#39; with &amp;#39;stability.&amp;#39; Meanwhile, Canonical adds useless thingamajigs like Pebble—complete with a bunch of Go stdlib vulnerabilities—or ruins RISC-V compatibility with an unnecessary move to vector extensions.&lt;/p&gt;
&lt;p&gt;Distroless images are pure and perfect — and also feel like a war crime when you&amp;#39;re actually building them. Every single dependency has to be hand-crafted, and you constantly feel phantom pain from missing basic shell tools.&lt;/p&gt;
&lt;p&gt;Don&amp;#39;t get me wrong: I love it, but it&amp;#39;s a kink.&lt;/p&gt;
&lt;h2&gt;Distillation&lt;/h2&gt;
&lt;p&gt;To keep a cozy environment while working on a project, while simultaneously stripping down the attack surface of the production image, I use a technique I call &lt;strong&gt;image distillation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s fairly obvious (I&amp;#39;m pretty sure many people do this, I didn&amp;#39;t invent anything), but I haven&amp;#39;t found an established term for it yet (I&amp;#39;d be glad to be proven wrong if you know one).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Build in whatever base image you like: Alpine, Ubuntu, or whatever Red Hat is calling their server distro this week.&lt;/li&gt;
&lt;li&gt;At the end of that build stage, &lt;code&gt;COPY&lt;/code&gt; everything you actually need (binary + libraries + runtime data) into a single folder (mine is usually called &lt;code&gt;/export&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Add a final stage with &lt;code&gt;FROM scratch&lt;/code&gt; or &lt;code&gt;FROM distroless&lt;/code&gt;, with a single &lt;code&gt;COPY --from=builder /export /&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You get the fat-free security of distroless in production with the developer pleasantries of a full OS during build time.&lt;/p&gt;
&lt;p&gt;You won&amp;#39;t get any progress in understanding the meaning of life or finding true love, though.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s just a slim container image, what did you expect?&lt;/p&gt;</content:encoded><category>Developer Experience</category><category>Containerization</category><category>Debian</category><category>Ubuntu</category><category>Docker</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Post: What is B19 images and how I wrap things in containers</title><link>https://dbuho.me/post/what-is-b19/?utm_source=tag-docker&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBSDTEQ9SDFATFNBFXEQ7B</guid><description>A big part of my portfolio consists of so-called b19-style images. (b19 means nothing—you just can&amp;#39;t get a proper namespace these days.) It started as an internal effort for my personal and commercial projects, but ended up as a set of conventions unified across 100+ various images (both wrappers and originals). I wanted every container to behave in a predictable way, agnostic of the tech stack, whether it&amp;#39;s a source-based or upstream-based project. I&amp;#39;m not urging anyone to adopt this directly yet—I need some time in public to polish everything—but if you&amp;#39;re tasked with a similar unification job or manage a fleet, feel free to steal the conventions. The conventions are anchored in B19/Ubuntu and flow organically into all downstream projects. The conventions are unopinionated (though the defaults can be). What&amp;#39;s inside?</description><pubDate>Tue, 09 Jun 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;A big part of my portfolio consists of so-called b19-style images.&lt;br /&gt;
&lt;em&gt;(b19 means nothing—you just can&amp;#39;t get a proper namespace these days.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It started as an internal effort for my personal and commercial projects, but ended up as a set of conventions unified across 100+ various images (both wrappers and originals). I wanted every container to behave in a predictable way, agnostic of the tech stack, whether it&amp;#39;s a source-based or upstream-based project.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m not urging anyone to adopt this directly yet—I need some time in public to polish everything—but if you&amp;#39;re tasked with a similar unification job or manage a fleet, feel free to steal the conventions.&lt;/p&gt;
&lt;p&gt;The conventions are anchored in &lt;a href=&quot;https://dbuho.me/project/b19-ubuntu/&quot;&gt;B19/Ubuntu&lt;/a&gt; and flow organically into all downstream projects.&lt;br /&gt;
The conventions are unopinionated (though the defaults can be).&lt;/p&gt;
&lt;p&gt;What&amp;#39;s inside?&lt;/p&gt;
&lt;h2&gt;Basic container decency&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Follows 12-factor app guidelines&lt;/li&gt;
&lt;li&gt;Reasonable, secure, and safe defaults with minimal user input required&lt;/li&gt;
&lt;li&gt;Images should be immutable; all state lives in volumes&lt;/li&gt;
&lt;li&gt;Support for XDG and other industry standards&lt;/li&gt;
&lt;li&gt;Proper telemetry everywhere&lt;/li&gt;
&lt;li&gt;File operations use locks, always keeping concurrency in mind&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Dockerfile orchestrates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No shell sagas&lt;/li&gt;
&lt;li&gt;No mile-long &lt;code&gt;RUN&lt;/code&gt; commands—one &lt;code&gt;RUN&lt;/code&gt; per stage&lt;/li&gt;
&lt;li&gt;Minimal layers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Switches, toggles, handles&lt;/h2&gt;
&lt;p&gt;B19-style images expose switches for all kinds of behavior: there&amp;#39;s no such thing as &amp;quot;too many switches.&amp;quot; Where possible, switches are set via environment variables (relying on various mounts and binds is messy).&lt;br /&gt;
Configuration files are generated via Jinja2 templates driven by environment variables.&lt;/p&gt;
&lt;h2&gt;Everything is &lt;code&gt;.d&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Numbered hooks everywhere. Everything can be extended or overridden via simple drop-in shell scripts in downstream projects. Hooks can be inherited:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build is &lt;code&gt;build.d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Healthcheck is &lt;code&gt;healthcheck.d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Entrypoint is &lt;code&gt;entrypoint.d&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Designed with off-grid in mind&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Do not assume connectivity is guaranteed&lt;/li&gt;
&lt;li&gt;Do not assume fast or stable connectivity&lt;/li&gt;
&lt;li&gt;Timeouts, backoffs, and retries everywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, a b19 distribution comes with all the things you would end up adding to an official image anyway—right out of the box.&lt;/p&gt;</content:encoded><category>Meta</category><category>Containerization</category><category>Docker</category><category>Continuous Integration</category><category>Continuous Deployment</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Project: Doomsday Clock Exporter — Make your O11Y depressing AF!</title><link>https://dbuho.me/project/doomsday-clock-exporter/?utm_source=tag-docker&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8VEEWTS8MR8GA4S4QMJ</guid><description>When you did everything right, your observability stack becomes boring. Just bunch of green numbers and predictable plots. I asked myself, What if I could add the existential dread in my Grafana, just to feel something again?</description><pubDate>Tue, 28 Apr 2026 03:12:51 GMT</pubDate><content:encoded>&lt;p&gt;When you did everything right, your observability stack becomes boring.
Just bunch of green numbers and predictable plots.
I asked myself, What if I could add the existential dread in my Grafana, just to feel something
again?&lt;/p&gt;</content:encoded><category>Prometheus</category><category>Language: Go</category><category>Docker</category><author>damian.buho@proton.me (Damián Búho)</author></item></channel></rss>