<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xx="tags" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Containers - Ken Muse</title><atom:link href="https://www.kenmuse.com/tags/containers/rss/" rel="self" type="application/rss+xml"/><link>https://www.kenmuse.com/tags/containers/</link><description>Discover Azure, DevOps, and development insights with Ken Muse, a DevOps Architect at GitHub and 4x Microsoft Azure MVP</description><language>en-us</language><sy:updatePeriod>weekly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><image><title>Containers - Ken Muse</title><link>https://www.kenmuse.com/tags/containers/</link><width>32</width><url>https://www.kenmuse.com/tags/containers/favicon/favicon-32x32.png</url><height>32</height></image><atom:link href="https://www.kenmuse.com/tags/containers/rss/index.xml" rel="self" type="application/rss+xml"/><item><title>Pinning VS Code Extensions to Fight Supply Chain Attacks</title><link>https://www.kenmuse.com/blog/pinning-vscode-extensions-to-fight-supply-chain-attacks/</link><pubDate>Thu, 30 Apr 2026 00:00:00 -0400</pubDate><guid isPermaLink="false">pinning-vscode-extensions-to-fight-supply-chain-attacks</guid><category>DevOps</category><category>Security</category><category>Containers</category><description>Pin VS Code extension versions in dev containers to prevent supply chain attacks. Treat extension updates like dependency upgrades -- deliberate and reviewed.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/pinning-vscode-extensions-to-fight-supply-chain-attacks/images/banner.png"/></item><item><title>Rootless Docker and Its Hidden Security Trade-Offs</title><link>https://www.kenmuse.com/blog/rootless-docker-and-its-hidden-security-trade-offs/</link><pubDate>Thu, 23 Apr 2026 00:00:00 -0400</pubDate><guid isPermaLink="false">rootless-docker-and-its-hidden-security-trade-offs</guid><category>Containers</category><category>DevOps</category><category>Security</category><description>Explore how rootless Docker uses user namespaces, why kernel developers have concerns about the attack surface, and what unconfined flags really disable.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/rootless-docker-and-its-hidden-security-trade-offs/images/banner.png"/></item><item><title>How Docker Uses Root Privileges</title><link>https://www.kenmuse.com/blog/how-docker-uses-root-privileges/</link><pubDate>Thu, 16 Apr 2026 00:00:00 -0400</pubDate><guid isPermaLink="false">how-docker-uses-root-privileges</guid><category>Containers</category><category>DevOps</category><category>Security</category><description>Trace how Docker's daemon, socket, image builds, and BuildKit all rely on root-level Linux kernel privileges.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/how-docker-uses-root-privileges/images/banner.png"/></item><item><title>Building Container Isolation From the Linux Kernel Up</title><link>https://www.kenmuse.com/blog/building-container-isolation-from-linux-kernel-up/</link><pubDate>Thu, 09 Apr 2026 00:00:00 -0400</pubDate><guid isPermaLink="false">building-container-isolation-from-linux-kernel-up</guid><category>Containers</category><category>DevOps</category><category>Security</category><description>Build container isolation from scratch with Linux namespaces and cgroups to understand the kernel features Docker uses.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-container-isolation-from-linux-kernel-up/images/banner.png"/></item><item><title>Pre-Caching Docker Images on GitHub Runner Custom Images</title><link>https://www.kenmuse.com/blog/pre-caching-docker-images-on-github-runner-custom-images/</link><pubDate>Wed, 17 Dec 2025 00:00:00 -0500</pubDate><guid isPermaLink="false">pre-caching-docker-images-on-github-runner-custom-images</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>Discover how to improve GitHub Actions performance and drastically cut the time and bandwidth required to use Docker images in your workflows.</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/pre-caching-docker-images-on-github-runner-custom-images/images/cached-docker.webp"/></item><item><title>How I Avoided Shai-Hulud's Second Coming (Part 1)</title><link>https://www.kenmuse.com/blog/how-i-avoided-shai-hulud-second-coming-part-1/</link><pubDate>Wed, 26 Nov 2025 00:00:00 -0500</pubDate><guid isPermaLink="false">how-i-avoided-shai-hulud-second-coming-part-1</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><category>Security</category><description>Simple security practices that protected my dev environment from the Shai-Hulud supply chain attack -- and how you can use them too.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/how-i-avoided-shai-hulud-second-coming-part-1/images/desert-worm.png"/></item><item><title>Understanding IPv6: From GitHub's IPs to Kubernetes and ARC</title><link>https://www.kenmuse.com/blog/understanding-ipv6-from-github-to-kubernetes-arc/</link><pubDate>Sat, 08 Nov 2025 00:00:00 -0500</pubDate><guid isPermaLink="false">understanding-ipv6-from-github-to-kubernetes-arc</guid><category>Containers</category><category>DevOps</category><category>General</category><description>Learn how IPv6 affects your DevOps workflows, from GitHub's IP ranges to Kubernetes networking, Docker containers, and the latest ARC improvements.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/understanding-ipv6-from-github-to-kubernetes-arc/images/docker-desktop.png"/></item><item><title>Adding Help (man) to Buildroot Packages</title><link>https://www.kenmuse.com/blog/adding-help-with-man-to-buildroot-packages/</link><pubDate>Fri, 22 Aug 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">adding-help-with-man-to-buildroot-packages</guid><category>Containers</category><category>DevOps</category><description>A step-by-step guide to adding configurable man page support to custom Buildroot packages, extending the GitHub CLI package with comprehensive documentation.</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/adding-help-with-man-to-buildroot-packages/images/menu-ghcli.webp"/></item><item><title>Creating a CodeQL Image for ARC With Python 2</title><link>https://www.kenmuse.com/blog/creating-a-codeql-image-for-arc-with-python-2/</link><pubDate>Thu, 24 Jul 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">creating-a-codeql-image-for-arc-with-python-2</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>Add Python 2 support to your CodeQL Docker image using multistage builds (and some Docker tricks) to support security scanning in ARC.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/creating-a-codeql-image-for-arc-with-python-2/images/banner.png"/></item><item><title>Creating a CodeQL Image for ARC</title><link>https://www.kenmuse.com/blog/creating-a-codeql-image-for-arc/</link><pubDate>Sat, 19 Jul 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">creating-a-codeql-image-for-arc</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>Learn how to build a custom Docker image with CodeQL pre-installed for GitHub ARC runners, eliminating download times and ensuring consistent analysis.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/creating-a-codeql-image-for-arc/images/banner2.png"/></item><item><title>Creating a Custom Buildroot Package For Binaries</title><link>https://www.kenmuse.com/blog/creating-a-custom-buildroot-package-for-binaries/</link><pubDate>Fri, 11 Jul 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">creating-a-custom-buildroot-package-for-binaries</guid><category>Containers</category><category>DevOps</category><description>A step-by-step guide to creating your first custom Buildroot package for a binary package containing an installable GitHub CLI.</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/creating-a-custom-buildroot-package-for-binaries/images/banner.webp"/></item><item><title>Speeding Up the Buildroot Toolchain</title><link>https://www.kenmuse.com/blog/speeding-up-the-buildroot-toolchain/</link><pubDate>Sat, 05 Jul 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">speeding-up-the-buildroot-toolchain</guid><category>Containers</category><category>DevOps</category><description>Speed up your Buildroot builds with prebuilt toolchains, SDK reuse, and CI/CD caching. Enjoy faster results and less frustration!</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/speeding-up-the-buildroot-toolchain/images/toolchain-options.webp"/></item><item><title>Configuring Buildroot for Crafting Images</title><link>https://www.kenmuse.com/blog/configuring-buildroot-for-crafting-images/</link><pubDate>Wed, 25 Jun 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">configuring-buildroot-for-crafting-images</guid><category>Containers</category><category>DevOps</category><description>Learn how to use Buildroot's menu system to create and configure a minimal, Bash-only image for Docker.</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/configuring-buildroot-for-crafting-images/images/menu-main.webp"/></item><item><title>Building OCI Images With Buildroot</title><link>https://www.kenmuse.com/blog/building-oci-images-with-buildroot/</link><pubDate>Sat, 21 Jun 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">building-oci-images-with-buildroot</guid><category>Containers</category><category>DevOps</category><description>Build Docker images and OCI packages easily with Buildroot. Learn to automate, customize, and simplify your image creation process.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-oci-images-with-buildroot/images/banner.png"/></item><item><title>Building OCI Images Without Using Docker</title><link>https://www.kenmuse.com/blog/building-oci-images-without-using-docker/</link><pubDate>Fri, 13 Jun 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">building-oci-images-without-using-docker</guid><category>Containers</category><category>DevOps</category><description>Learn what's in an Open Container Image and how to build your own images without Docker using some common command line tools.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-oci-images-without-using-docker/images/banner.png"/></item><item><title>Calling Docker From Inside a GitHub Job Container</title><link>https://www.kenmuse.com/blog/calling-docker-from-inside-a-github-job-container/</link><pubDate>Sat, 24 May 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">calling-docker-from-inside-a-github-job-container</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>Learn to run Docker commands inside a GitHub Actions job container and understand the magic behind how Actions creates and manages job and service containers.</description><enclosure type="image/ebp" url="https://www.kenmuse.com/blog/calling-docker-from-inside-a-github-job-container/images/banner.webp"/></item><item><title>Authenticating Docker in Docker Containers in Kubernetes</title><link>https://www.kenmuse.com/blog/authenticating-docker-in-docker-containers-in-kubernetes/</link><pubDate>Sat, 17 May 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">authenticating-docker-in-docker-containers-in-kubernetes</guid><category>Containers</category><category>DevOps</category><description>Discover how to securely authenticate Docker-in-Docker containers inside Kubernetes to enable private registry access.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/authenticating-docker-in-docker-containers-in-kubernetes/images/banner.png"/></item><item><title>What's New in GitHub Actions Runner Controller</title><link>https://www.kenmuse.com/blog/whats-new-in-github-arc/</link><pubDate>Mon, 31 Mar 2025 00:00:00 -0400</pubDate><guid isPermaLink="false">whats-new-in-github-arc</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>The new version of Actions Runner Controller has performance fixes, improved configurability, and a new approach to metrics. This post reviews those changes.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/whats-new-in-github-arc/images/banner.png"/></item><item><title>Managing Pod Resource Requests and Limits in Kubernetes</title><link>https://www.kenmuse.com/blog/managing-pod-resource-requests-and-limits-in-kubernetes/</link><pubDate>Thu, 02 Jan 2025 00:00:00 -0500</pubDate><guid isPermaLink="false">managing-pod-resource-requests-and-limits-in-kubernetes</guid><category>Containers</category><category>DevOps</category><description>In Kubernetes, we cannot manage resources at the pod level and must resort to setting requests and limits on containers. Learn how that's changing.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/managing-pod-resource-requests-and-limits-in-kubernetes/images/banner.jpg"/></item><item><title>Using A Kubernetes Native Sidecar With GitHub ARC</title><link>https://www.kenmuse.com/blog/using-kubernetes-native-sidecars-with-github-arc/</link><pubDate>Fri, 20 Dec 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">using-kubernetes-native-sidecars-with-github-arc</guid><category>Containers</category><category>DevOps</category><category>GitHub</category><description>Explore how to modernize the Docker-in-Docker support in GitHub Actions Runner Controller (ARC) using the latest Kubernetes feature: native sidecars.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/using-kubernetes-native-sidecars-with-github-arc/images/banner.png"/></item><item><title>Taking Advantage of Kubernetes Native Sidecars</title><link>https://www.kenmuse.com/blog/taking-advantage-of-kubernetes-native-sidecars/</link><pubDate>Thu, 19 Dec 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">taking-advantage-of-kubernetes-native-sidecars</guid><category>Containers</category><category>DevOps</category><description>Kubernetes has a powerful feature that can help you build more robust deployments. Learn about native sidecars, the problems they solve and how to use them.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/taking-advantage-of-kubernetes-native-sidecars/images/banner.jpg"/></item><item><title>Exploring The Three Flavors of GitOps</title><link>https://www.kenmuse.com/blog/three-flavors-of-gitops/</link><pubDate>Sat, 14 Dec 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">three-flavors-of-gitops</guid><category>DevOps</category><description>Discover the world of GitOps, where Git becomes your source of truth for deployments and learn the three models for defining your GitOps practices.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/three-flavors-of-gitops/images/banner.jpg"/></item><item><title>Testing Kubernetes Operators and Controllers With Minikube</title><link>https://www.kenmuse.com/blog/testing-kubernetes-operators-and-controllers-with-minikube/</link><pubDate>Fri, 27 Sep 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">testing-kubernetes-operators-and-controllers-with-minikube</guid><category>Containers</category><category>DevOps</category><description>Sometimes you need to try out a modified image or custom chart you're creating in Kubernetes. Minikube can make that process easier.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/testing-kubernetes-operators-and-controllers-with-minikube/images/banner.png"/></item><item><title>Implementing Private VS Code Extensions for Dev Containers</title><link>https://www.kenmuse.com/blog/implementing-private-vs-code-extensions-for-dev-containers/</link><pubDate>Fri, 20 Sep 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">implementing-private-vs-code-extensions-for-dev-containers</guid><category>Containers</category><category>DevOps</category><category>Programming</category><description>Learn how to implement private Visual Studio code extensions that are designed to support a specific development container or Codespaces environment.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/implementing-private-vs-code-extensions-for-dev-containers/images/banner.png"/></item><item><title>Planning Kubernetes Cloud Deployments</title><link>https://www.kenmuse.com/blog/planning-kubernetes-cloud-deployments/</link><pubDate>Sat, 27 Jul 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">planning-kubernetes-cloud-deployments</guid><category>GitHub</category><category>DevOps</category><description>Understanding resource allocation is a critical skill for successful Kubernetes cluster deployments. Learn how the cloud providers reserve Kubernetes resources.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/planning-kubernetes-cloud-deployments/images/banner.png"/></item><item><title>Understanding Kubernetes Resource Consumption</title><link>https://www.kenmuse.com/blog/understanding-kubernetes-resource-consumption/</link><pubDate>Fri, 19 Jul 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">understanding-kubernetes-resource-consumption</guid><category>GitHub</category><category>DevOps</category><description>Surprised that you can't fit as many pods on a node as you thought? It turns out that there's a lot more to the story of how Kubernetes allocates resources.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/understanding-kubernetes-resource-consumption/images/banner.png"/></item><item><title>The Ultimate Debugging Hack for Developers</title><link>https://www.kenmuse.com/blog/the-ultimate-debugging-hack-for-developers/</link><pubDate>Fri, 12 Jul 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">the-ultimate-debugging-hack-for-developers</guid><category>DevOps</category><category>Programming</category><description>Developers usually want to be able to directly connect to a system and start their debugger. What if there's a better way to get the information you need?</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/the-ultimate-debugging-hack-for-developers/images/banner.png"/></item><item><title>Scaling ARC on a Schedule</title><link>https://www.kenmuse.com/blog/scaling-arc-on-a-schedule/</link><pubDate>Wed, 03 Jul 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">scaling-arc-on-a-schedule</guid><category>GitHub</category><category>DevOps</category><description>The Actions Runner Controller (ARC) can't configure the minimum runner count based on a schedule. Learn to use native `CronJob` resources for the task!</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/scaling-arc-on-a-schedule/images/banner.png"/></item><item><title>The Top 5 Things To Know About ARC</title><link>https://www.kenmuse.com/blog/top-five-things-to-know-about-arc/</link><pubDate>Fri, 21 Jun 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">top-five-things-to-know-about-arc</guid><category>GitHub</category><category>DevOps</category><description>Actions Runner Controller (ARC) is a powerful way to manage ephemeral, self-hosted GitHub runners. There are five keys that can make you successful using it.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/top-five-things-to-know-about-arc/images/banner.png"/></item><item><title>The Importance of Kubernetes Logs</title><link>https://www.kenmuse.com/blog/the-importance-of-kubernetes-logs/</link><pubDate>Thu, 13 Jun 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">the-importance-of-kubernetes-logs</guid><category>GitHub</category><category>DevOps</category><description>If you really want to master your Kubernetes environment, it begins with understanding the value of a logging and how to implement good logging practices.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/the-importance-of-kubernetes-logs/images/banner.png"/></item><item><title>The Magic of Scaling and Auto-Scaling</title><link>https://www.kenmuse.com/blog/the-magic-of-scaling/</link><pubDate>Thu, 06 Jun 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">the-magic-of-scaling</guid><category>Azure</category><category>DevOps</category><description>Scaling systems is a journey. It's not just about adding more resources. It's about understanding the bottlenecks and how to overcome them.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/the-magic-of-scaling/images/banner.png"/></item><item><title>Strategies for Upgrading ARC</title><link>https://www.kenmuse.com/blog/strategies-for-upgrading-arc/</link><pubDate>Thu, 30 May 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">strategies-for-upgrading-arc</guid><category>GitHub</category><category>DevOps</category><description>Understand the best practices for upgrading Actions Runner Controller and minimizing downtime, including when (and if) you can skip a release.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/strategies-for-upgrading-arc/images/banner.png"/></item><item><title>Building Base Images for ARC</title><link>https://www.kenmuse.com/blog/building-base-images-for-arc/</link><pubDate>Thu, 09 May 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">building-base-images-for-arc</guid><category>Containers</category><category>GitHub</category><category>DevOps</category><description>If you're using Actions Runner Controller, the provided base image may not be enough. Learn what's needed in your image to make your workflows run smoothly.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-base-images-for-arc/images/banner.png"/></item><item><title>Building GitHub Runner Images With an Action Archive Cache</title><link>https://www.kenmuse.com/blog/building-github-actions-runner-images-with-an-action-archive-cache/</link><pubDate>Fri, 29 Mar 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">building-github-actions-runner-images-with-an-action-archive-cache</guid><category>Containers</category><category>GitHub</category><category>DevOps</category><description>If you want to make images for GitHub Actions Runner Controller (ARC) that are fast and network-friendly, learn how to include an Action archive cache.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-github-actions-runner-images-with-an-action-archive-cache/images/banner.png"/></item><item><title>Building GitHub Actions Runner Images With A Tool Cache</title><link>https://www.kenmuse.com/blog/building-github-actions-runner-images-with-a-tool-cache/</link><pubDate>Thu, 28 Mar 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">building-github-actions-runner-images-with-a-tool-cache</guid><category>Containers</category><category>GitHub</category><category>DevOps</category><description>If you want to make an efficient image for GitHub Actions Runner Controller (ARC), you need to first understand how to prepopulate the runner's tool cache.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/building-github-actions-runner-images-with-a-tool-cache/images/banner.png"/></item><item><title>What Is ARC Doing &amp; How Does It Interact With Kubernetes?</title><link>https://www.kenmuse.com/blog/what-is-arc-doing/</link><pubDate>Sat, 16 Mar 2024 00:00:00 -0400</pubDate><guid isPermaLink="false">what-is-arc-doing</guid><category>GitHub</category><category>DevOps</category><description>Understanding ARC begins with understanding what it does (and does not do) to create runners on Kubernetes. In this post, I explore the basics of the process.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/what-is-arc-doing/images/banner.png"/></item><item><title>The New DevContainer initializeCommand</title><link>https://www.kenmuse.com/blog/new-devcontainer-initializecommand/</link><pubDate>Fri, 08 Mar 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">new-devcontainer-initializecommand</guid><category>DevOps</category><category>GitHub</category><description>The dev container specification was updated to better define the behavior of initializeCommand. Learn what changed and why your scripts should be idempotent.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/new-devcontainer-initializecommand/images/banner.png"/></item><item><title>Getting User Input When Starting a Dev Container</title><link>https://www.kenmuse.com/blog/getting-user-input-when-starting-a-dev-container/</link><pubDate>Fri, 09 Feb 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">getting-user-input-when-starting-a-dev-container</guid><category>Azure</category><category>DevOps</category><category>GitHub</category><description>Sometimes you just need a little human interaction. Thankfully, there is a way to get user input that works with most of the dev container implementations.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/getting-user-input-when-starting-a-dev-container/images/banner.png"/></item><item><title>Mounting Files as Volumes</title><link>https://www.kenmuse.com/blog/mounting-files-as-volumes/</link><pubDate>Fri, 02 Feb 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">mounting-files-as-volumes</guid><category>DevOps</category><description>Kubernetes and containerized systems mount drives and folders as volumes, but there is another option. Learn how to mount a file and treat it like a drive.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/mounting-files-as-volumes/images/banner.jpg"/></item><item><title>Understanding Container Image Layers</title><link>https://www.kenmuse.com/blog/understanding-container-image-layers/</link><pubDate>Sat, 27 Jan 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">understanding-container-image-layers</guid><category>DevOps</category><description>To master containers, it's important to understand the concept of layers. In this post, I'll explain how layers work and the basis behind their implementation.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/understanding-container-image-layers/images/banner.jpg"/></item><item><title>More Best Practices for Deploying GitHub ARC</title><link>https://www.kenmuse.com/blog/more-best-practices-for-deploying-github-arc/</link><pubDate>Thu, 11 Jan 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">more-best-practices-for-deploying-github-arc</guid><category>GitHub</category><category>DevOps</category><description>There are some common issues that lead to teams struggling to set up ARC, and nearly all can be avoided with these recommendations.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/more-best-practices-for-deploying-github-arc/images/banner.png"/></item><item><title>Best Practices for Deploying GitHub ARC</title><link>https://www.kenmuse.com/blog/best-practices-for-deploying-github-arc/</link><pubDate>Fri, 05 Jan 2024 00:00:00 -0500</pubDate><guid isPermaLink="false">best-practices-for-deploying-github-arc</guid><category>GitHub</category><category>DevOps</category><description>There are some common issues that lead to teams struggling to set up ARC. Nearly all of them can be avoided with these recommendations.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/best-practices-for-deploying-github-arc/images/banner.png"/></item><item><title>Why You Should Use Dedicated Clusters For GitHub ARC</title><link>https://www.kenmuse.com/blog/why-you-should-use-dedicated-clusters-for-github-arc/</link><pubDate>Sat, 30 Dec 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">why-you-should-use-dedicated-clusters-for-github-arc</guid><category>GitHub</category><category>DevOps</category><description>I recommend using a dedicated Kubernetes cluster with GitHub Actions Runner Controller (ARC) to get the best performance and security. This post explains why.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/why-you-should-use-dedicated-clusters-for-github-arc/images/banner.jpg"/></item><item><title>The Two GitHub ARCs (and Why You Should Only Use One)</title><link>https://www.kenmuse.com/blog/the-two-github-arcs/</link><pubDate>Sat, 16 Dec 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">the-two-github-arcs</guid><category>GitHub</category><category>DevOps</category><description>Many teams want to have GitHub self-hosted runners on Kubernetes using ARC, but aren’t aware there are two different versions. This post attempts to explain.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/the-two-github-arcs/images/banner.jpg"/></item><item><title>Enabling GitHub ARC Metrics</title><link>https://www.kenmuse.com/blog/enabling-github-arc-metrics/</link><pubDate>Sat, 09 Dec 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">enabling-github-arc-metrics</guid><category>GitHub</category><category>DevOps</category><description>Learn to enable metrics in GitHub's Actions Runner Controller (ARC) and get visibility into the processing queue and the performance of jobs and runners.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/enabling-github-arc-metrics/images/grafana.png"/></item><item><title>Automatic SSH Commit Signing With 1Password</title><link>https://www.kenmuse.com/blog/automatic-ssh-commit-signing-with-1password/</link><pubDate>Fri, 10 Nov 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">automatic-ssh-commit-signing-with-1password</guid><category>DevOps</category><category>Programming</category><description>Learn how to automate SSH commit signing with 1Password and dotfiles to enable others to verify the authenticity of your Git commits.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/automatic-ssh-commit-signing-with-1password/images/banner.png"/></item><item><title>Understanding the SLA of ARC</title><link>https://www.kenmuse.com/blog/understanding-the-sla-of-arc/</link><pubDate>Sat, 04 Nov 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">understanding-the-sla-of-arc</guid><category>Azure</category><category>DevOps</category><category>GitHub</category><description>If you're trying to increase availability by using GitHub Actions Runner Controller. In this post, I'll explain why you can't exceed the 99.9% SLA of GitHub.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/understanding-the-sla-of-arc/images/banner.png"/></item><item><title>Windows Runners on Actions Runner Controller</title><link>https://www.kenmuse.com/blog/windows-runners-on-actions-runner-controller/</link><pubDate>Thu, 26 Oct 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">windows-runners-on-actions-runner-controller</guid><category>Azure</category><category>GitHub</category><category>Containers</category><category>DevOps</category><description>GitHub's Actions Runner Controller (ARC) does not officially support Windows containers for runners. With a little bit of work, we can make it possible.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/windows-runners-on-actions-runner-controller/images/banner.jpg"/></item><item><title>Automatic SSH Commit Signing With Dotfiles</title><link>https://www.kenmuse.com/blog/automatic-ssh-commit-signing-with-dotfiles/</link><pubDate>Thu, 19 Oct 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">automatic-ssh-commit-signing-with-dotfiles</guid><category>DevOps</category><category>Programming</category><description>&lt;p&gt;I previously talked about
&lt;a class="" href="https://www.kenmuse.com/blog/the-magic-of-dotfiles/" target="_self"&gt;how dotfiles can improve the development experience&lt;/a&gt;. By automating the processing of setting up your environment, you are free to focus on more important things. One of the more mundane tasks for developers is setting up commit signing and verification. By doing this, others can verify that you are the author of a specific commit. It just requires some setup, especially if you want automatic support in your dev containers. For these examples, I&amp;rsquo;m going to use SSH-based commit signing. It&amp;rsquo;s a common approach, and it doesn&amp;rsquo;t require sharing a private key between environments.&lt;/p&gt;</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/automatic-ssh-commit-signing-with-dotfiles/images/banner.jpg"/></item><item><title>The Image Factory Pattern</title><link>https://www.kenmuse.com/blog/the-image-factory-pattern/</link><pubDate>Thu, 28 Sep 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">the-image-factory-pattern</guid><category>DevOps</category><description>Looking to maintain virtual machine or Docker images in the most efficient way possible? Use the Image Factory pattern to automate creation and distribution!</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/the-image-factory-pattern/images/banner.drawio.png"/></item><item><title>Improving Dev Container Feature Performance</title><link>https://www.kenmuse.com/blog/improving-dev-container-feature-performance/</link><pubDate>Thu, 01 Jun 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">improving-dev-container-feature-performance</guid><category>DevOps</category><category>Containers</category><description>Dev container features provide a quick way to add functionality. The tradeoff for the ease of use is often speed. Learn the tricks to preserving performance.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/improving-dev-container-feature-performance/images/banner.jpg"/></item><item><title>Dubious Ownership With Static Web Apps</title><link>https://www.kenmuse.com/blog/dubious-ownership-with-static-web-apps/</link><pubDate>Thu, 11 May 2023 00:00:00 -0400</pubDate><guid isPermaLink="false">dubious-ownership-with-static-web-apps</guid><category>DevOps</category><category>Containers</category><description>Git's safe directory configuration helps to protect users, but it can create challenges. This is especially true when using Hugo with Azure Static Web Sites.</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/dubious-ownership-with-static-web-apps/images/banner.png"/></item><item><title>Implementing Docker Layer Caching in GitHub Actions</title><link>https://www.kenmuse.com/blog/implementing-docker-layer-caching-in-github-actions/</link><pubDate>Thu, 09 Feb 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">implementing-docker-layer-caching-in-github-actions</guid><category>DevOps</category><category>Containers</category><category>GitHub</category><description>Learn how to use the Docker BuildKit gha, inline, and registry layer caching with GHCR, and GitHub Actions to improve build performance.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/implementing-docker-layer-caching-in-github-actions/images/banner.jpg"/></item><item><title>Implementing Docker-from-Docker for Non-Root Users</title><link>https://www.kenmuse.com/blog/implementing-docker-from-docker-for-nonroot-users/</link><pubDate>Tue, 31 Jan 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">implementing-docker-from-docker-for-nonroot-users</guid><category>DevOps</category><category>Containers</category><description>Dive deeper into dev container Features and Linux scripting to create an entrypoint for the non-root users.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/implementing-docker-from-docker-for-nonroot-users/images/banner.jpg"/></item><item><title>Improving Docker-From-Docker With Features</title><link>https://www.kenmuse.com/blog/improving-docker-from-docker-with-features/</link><pubDate>Thu, 26 Jan 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">improving-docker-from-docker-with-features</guid><category>DevOps</category><category>Containers</category><description>Sometimes scripting in containers just isn't enough. If you need modular, reusable components for repeatable practices, you may need to implement a Feature.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/improving-docker-from-docker-with-features/images/banner.jpg"/></item><item><title>Intro to Dev Container Features</title><link>https://www.kenmuse.com/blog/intro-to-dev-container-features/</link><pubDate>Sat, 21 Jan 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">intro-to-dev-container-features</guid><category>DevOps</category><category>Containers</category><description>Explore the basics of the specification and how it lets you create reusable components for your dev containers.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/intro-to-dev-container-features/images/banner.jpg"/></item><item><title>Docker-from-Docker in Alpine Dev Containers</title><link>https://www.kenmuse.com/blog/docker-from-docker-in-alpine-dev-containers/</link><pubDate>Thu, 05 Jan 2023 00:00:00 -0500</pubDate><guid isPermaLink="false">docker-from-docker-in-alpine-dev-containers</guid><category>DevOps</category><category>Containers</category><description>In this post, we'll see if we can run some Docker commands from inside our Alpine dev container using Docker-from-Docker and a bit of configuration.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/docker-from-docker-in-alpine-dev-containers/images/banner.jpg"/></item><item><title>Fast Start Dev Containers</title><link>https://www.kenmuse.com/blog/fast-start-dev-containers/</link><pubDate>Thu, 29 Sep 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">fast-start-dev-containers</guid><category>Containers</category><description>&lt;p&gt;In last week&amp;rsquo;s article,
&lt;a class="" href="https://www.kenmuse.com/blog/using-the-docker-cache/" target="_self"&gt;Using the Docker Cache&lt;/a&gt;, we learned that we can take advantage of the Docker cache to reduce our build times. There&amp;rsquo;s another advantage to using that cache. We can reduce the time it takes to spin-up a dev container!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s almost Halloween, so you&amp;rsquo;re probably thinking &amp;ldquo;this must be some kind of witchcraft!&amp;rdquo;. Almost. It&amp;rsquo;s a configuration setting in the &lt;code&gt;devcontainer.json&lt;/code&gt; file. If you&amp;rsquo;re referencing a Dockerfile and building an image dynamically, you can take advantage of the
&lt;a class="external-link" href="https://containers.dev/implementors/json_reference/" aria-label="The build.cacheFrom link opens in a new tab" target="_blank" rel="noopener"&gt;&lt;code&gt;build.cacheFrom&lt;/code&gt;&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt; setting. This is passed to the docker build process as the &lt;code&gt;--cache-from&lt;/code&gt; parameter. By providing a value, we enable the development environment to use cached layers. For example:&lt;/p&gt;</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/fast-start-dev-containers/images/banner.jpg"/></item><item><title>Using the Docker Cache for Faster Builds</title><link>https://www.kenmuse.com/blog/using-the-docker-cache/</link><pubDate>Thu, 22 Sep 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">using-the-docker-cache</guid><category>Containers</category><description>&lt;p&gt;Did you know that Docker has multiple built-in caches for making if faster and easier for you to build images? If not, you&amp;rsquo;ve been missing out on some performance possibilities! Modern docker builds rely on
&lt;a class="external-link" href="https://github.com/moby/buildkit" aria-label="The Buildkit link opens in a new tab" target="_blank" rel="noopener"&gt;Buildkit&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt;, a feature of Docker that enables high-performance builds. This includes support for storing and consuming layers by using caches.&lt;/p&gt;
&lt;p&gt;Caches are different from the pull-through functionality commonly discussed in other blogs. Instead of needing you to setup your own Docker registry, they enable you to read and write layer details in a way that enables faster builds. If you weren&amp;rsquo;t aware of this &amp;ndash; no worries! Surprisingly, most people aren&amp;rsquo;t. And even fewer people realize these caches work with other tools, such as dev containers and GitHub Actions. Part of the reason is that it&amp;rsquo;s tough finding a good explanation of these caches or how to use them. Hopefully today we can resolve part of that problem.&lt;/p&gt;</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/using-the-docker-cache/images/banner.jpg"/></item><item><title>Waiting for Docker Compose Up</title><link>https://www.kenmuse.com/blog/waiting-for-docker-compose-up/</link><pubDate>Thu, 15 Sep 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">waiting-for-docker-compose-up</guid><category>Containers</category><description>&lt;p&gt;If you&amp;rsquo;ve worked with Docker Compose in the past, you may have used a number of tricks to make sure that the containers were stable and running before moving on to further steps. For example, you might periodically ping the service. If the attempt fails, you simply sleep and retry until you get the expected results.&lt;/p&gt;
&lt;p&gt;A short time ago, the Docker team offered an easier approach to solving this problem. &lt;em&gt;Just wait for it.&lt;/em&gt; More to the point, they added the &lt;code&gt;--wait&lt;/code&gt; command. This ensures that &lt;code&gt;docker compose up&lt;/code&gt; waits for your services to be healthy before returning control to the caller. This can be helpful, especially if you&amp;rsquo;re using Compose to automate other processes.&lt;/p&gt;</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/waiting-for-docker-compose-up/images/banner.jpg"/></item><item><title>Forcing Dev Containers To Use AMD64</title><link>https://www.kenmuse.com/blog/forcing-dev-container-to-use-amd64/</link><pubDate>Thu, 01 Sep 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">forcing-dev-container-to-use-amd64</guid><category>DevOps</category><category>Containers</category><description>&lt;p&gt;While there are many things to like about Apple&amp;rsquo;s laptops, one of the more frustrating aspects is the number of applications and images that are not designed to support ARM processors. Over the last few years, we&amp;rsquo;ve seen ARM chips suddenly surge into mainstream laptops and servers. It makes sense – the chipsets offer high performance at a low cost.&lt;/p&gt;
&lt;p&gt;Sadly, not all containers and applications have been updated to support the additional architecture. This means that we often have to accommodate these tools. Dev containers add an additional challenge. They limit what build arguments we can provide, preventing us from taking control of parts of the process (such as the architecture). For example, while I can include the current Azure CLI in my &lt;code&gt;arm64&lt;/code&gt; images, the consistently fails to work because portions of the package target Intel/AMD chipsets. I have to rely on &lt;code&gt;amd64&lt;/code&gt;.&lt;/p&gt;</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/forcing-dev-container-to-use-amd64/images/banner.jpg"/></item><item><title>Marking Workspaces Safe with Dotfiles</title><link>https://www.kenmuse.com/blog/marking-workspaces-safe/</link><pubDate>Thu, 18 Aug 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">marking-workspaces-safe</guid><category>DevOps</category><category>Containers</category><description>There's a great way to use dotfiles to eliminate the "detected dubious ownership in repository" message in every dev container automatically.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/marking-workspaces-safe/images/banner.jpg"/></item><item><title>Avoiding Dubious Ownership in Dev Containers</title><link>https://www.kenmuse.com/blog/avoiding-dubious-ownership-in-dev-containers/</link><pubDate>Thu, 11 Aug 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">avoiding-dubious-ownership-in-dev-containers</guid><category>DevOps</category><category>Containers</category><description>Getting the message "detected dubious ownership in repository" in your dev container? Learn how to eliminate this error.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/avoiding-dubious-ownership-in-dev-containers/images/banner.jpg"/></item><item><title>Dev Containers and AWS Credentials</title><link>https://www.kenmuse.com/blog/dev-containers-and-aws-credentials/</link><pubDate>Wed, 03 Aug 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">dev-containers-and-aws-credentials</guid><category>DevOps</category><category>Containers</category><description>Did you know it's possible to share your AWS credentials between your host computer and your Dev Containers? Once again we explore the power of Docker mounts!</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/dev-containers-and-aws-credentials/images/banner.jpg"/></item><item><title>Dev Containers and node_modules</title><link>https://www.kenmuse.com/blog/dev-containers-and-node_modules/</link><pubDate>Wed, 27 Jul 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">dev-containers-and-node_modules</guid><category>DevOps</category><category>Containers</category><description>There's a trick you can use with dev containers and Docker volumes to make it easier to manage your node_modules folder.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/dev-containers-and-node_modules/images/banner.jpg"/></item><item><title>Publishing Images With GitHub Actions</title><link>https://www.kenmuse.com/blog/publishing-images-with-github-actions/</link><pubDate>Thu, 09 Jun 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">publishing-images-with-github-actions</guid><category>DevOps</category><category>Containers</category><category>GitHub</category><description>Learn how to publish OCI and Docker images to Azure and GHCR using GitHub Actions and OIDC.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/publishing-images-with-github-actions/images/banner.jpg"/></item><item><title>Running Hugo in macOS Dev Containers</title><link>https://www.kenmuse.com/blog/running-hugo-in-macos-dev-containers/</link><pubDate>Thu, 05 May 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">running-hugo-in-macos-dev-containers</guid><category>DevOps</category><category>Containers</category><description>Learn how to create optimized containers that work well for both ARM64 and AMD64 platforms.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/running-hugo-in-macos-dev-containers/images/banner.jpg"/></item><item><title>Deploying to Azure from Private Container Registries</title><link>https://www.kenmuse.com/blog/deploying-to-azure-from-private-container-registries/</link><pubDate>Thu, 17 Mar 2022 00:00:00 -0400</pubDate><guid isPermaLink="false">deploying-to-azure-from-private-container-registries</guid><category>Azure</category><category>Containers</category><category>GitHub</category><category>DevOps</category><description>How to use private registries and GitHub Container Registry with services like Azure Container Instances, Azure App Services, and Azure Container Apps.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/deploying-to-azure-from-private-container-registries/images/banner.jpg"/></item><item><title>Azure Container Solutions</title><link>https://www.kenmuse.com/blog/azure-container-solutions/</link><pubDate>Mon, 07 Mar 2022 00:00:00 -0500</pubDate><guid isPermaLink="false">azure-container-solutions</guid><category>Azure</category><category>Containers</category><description>Understand the different Azure containerization options and how to pick the right one for your job.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/azure-container-solutions/images/banner.jpg"/></item><item><title>Have It Your Way - The Magic of dotfiles</title><link>https://www.kenmuse.com/blog/the-magic-of-dotfiles/</link><pubDate>Thu, 20 Jan 2022 00:00:00 -0500</pubDate><guid isPermaLink="false">the-magic-of-dotfiles</guid><category>DevOps</category><category>Containers</category><description>Have your favorite configurations follow you in your Dev Containers by creating a dotfiles Git repository.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/the-magic-of-dotfiles/images/banner.jpg"/></item><item><title>Containers and the WSL2 File System</title><link>https://www.kenmuse.com/blog/containers-and-wsl2-filesystem/</link><pubDate>Wed, 22 Dec 2021 00:00:00 -0500</pubDate><guid isPermaLink="false">containers-and-wsl2-filesystem</guid><category>Containers</category><category>DevOps</category><description>Learn how to optimize your development container performance by working in the right filesystem in WSL2.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/containers-and-wsl2-filesystem/images/banner.jpg"/></item><item><title>Dev Containers, Codespaces, and Bicep, Oh My!</title><link>https://www.kenmuse.com/blog/devcontainers-codespaces-and-bicep/</link><pubDate>Thu, 16 Dec 2021 00:00:00 -0500</pubDate><guid isPermaLink="false">devcontainers-codespaces-and-bicep</guid><category>Azure</category><category>DevOps</category><category>GitHub</category><description>Learn how to create a dev container for editing and deploying Bicep templates to Azure.</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/devcontainers-codespaces-and-bicep/images/banner.jpg"/></item><item><title>Using Development Containers</title><link>https://www.kenmuse.com/blog/using-development-containers/</link><pubDate>Tue, 19 Oct 2021 00:00:00 -0400</pubDate><guid isPermaLink="false">using-development-containers</guid><category>Containers</category><category>DevOps</category><description>Learn how to implement development environments using infrastructure-as-code with Dev Containers, Codespaces, and Gitpod!</description><enclosure type="image/jpeg" url="https://www.kenmuse.com/blog/using-development-containers/images/banner.jpg"/></item><item><title>Automating SQL Server 2019 Docker Deployments</title><link>https://www.kenmuse.com/blog/automating-sql-server-2019-docker-deployments/</link><pubDate>Sat, 07 Mar 2020 00:00:00 -0500</pubDate><guid isPermaLink="false">automating-sql-server-2019-docker-deployments</guid><category>DevOps</category><category>Containers</category><description>&lt;p&gt;In a previous article, I walked through
&lt;a class="" href="https://www.kenmuse.com/blog/devops-sql-server-dacpac-docker/" target="_self"&gt;deploying to SQL Server 2017 containers&lt;/a&gt; and provided an overview of deploying DACPACs and BACPACs in containers. Since that time, SQL Server 2019 has been released; this requires a few changes to the approach. In this article, we&amp;rsquo;ll look at what changes you need to make to deploy to a 2019 container.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the code, then examine what&amp;rsquo;s changed.&lt;/p&gt;
&lt;div class=""&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-docker" data-lang="docker"&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/mssql/server:2019-latest&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Elevate to root to install required packages&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; apt-get update &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install unzip libunwind8 libicu55 -y&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install SQLPackage for Linux and make it executable&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; wget -progress&lt;span class="o"&gt;=&lt;/span&gt;bar:force -q -O sqlpackage.zip https://go.microsoft.com/fwlink/?linkid&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2113331&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; unzip -qq sqlpackage.zip -d /opt/sqlpackage &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x /opt/sqlpackage/sqlpackage &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chown -R mssql /opt/sqlpackage &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir /tmp/db &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chown -R mssql /tmp/db&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-16"&gt;&lt;a class="lnlinks" href="#hl-0-16"&gt;16&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Lower the privilege&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-17"&gt;&lt;a class="lnlinks" href="#hl-0-17"&gt;17&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mssql&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-18"&gt;&lt;a class="lnlinks" href="#hl-0-18"&gt;18&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-19"&gt;&lt;a class="lnlinks" href="#hl-0-19"&gt;19&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Add the DACPAC to the image&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-20"&gt;&lt;a class="lnlinks" href="#hl-0-20"&gt;20&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; site.bacpac /tmp/db/db.bacpac&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-21"&gt;&lt;a class="lnlinks" href="#hl-0-21"&gt;21&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-22"&gt;&lt;a class="lnlinks" href="#hl-0-22"&gt;22&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Configure external build arguments to allow configurability.&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-23"&gt;&lt;a class="lnlinks" href="#hl-0-23"&gt;23&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; &lt;span class="nv"&gt;DBNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Database
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-24"&gt;&lt;a class="lnlinks" href="#hl-0-24"&gt;24&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ARG&lt;/span&gt; PASSWORD&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-25"&gt;&lt;a class="lnlinks" href="#hl-0-25"&gt;25&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-26"&gt;&lt;a class="lnlinks" href="#hl-0-26"&gt;26&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Configure the required environmental variables&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-27"&gt;&lt;a class="lnlinks" href="#hl-0-27"&gt;27&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;ACCEPT_EULA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-28"&gt;&lt;a class="lnlinks" href="#hl-0-28"&gt;28&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;SA_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-29"&gt;&lt;a class="lnlinks" href="#hl-0-29"&gt;29&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-30"&gt;&lt;a class="lnlinks" href="#hl-0-30"&gt;30&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Launch SQL Server, confirm startup is complete, deploy the DACPAC, then terminate SQL Server.&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-31"&gt;&lt;a class="lnlinks" href="#hl-0-31"&gt;31&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# See https://stackoverflow.com/a/51589787/488695&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-32"&gt;&lt;a class="lnlinks" href="#hl-0-32"&gt;32&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; /opt/mssql/bin/sqlservr &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -q &lt;span class="s2"&gt;&amp;#34;Service Broker manager has started&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-33"&gt;&lt;a class="lnlinks" href="#hl-0-33"&gt;33&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; /opt/sqlpackage/sqlpackage /a:Import /tsn:. /tdn:&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DBNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; /tu:sa /tp:&lt;span class="nv"&gt;$SA_PASSWORD&lt;/span&gt; /sf:/tmp/db/db.bacpac &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-34"&gt;&lt;a class="lnlinks" href="#hl-0-34"&gt;34&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -r /tmp/db &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-35"&gt;&lt;a class="lnlinks" href="#hl-0-35"&gt;35&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkill sqlservr &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln" id="hl-0-36"&gt;&lt;a class="lnlinks" href="#hl-0-36"&gt;36&lt;/a&gt;&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -r /opt/sqlpackage&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To begin with, you will need to use a SQL Server 2019 image, such as &lt;code&gt;2019-latest&lt;/code&gt;. There is a
&lt;a class="external-link" href="https://hub.docker.com/_/microsoft-mssql-server" aria-label="The complete list of images link opens in a new tab" target="_blank" rel="noopener"&gt;complete list of images&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt;, which includes specific releases of SQL Server that you can use. Microsoft documents
&lt;a class="external-link" href="https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&amp;amp;WT.mc_id=DT-MVP-5003035" aria-label="The installing and connecting to SQL Server 2019 on Docker link opens in a new tab" target="_blank" rel="noopener"&gt;installing and connecting to SQL Server 2019 on Docker&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt; if you want to learn more about working with the containerized version of SQL Server. The Microsoft docs site also provides a guide to
&lt;a class="external-link" href="https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-docker?view=sql-server-ver15&amp;amp;WT.mc_id=DT-MVP-5003035" aria-label="The configuring Docker containers link opens in a new tab" target="_blank" rel="noopener"&gt;configuring Docker containers&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt;. The default Linux image is based on Ubuntu, but
&lt;a class="external-link" href="https://access.redhat.com/containers/?tab=overview#/mcr.microsoft.com/mssql/rhel/server" aria-label="The official RHEL images link opens in a new tab" target="_blank" rel="noopener"&gt;official RHEL images&lt;span class="fa-solid fa-up-right-from-square" &gt;&lt;/span&gt;&lt;/a&gt; are also available.&lt;/p&gt;</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/automating-sql-server-2019-docker-deployments/images/banner.png"/></item><item><title>Data DevOps: Deploying SQL Server DACPACs to Docker</title><link>https://www.kenmuse.com/blog/devops-sql-server-dacpac-docker/</link><pubDate>Mon, 31 Dec 2018 00:00:00 -0500</pubDate><guid isPermaLink="false">devops-sql-server-dacpac-docker</guid><category>DevOps</category><description>&lt;p&gt;In order to truly optimize the workflow and create a culture of DevOps, we need to be able to quickly build and deploy databases. To automate this process, we need to rely on improving our ability to utilize infrastructure as code. In this post, I&amp;rsquo;m going to show you how to use &lt;strong&gt;sqlpackage&lt;/strong&gt; to automate the process of deploying a DACPAC to SQL Server 2017 on a Linux container.&lt;/p&gt;
&lt;h2 id="what-is-a-dacpac"&gt;
&lt;a class="heading-link" href="#what-is-a-dacpac"&gt;What is a DACPAC?&lt;span class="fa-solid fa-link" aria-hidden="true"&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;re not familiar with the terms, DACPACs are a way of encapsulating the definition of a SQL Server database for automated deployment. Essentially, it&amp;rsquo;s a ZIP file (or, more specifically, an Open Packaging Convention document) which contains the details of the schema and an optional set of pre-deployment and post-deployment scripts to be executed. The benefit of this model is that it uses state-based deployments to update the schema of the database. Think of this as desired state configuration for your database schema. Rather than manually creating migration scripts, you can instead focus on defining the end state and allowing DACFx (Database Application Framework) to determine how to best apply the migration.&lt;/p&gt;</description><enclosure type="image/png" url="https://www.kenmuse.com/blog/devops-sql-server-dacpac-docker/images/deploy-sql-container.png"/></item></channel></rss>