podman-desktop/blog/develop-using-devcontainer.html
github-actions[bot] 84e153e0e0 deploy: 0d3e7b5866
2023-02-16 16:55:00 +00:00

26 lines
No EOL
69 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.3.1">
<title data-rh="true">Build &amp; run Podman Desktop in a DevContainer | Podman Desktop</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://podman-desktop.io/blog/develop-using-devcontainer"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Build &amp; run Podman Desktop in a DevContainer | Podman Desktop"><meta data-rh="true" name="description" content="Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces."><meta data-rh="true" property="og:description" content="Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces."><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2022-11-17T00:00:00.000Z"><meta data-rh="true" property="article:author" content="https://github.com/benoitf"><meta data-rh="true" property="article:tag" content="podman-desktop,devcontainer,codespaces"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://podman-desktop.io/blog/develop-using-devcontainer"><link data-rh="true" rel="alternate" href="https://podman-desktop.io/blog/develop-using-devcontainer" hreflang="en"><link data-rh="true" rel="alternate" href="https://podman-desktop.io/blog/develop-using-devcontainer" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://MR01ANKQ9S-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Podman Desktop RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Podman Desktop Atom Feed">
<link rel="alternate" type="application/json" href="/blog/feed.json" title="Podman Desktop JSON Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Podman Desktop" href="/opensearch.xml"><link rel="stylesheet" href="/assets/css/styles.c351cfef.css">
<link rel="preload" href="/assets/js/runtime~main.3fc6b5aa.js" as="script">
<link rel="preload" href="/assets/js/main.39ee9ab8.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"dark")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_oPtH" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="Podman Desktop Logo" class="themedImage_BQGR themedImage--light_HAxW" height="56"><img src="/img/logo.svg" alt="Podman Desktop Logo" class="themedImage_BQGR themedImage--dark_bGx0" height="56"></div><b class="navbar__title text--truncate">podman desktop</b></a><a class="navbar__item navbar__link" href="/docs/intro">Documentation</a><a class="navbar__item navbar__link" href="/core-values">Core Values</a><a class="navbar__item navbar__link" href="/features">Features</a><a class="navbar__item navbar__link" href="/downloads">Downloads</a><a class="navbar__item navbar__link" href="/extend">Extend</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/containers/podman-desktop" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link"></a><div class="toggle_ki11 colorModeToggle_Hewu"><button class="clean-btn toggleButton_MMFG toggleButtonDisabled_Uw7m" type="button" disabled="" title="Switch between dark and light mode (currently dark mode)" aria-label="Switch between dark and light mode (currently dark mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_lgto"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_U96C"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_WqAV"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_MB5r"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_CLW8 thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_DQfJ margin-bottom--md">Recent posts</div><ul class="sidebarItemList_rvuc clean-list"><li class="sidebarItem__RMN"><a class="sidebarItemLink_Ony9" href="/blog/podman-desktop-release-0.12">Release Notes - Podman Desktop 0.12</a></li><li class="sidebarItem__RMN"><a class="sidebarItemLink_Ony9" href="/blog/podman-desktop-release-0.11">Release Notes - Podman Desktop 0.11</a></li><li class="sidebarItem__RMN"><a class="sidebarItemLink_Ony9" href="/blog/podman-desktop-release-0.10">Release Notes - Podman Desktop 0.10</a></li><li class="sidebarItem__RMN"><a aria-current="page" class="sidebarItemLink_Ony9 sidebarItemLinkActive_MJ75" href="/blog/develop-using-devcontainer">Build &amp; run Podman Desktop in a DevContainer</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h1 class="title_Kdtz" itemprop="headline">Build &amp; run Podman Desktop in a DevContainer</h1><div class="container_iZB2 margin-vert--md"><time datetime="2022-11-17T00:00:00.000Z" itemprop="datePublished">November 17, 2022</time> · <!-- -->7 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_v1VX"><div class="avatar margin-bottom--sm"><a href="https://github.com/benoitf" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/benoitf.png" alt="Florent Benoit"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/benoitf" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Florent Benoit</span></a></div><small class="avatar__subtitle" itemprop="description">Maintainer of Podman Desktop</small></div></div></div></div></header><div id="post-content" class="markdown" itemprop="articleBody"><p>GitHub <a href="https://github.blog/changelog/2022-11-09-codespaces-for-free-and-pro-accounts/" target="_blank" rel="noopener noreferrer">announced last week</a> that Codespaces is available for everyone and it includes free minutes.</p><p>Let see how we can use a <a href="https://containers.dev/" target="_blank" rel="noopener noreferrer">Development Container</a> having all the tools to build and run Podman Desktop. The Development Container works locally using Visual Studio Code but in this blog post we will see how it works directly with a simple click from GitHub.</p><p>The challenges are to run a desktop tool (Podman Desktop) and running a container engine (Podman) inside this Development Container without using too many memory !</p><h2 class="anchor anchorWithStickyNavbar_JmGV" id="defining-image-of-the-container">Defining image of the container<a href="#defining-image-of-the-container" class="hash-link" aria-label="Direct link to Defining image of the container" title="Direct link to Defining image of the container"></a></h2><p>The first thing is in the choice of the image for the container. It is possible to pick-up a default image and add some features but there is no existing feature for Podman at <a href="https://github.com/devcontainers/features/tree/main/src" target="_blank" rel="noopener noreferrer">https://github.com/devcontainers/features/tree/main/src</a> and most of the features are expecting to run on top of Debian/Ubuntu</p><p>If you are not interested in how to setup the image, jump to the <a href="#configure-the-devcontainer-using-devcontainerjson">next section</a>.</p><p>Podman binaries are available quickly after the releases for Fedora. I decided then to use <code>Fedora 37</code> as the base image.</p><p>Let start the Containerfile using:</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">FROM</span><span class="token instruction"> quay.io/fedora/fedora:37</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then I install Node.js 16 from official nodejs.org repository. It&#x27;s easier to switch to the version that we need.</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># install Node.js + yarn</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">ENV</span><span class="token instruction"> NODE_VERSION 16.18.1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">RUN</span><span class="token instruction"> curl -SLO </span><span class="token instruction string" style="color:rgb(255, 121, 198)">&quot;https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz&quot;</span><span class="token instruction"> &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> tar -xzf </span><span class="token instruction string" style="color:rgb(255, 121, 198)">&quot;node-v$NODE_VERSION-linux-x64.tar.gz&quot;</span><span class="token instruction"> -C /usr/local --strip-components=1 &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> rm </span><span class="token instruction string" style="color:rgb(255, 121, 198)">&quot;node-v$NODE_VERSION-linux-x64.tar.gz&quot;</span><span class="token instruction"> &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> npm install -g yarn</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now, all system dependencies used to run an Electron application needs to be installed.</p><p>Podman is also installed so we can run some containers inside this container.</p><p>And of course, we need to install VNC (I choose <a href="https://tigervnc.org/" target="_blank" rel="noopener noreferrer">tigervnc</a>) with a light Window Manager (<a href="http://fluxbox.org/" target="_blank" rel="noopener noreferrer">fluxbox</a>).</p><p>To connect to the display of the container, we need to expose VNC over HTML/websocket using <a href="https://novnc.com/" target="_blank" rel="noopener noreferrer">noVNC</a></p><p>xterm is installed to start a terminal from the VNC side.</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">RUN</span><span class="token instruction"> dnf -y update &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> yum -y reinstall shadow-utils &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> yum install -y git </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> </span><span class="token instruction comment" style="color:rgb(98, 114, 164)"># dependencies for Podman Desktop</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> nss </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> atk </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> at-spi2-atk </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> cups-libs </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> gtk3 </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> </span><span class="token instruction comment" style="color:rgb(98, 114, 164)"># for remote Display</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> fluxbox </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> tigervnc-server </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> xorg-x11-fonts-Type1 </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> novnc </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> supervisor </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> xdpyinfo </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> </span><span class="token instruction comment" style="color:rgb(98, 114, 164)"># for podman</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> podman </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> fuse-overlayfs --exclude container-selinux </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> xterm &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> rm -rf /var/cache /var/log/dnf* /var/log/yum.*</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Supervisord setup the launch of the VNC server and the Window manager</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">COPY</span><span class="token instruction"> supervisord.conf /etc/supervisord.conf</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A custom theme for fluxbox:</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">COPY</span><span class="token instruction"> fluxbox /usr/share/fluxbox/init</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then we need a special configuration to allow to have Podman working inside the container</p><p>We add the <code>podman-desktop</code> user with correct range on subuid and subgid when running containers. I used the <a href="https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md#etcsubuid-and-etcsubgid-configuration" target="_blank" rel="noopener noreferrer">tutorial</a>.</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">RUN</span><span class="token instruction"> useradd -u 1000 podman-desktop &amp;&amp; echo podman-desktop:10000:5000 &gt; /etc/subuid &amp;&amp; echo podman-desktop:10000:5000 &gt; /etc/subgid</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then use some default configuration files</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># initialize conf files</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">ADD</span><span class="token instruction"> https://raw.githubusercontent.com/containers/libpod/master/contrib/podmanimage/stable/containers.conf /etc/containers/containers.conf</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">ADD</span><span class="token instruction"> https://raw.githubusercontent.com/containers/libpod/master/contrib/podmanimage/stable/podman-containers.conf /home/podman-desktop/.config/containers/containers.conf</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>and make sure that all permissions are correct following the guide <a href="https://www.redhat.com/sysadmin/podman-inside-container" target="_blank" rel="noopener noreferrer">https://www.redhat.com/sysadmin/podman-inside-container</a></p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># set permissions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">RUN</span><span class="token instruction"> chown podman-desktop:podman-desktop -R /home/podman-desktop &amp;&amp; chmod 644 /etc/containers/containers.conf &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> mkdir -p /var/lib/shared/overlay-images /var/lib/shared/overlay-layers /var/lib/shared/vfs-images /var/lib/shared/vfs-layers; touch /var/lib/shared/overlay-images/images.lock; touch /var/lib/shared/overlay-layers/layers.lock; touch /var/lib/shared/vfs-images/images.lock; touch /var/lib/shared/vfs-layers/layers.lock &amp;&amp; </span><span class="token instruction operator">\</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> mkdir -p /run/user/1000 &amp;&amp; chown podman-desktop:podman-desktop /run/user/1000</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>plus define an empty user namespace.</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">ENV</span><span class="token instruction"> _CONTAINERS_USERNS_CONFIGURED=</span><span class="token instruction string" style="color:rgb(255, 121, 198)">&quot;&quot;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Make sure Podman will create the socket in an expected directory:</p><div class="codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-text codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># socket path for podman</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ENV XDG_RUNTIME_DIR=/run/user/1000</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>OK ! we have a custom Containerfile providing all the tools to build and run Podman Desktop (using VNC for the display), run Podman and run Electron.</p><p>The current file is available at <a href="https://github.com/containers/podman-desktop/blob/main/.devcontainer/.parent/Containerfile" target="_blank" rel="noopener noreferrer">https://github.com/containers/podman-desktop/blob/main/.devcontainer/.parent/Containerfile</a></p><p>Let&#x27;s configure the DevContainer.</p><h2 class="anchor anchorWithStickyNavbar_JmGV" id="configure-the-devcontainer-using-devcontainerjson">Configure the DevContainer using devcontainer.json<a href="#configure-the-devcontainer-using-devcontainerjson" class="hash-link" aria-label="Direct link to Configure the DevContainer using devcontainer.json" title="Direct link to Configure the DevContainer using devcontainer.json"></a></h2><p>DevContainer definition is stored at <code>.devcontainer/devcontainer.json</code> file.</p><p>We need to reuse the image of the previous step. For that let&#x27;s use the build section of the <code>devcontainer.json</code> file.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;build&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;dockerfile&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Containerfile&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In order to avoid to redo all the build steps each time we open a workspace using this dev container, we published the image to quay.io at <a href="https://quay.io/repository/podman-desktop/devcontainer-parent?tab=tags&amp;tag=next" target="_blank" rel="noopener noreferrer">quay.io/podman-desktop/devcontainer-parent:next
</a>. This parent image is not changing much so it&#x27;s better to use is as a parent one.</p><p>Inside <code>.devcontainer</code> directory there is a <code>.parent</code> directory with everything related to the parent image.</p><p>And in the <code>.devcontainer/Containerfile</code> file we reference this image</p><div class="language-docker codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-docker codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token instruction keyword" style="color:rgb(189, 147, 249);font-style:italic">FROM</span><span class="token instruction"> quay.io/podman-desktop/devcontainer-parent:next</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>By default, we will be <code>root</code> in the container and this is probably not what we expect. Let&#x27;s change that.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;containerUser&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;podman-desktop&quot;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Some Visual Studio Code extensions are nice to use and we can add them</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;extensions&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;svelte.svelte-vscode&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;bradlc.vscode-tailwindcss&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then here is the tricky part, how to run our container allowing to run again inside the container some containers with podman.</p><p>We specify the arguments to make it possible. It&#x27;s possible to use <code>--privileged</code> flag but I prefer to list the subset of permissions.
Using <code>--privileged</code> we don&#x27;t really know what are the privilege that are required while specifying all of them, people are aware of what is granted/denied.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;runArgs&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;--cap-add=sys_admin&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;--security-opt&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;seccomp=unconfined&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;--device&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/dev/fuse&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;--security-opt&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;label=disable&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;--security-opt&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;apparmor=unconfined&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Source code of Podman Desktop needs to be editable within the DevContainer so it needs to be mounted.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;workspaceMount&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;source=${localWorkspaceFolder},target=/workspace,type=bind&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">&quot;workspaceFolder&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/workspace&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then we need a command to build Podman Desktop.</p><p>For that, we use <code>onCreateCommand</code> hook with a custom command</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;onCreateCommand&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;${containerWorkspaceFolder}/.devcontainer/onCreateCommand.sh&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>and in the <code>.devcontainer</code> folder the <code>onCreateCommand.sh</code> script is the following</p><div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token shebang important">#!/bin/sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">MODE</span><span class="token operator">=</span><span class="token plain">production </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> run build </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> run electron-builder build --linux --dir --config .electron-builder.config.cjs</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Two instructions:</p><ol><li>Fetch all Node.js dependencies.</li><li>build Podman Desktop in the <code>dist</code> folder using <code>Linux</code> as target Operating System.</li></ol><p>After the start of the container, how to launch Podman Desktop, the website and VNC, etc ?</p><p>Just use <code>postStartCommand</code> hook.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;postStartCommand&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;${containerWorkspaceFolder}/.devcontainer/postStartCommand.sh&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>and in the <code>.devcontainer</code> folder the <code>postStartCommand.sh</code> script is the following:</p><div class="language-shell codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-shell codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token shebang important">#!/bin/sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Start all services</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">/usr/bin/supervisord -c /etc/supervisord.conf </span><span class="token operator">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># wait X server to be ready or after 2mn exit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Waiting for X server to be ready&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">timeout</span><span class="token plain"> </span><span class="token number">120</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">bash</span><span class="token plain"> -c </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;until xdpyinfo -display :0 &amp;&gt; /dev/null; do printf &quot;.&quot;; sleep 1; done&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># launch podman desktop</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Launching Podman Desktop&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> dist/linux-unpacked/</span><span class="token operator">&amp;&amp;</span><span class="token plain"> ./podman-desktop </span><span class="token operator">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Launch the 9000 redirect after 20 seconds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">sleep</span><span class="token plain"> </span><span class="token number">20</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">websockify --web</span><span class="token operator">=</span><span class="token plain">/usr/share/novnc localhost:9000 localhost:5900 </span><span class="token operator">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># launch the website rendering</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Launching Website&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> website </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">yarn</span><span class="token plain"> start</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>It starts VNC and noVNC, start precompiled Podman Desktop and start the documentation rendering.</p><p>It is not launching the Watch mode/development mode of Podman Desktop as it requires a container having more than 8GB of memory.</p><p>Picking up a larger instace with for example 16GB, it&#x27;s possible to use development mode.</p><p>Of course, to make VNC happy, we need to specify the <code>DISPLAY</code> environment variable.</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;remoteEnv&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;DISPLAY&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;:0&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>When the DevContainer is fully available, we want to have a way to quickly open the <code>Website rendering URL</code> and <code>noVNC</code></p><p>Let&#x27;s tweak the <code>devcontainer.json</code> file by adding the <code>portsAttributes</code> section</p><div class="language-json codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-json codeBlock_RMoD thin-scrollbar"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token property">&quot;portsAttributes&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;9000&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;label&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;vnc&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;onAutoForward&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;openPreview&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;3000&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token property">&quot;label&quot;</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;website&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg class="copyButtonIcon_FoOz" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_L0B6" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After all post-creation steps, the <code>Preview</code> browser inside the VS Code editor will open a window to VNC. And another port (<code>3000</code>) is flagged for the website.</p><h2 class="anchor anchorWithStickyNavbar_JmGV" id="using-the-devcontainerjson-on-github-codespace">Using the DevContainer.json on Github Codespace<a href="#using-the-devcontainerjson-on-github-codespace" class="hash-link" aria-label="Direct link to Using the DevContainer.json on Github Codespace" title="Direct link to Using the DevContainer.json on Github Codespace"></a></h2><p>As a user, opening a workspace with all what we configured is done using a single click.</p><p>Go to <a href="https://github.com/containers/podman-desktop" target="_blank" rel="noopener noreferrer">https://github.com/containers/podman-desktop</a> then click on the <code>&lt; &gt; Code</code> dropdown and click on <code>Create codespace on main</code> button.</p><p><img loading="lazy" alt="Open Codespace" src="/assets/images/codespaces-click-repository-22eb251ecc45a2b29952fe5983e16238.png" width="1240" height="617" class="img_SS3x"></p><p>Once you click on the button, the codespace is setting up:</p><p><img loading="lazy" alt="Preparing Codepace" src="/assets/images/codespaces-preparing-codespace-3121417aa9d8947b8f5566bf39478961.png" width="754" height="587" class="img_SS3x"></p><p>After few minutes, as there is not yet <a href="https://docs.github.com/en/codespaces/prebuilding-your-codespaces/about-github-codespaces-prebuilds" target="_blank" rel="noopener noreferrer">prebuilt codespaces</a>, the codespace is opening.</p><p>The simple Browser displays the noVNC window:
<img loading="lazy" alt="Opening Codespace" src="/assets/images/codespaces-open-novnc-ec3f30d836eb7af5750498a833d37184.png" width="2051" height="1066" class="img_SS3x"></p><p>Click on the connect button. Then on the terminal you can enter <code>podman run quay.io/podman/hello</code> and the container is detected in Podman Desktop.
<img loading="lazy" alt="Testing Codespace" src="/assets/images/codespaces-testing-podman-desktop-3210aa766f273a52253d27cb4e7ef782.png" width="2051" height="1066" class="img_SS3x"></p><p>It&#x27;s also possible using the port widget to get on <code>3000</code> port by clicking on the world icon a preview of the website in another tab. Changing source code of the website will refresh the content of the window.</p><p>Depending on the usecase, it&#x27;s also possible to open documentation in the preview browser.</p><p><img loading="lazy" alt="Edit website Codespace" src="/assets/images/codespaces-edit-website-d1f2a645f97209e453bc72cadafa0b54.png" width="2051" height="1066" class="img_SS3x"></p><h2 class="anchor anchorWithStickyNavbar_JmGV" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion"></a></h2><p>The DevContainer image for Podman Desktop is recent so it&#x27;ll probably evolve over time by adding new capabilities but it allows you to easily build/run/experiment and <strong>contribute</strong> to the tool or the website.</p></div><footer class="row docusaurus-mt-lg blogPostFooterDetailsFull_JgJa"><div class="col"><b>Tags:</b><ul class="tags_Ow0B padding--none margin-left--sm"><li class="tag_DFxh"><a class="tag_otG2 tagRegular_s0E1" href="/blog/tags/podman-desktop">podman-desktop</a></li><li class="tag_DFxh"><a class="tag_otG2 tagRegular_s0E1" href="/blog/tags/devcontainer">devcontainer</a></li><li class="tag_DFxh"><a class="tag_otG2 tagRegular_s0E1" href="/blog/tags/codespaces">codespaces</a></li></ul></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blog/podman-desktop-release-0.10"><div class="pagination-nav__sublabel">Newer Post</div><div class="pagination-nav__label">Release Notes - Podman Desktop 0.10</div></a></nav></main><div class="col col--2"><div class="tableOfContents_XG6w thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#defining-image-of-the-container" class="table-of-contents__link toc-highlight">Defining image of the container</a></li><li><a href="#configure-the-devcontainer-using-devcontainerjson" class="table-of-contents__link toc-highlight">Configure the DevContainer using devcontainer.json</a></li><li><a href="#using-the-devcontainerjson-on-github-codespace" class="table-of-contents__link toc-highlight">Using the DevContainer.json on Github Codespace</a></li><li><a href="#conclusion" class="table-of-contents__link toc-highlight">Conclusion</a></li></ul></div></div></div></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/intro">Introduction</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/Installation">Installing Podman Desktop</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started/getting-started">Getting started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/migrating-from-docker">Migrating from Docker</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/podman-compose">Using Compose</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/troubleshooting">Troubleshooting</a></li></ul></div><div class="col footer__col"><div class="footer__title">Links</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/containers/podman-desktop" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discordapp.com/invite/TCTB38RWpf" target="_blank" rel="noopener noreferrer" class="footer__link-item">General chat (bridged): #general on Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://libera.chat" target="_blank" rel="noopener noreferrer" class="footer__link-item">General chat (bridged): #podman-desktop@libera.chat on IRC<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://fedora.im" target="_blank" rel="noopener noreferrer" class="footer__link-item">General chat (bridged): #podman-desktop@fedora.im on Matrix<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://slack.k8s.io/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Kubernetes chat: Join #podman-desktop on the Kubernetes Slack<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/containers/podman-desktop/projects?type=beta" target="_blank" rel="noopener noreferrer" class="footer__link-item">Podman Desktop Planning &amp; Roadmap<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2023 podman desktop<br>Apache License 2.0 License</div></div></div></footer></div>
<script src="/assets/js/runtime~main.3fc6b5aa.js"></script>
<script src="/assets/js/main.39ee9ab8.js"></script>
</body>
</html>