This commit is contained in:
github-actions[bot] 2023-12-06 07:50:04 +00:00
parent 6eadbd07d8
commit 209236f72d
208 changed files with 819 additions and 391 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8860],{37951:o=>{o.exports=JSON.parse('{"permalink":"/blog/tags/podman-desktop","page":1,"postsPerPage":15,"totalPages":1,"totalCount":15,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8860],{37951:o=>{o.exports=JSON.parse('{"permalink":"/blog/tags/podman-desktop","page":1,"postsPerPage":16,"totalPages":1,"totalCount":16,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6586],{14540:s=>{s.exports=JSON.parse('{"label":"images","permalink":"/blog/tags/images","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5210],{72997:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>c});var s=n(24246),a=n(71670);const i={title:"Share your local podman images with the Kubernetes cluster",description:"Build image and use it directly in your kubernetes cluster",slug:"sharing-podman-images-with-kubernetes-cluster",authors:["benoitf"],tags:["podman-desktop","podman","images","kubernetes"],hide_table_of_contents:!1,image:"/blog/img/sharing-podman-images-with-kubernetes-cluster/selkie-family.png"},o=void 0,r={permalink:"/blog/sharing-podman-images-with-kubernetes-cluster",source:"@site/blog/2023-12-06-sharing-podman-images-with-kubernetes-cluster.md",title:"Share your local podman images with the Kubernetes cluster",description:"Build image and use it directly in your kubernetes cluster",date:"2023-12-06T00:00:00.000Z",formattedDate:"December 6, 2023",tags:[{label:"podman-desktop",permalink:"/blog/tags/podman-desktop"},{label:"podman",permalink:"/blog/tags/podman"},{label:"images",permalink:"/blog/tags/images"},{label:"kubernetes",permalink:"/blog/tags/kubernetes"}],readingTime:7.71,hasTruncateMarker:!0,authors:[{name:"Florent Benoit",title:"Principal Software Engineer",url:"https://github.com/benoitf",imageURL:"https://github.com/benoitf.png",key:"benoitf"}],frontMatter:{title:"Share your local podman images with the Kubernetes cluster",description:"Build image and use it directly in your kubernetes cluster",slug:"sharing-podman-images-with-kubernetes-cluster",authors:["benoitf"],tags:["podman-desktop","podman","images","kubernetes"],hide_table_of_contents:!1,image:"/blog/img/sharing-podman-images-with-kubernetes-cluster/selkie-family.png"},unlisted:!1,nextItem:{title:"Release Notes - Podman Desktop 1.5",permalink:"/blog/podman-desktop-release-1.5"}},l={authorsImageUrls:[void 0]},c=[];function m(e){const t={code:"code",img:"img",p:"p",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"As developers we constantly improve and refine our applications. One of the challenges we face is quickly iterating when working with container images and kubernetes deployments/pods."}),"\n",(0,s.jsxs)(t.p,{children:["For example, when we want to try a new image in a kubernetes pod, this image needs to be available on a private/public registry or on the nodes of the kubernetes cluster.\nSometimes we need to call extra commands such as ",(0,s.jsx)(t.code,{children:"kind load docker-image"})," or ",(0,s.jsx)(t.code,{children:"minikube cache add <image>"})," or publish the image first to a 3rd party registry."]}),"\n",(0,s.jsx)(t.p,{children:"You'll agree that trying out a new image in a Kubernetes pod should be as seamless as building the image itself."}),"\n",(0,s.jsx)(t.p,{children:"In this blog post, we will explore the best practice for streamlining the image iteration process in Kubernetes with Podman Desktop."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"hero",src:n(77538).Z+"",width:"1920",height:"1080"})})]})}function d(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}},77538:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n.p+"assets/images/selkie-family-1b33ecd1c85565d5af69c52a03180a61.png"},71670:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>o});var s=n(27378);const a={},i=s.createContext(a);function o(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3868],{5155:o=>{o.exports=JSON.parse('{"permalink":"/blog/tags/podman","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);

View file

@ -1 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1441],{96591:s=>{s.exports=JSON.parse('{"label":"podman-desktop","permalink":"/blog/tags/podman-desktop","allTagsPath":"/blog/tags","count":15,"unlisted":false}')}}]);
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1441],{96591:s=>{s.exports=JSON.parse('{"label":"podman-desktop","permalink":"/blog/tags/podman-desktop","allTagsPath":"/blog/tags","count":16,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1647],{17369:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/images","page":1,"postsPerPage":1,"totalPages":1,"totalCount":1,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);

View file

@ -1 +0,0 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2472],{99867:(o,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(24246),s=t(71670);const r={title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",slug:"5-things-to-know-for-a-docker-user",authors:["benoitf"],tags:["podman-desktop","docker","migrating"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/5-things-to-know-for-a-docker-user",source:"@site/blog/2023-03-24-5-things-to-know-for-a-docker-user.md",title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",date:"2023-03-24T00:00:00.000Z",formattedDate:"March 24, 2023",tags:[{label:"podman-desktop",permalink:"/blog/tags/podman-desktop"},{label:"docker",permalink:"/blog/tags/docker"},{label:"migrating",permalink:"/blog/tags/migrating"}],readingTime:4.285,hasTruncateMarker:!0,authors:[{name:"Florent Benoit",title:"Maintainer of Podman Desktop",url:"https://github.com/benoitf",imageURL:"https://github.com/benoitf.png",key:"benoitf"}],frontMatter:{title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",slug:"5-things-to-know-for-a-docker-user",authors:["benoitf"],tags:["podman-desktop","docker","migrating"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Release Notes - Podman Desktop 0.13",permalink:"/blog/podman-desktop-release-0.13"},nextItem:{title:"Release Notes - Podman Desktop 0.12",permalink:"/blog/podman-desktop-release-0.12"}},c={authorsImageUrls:[void 0]},d=[];function l(o){const e={code:"code",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...o.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.p,{children:"The 5 things to know being a Docker user by using Podman Desktop:"}),"\n",(0,n.jsxs)(e.ul,{children:["\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Use a single UI"}),": Podman Desktop works with several container engines, including Docker."]}),"\n",(0,n.jsxs)(e.li,{children:["The ",(0,n.jsx)(e.strong,{children:"compatibility mode"}),": How to ensure tools are working with Podman instead of Docker."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Compose"})," support: How to work with Compose files and Podman."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Kubernetes"})," support: How to use Kubernetes with Podman."]}),"\n",(0,n.jsxs)(e.li,{children:[(0,n.jsx)(e.strong,{children:"Security"}),": Use ",(0,n.jsx)(e.code,{children:"rootless"})," mode or containers without root privileges."]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.img,{alt:"5-things-to-know-for-a-docker-user-hero",src:t(63440).Z+"",width:"800",height:"462"})})]})}function p(o={}){const{wrapper:e}={...(0,s.a)(),...o.components};return e?(0,n.jsx)(e,{...o,children:(0,n.jsx)(l,{...o})}):l(o)}},63440:(o,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/5-things-to-know-for-a-docker-user-hero-376f962671072e8cd6909702d92c90b1.png"},71670:(o,e,t)=>{t.d(e,{Z:()=>a,a:()=>i});var n=t(27378);const s={},r=n.createContext(s);function i(o){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof o?o(e):{...e,...o}}),[e,o])}function a(o){let e;return e=o.disableParentContext?"function"==typeof o.components?o.components(s):o.components||s:i(o.components),n.createElement(r.Provider,{value:e},o.children)}}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2472],{99867:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=t(24246),s=t(71670);const r={title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",slug:"5-things-to-know-for-a-docker-user",authors:["benoitf"],tags:["podman-desktop","docker","migrating"],hide_table_of_contents:!1},i=void 0,a={permalink:"/blog/5-things-to-know-for-a-docker-user",source:"@site/blog/2023-03-24-5-things-to-know-for-a-docker-user.md",title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",date:"2023-03-24T00:00:00.000Z",formattedDate:"March 24, 2023",tags:[{label:"podman-desktop",permalink:"/blog/tags/podman-desktop"},{label:"docker",permalink:"/blog/tags/docker"},{label:"migrating",permalink:"/blog/tags/migrating"}],readingTime:4.285,hasTruncateMarker:!0,authors:[{name:"Florent Benoit",title:"Principal Software Engineer",url:"https://github.com/benoitf",imageURL:"https://github.com/benoitf.png",key:"benoitf"}],frontMatter:{title:"5 things to know about Podman Desktop for a Docker user",description:"Important things to know when switching from Docker Desktop to Podman Desktop",slug:"5-things-to-know-for-a-docker-user",authors:["benoitf"],tags:["podman-desktop","docker","migrating"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Release Notes - Podman Desktop 0.13",permalink:"/blog/podman-desktop-release-0.13"},nextItem:{title:"Release Notes - Podman Desktop 0.12",permalink:"/blog/podman-desktop-release-0.12"}},c={authorsImageUrls:[void 0]},d=[];function l(e){const o={code:"code",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"The 5 things to know being a Docker user by using Podman Desktop:"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Use a single UI"}),": Podman Desktop works with several container engines, including Docker."]}),"\n",(0,n.jsxs)(o.li,{children:["The ",(0,n.jsx)(o.strong,{children:"compatibility mode"}),": How to ensure tools are working with Podman instead of Docker."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Compose"})," support: How to work with Compose files and Podman."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Kubernetes"})," support: How to use Kubernetes with Podman."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Security"}),": Use ",(0,n.jsx)(o.code,{children:"rootless"})," mode or containers without root privileges."]}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"5-things-to-know-for-a-docker-user-hero",src:t(63440).Z+"",width:"800",height:"462"})})]})}function p(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},63440:(e,o,t)=>{t.d(o,{Z:()=>n});const n=t.p+"assets/images/5-things-to-know-for-a-docker-user-hero-376f962671072e8cd6909702d92c90b1.png"},71670:(e,o,t)=>{t.d(o,{Z:()=>a,a:()=>i});var n=t(27378);const s={},r=n.createContext(s);function i(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]);

View file

@ -1 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3505],{83722:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/kubernetes","page":1,"postsPerPage":13,"totalPages":1,"totalCount":13,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3505],{83722:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/kubernetes","page":1,"postsPerPage":14,"totalPages":1,"totalCount":14,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);

View file

@ -1 +0,0 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Release Notes - Podman Desktop 1.5","permalink":"/blog/podman-desktop-release-1.5","unlisted":false},{"title":"Release Notes - Podman Desktop 1.4","permalink":"/blog/podman-desktop-release-1.4","unlisted":false},{"title":"Release Notes - Podman Desktop 1.3","permalink":"/blog/podman-desktop-release-1.3","unlisted":false},{"title":"Release Notes - Podman Desktop 1.2","permalink":"/blog/podman-desktop-release-1.2","unlisted":false},{"title":"Release Notes - Podman Desktop 1.1","permalink":"/blog/podman-desktop-release-1.1","unlisted":false}]}')}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2535],{45641:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Share your local podman images with the Kubernetes cluster","permalink":"/blog/sharing-podman-images-with-kubernetes-cluster","unlisted":false},{"title":"Release Notes - Podman Desktop 1.5","permalink":"/blog/podman-desktop-release-1.5","unlisted":false},{"title":"Release Notes - Podman Desktop 1.4","permalink":"/blog/podman-desktop-release-1.4","unlisted":false},{"title":"Release Notes - Podman Desktop 1.3","permalink":"/blog/podman-desktop-release-1.3","unlisted":false},{"title":"Release Notes - Podman Desktop 1.2","permalink":"/blog/podman-desktop-release-1.2","unlisted":false}]}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1713],{53457:e=>{e.exports=JSON.parse('[{"label":"podman-desktop","permalink":"/blog/tags/podman-desktop","count":16},{"label":"podman","permalink":"/blog/tags/podman","count":1},{"label":"images","permalink":"/blog/tags/images","count":1},{"label":"kubernetes","permalink":"/blog/tags/kubernetes","count":14},{"label":"release","permalink":"/blog/tags/release","count":12},{"label":"openshift","permalink":"/blog/tags/openshift","count":6},{"label":"onboarding","permalink":"/blog/tags/onboarding","count":1},{"label":"compose","permalink":"/blog/tags/compose","count":2},{"label":"extensions","permalink":"/blog/tags/extensions","count":1},{"label":"settings","permalink":"/blog/tags/settings","count":1},{"label":"kind","permalink":"/blog/tags/kind","count":4},{"label":"story","permalink":"/blog/tags/story","count":1},{"label":"docker","permalink":"/blog/tags/docker","count":1},{"label":"migrating","permalink":"/blog/tags/migrating","count":1},{"label":"devcontainer","permalink":"/blog/tags/devcontainer","count":1},{"label":"codespaces","permalink":"/blog/tags/codespaces","count":1}]')}}]);

View file

@ -1 +0,0 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1713],{53457:e=>{e.exports=JSON.parse('[{"label":"podman-desktop","permalink":"/blog/tags/podman-desktop","count":15},{"label":"release","permalink":"/blog/tags/release","count":12},{"label":"kubernetes","permalink":"/blog/tags/kubernetes","count":13},{"label":"openshift","permalink":"/blog/tags/openshift","count":6},{"label":"onboarding","permalink":"/blog/tags/onboarding","count":1},{"label":"compose","permalink":"/blog/tags/compose","count":2},{"label":"extensions","permalink":"/blog/tags/extensions","count":1},{"label":"settings","permalink":"/blog/tags/settings","count":1},{"label":"kind","permalink":"/blog/tags/kind","count":4},{"label":"story","permalink":"/blog/tags/story","count":1},{"label":"docker","permalink":"/blog/tags/docker","count":1},{"label":"migrating","permalink":"/blog/tags/migrating","count":1},{"label":"devcontainer","permalink":"/blog/tags/devcontainer","count":1},{"label":"codespaces","permalink":"/blog/tags/codespaces","count":1}]')}}]);

View file

@ -1 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9387],{36462:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/blog/tags/kubernetes","allTagsPath":"/blog/tags","count":13,"unlisted":false}')}}]);
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9387],{36462:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/blog/tags/kubernetes","allTagsPath":"/blog/tags","count":14,"unlisted":false}')}}]);

View file

@ -1 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[533],{28017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":15,"totalPages":1,"totalCount":15,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[533],{28017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":16,"totalPages":1,"totalCount":16,"blogDescription":"Discover articles about Podman Desktop","blogTitle":"Podman Desktop blog!"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7251],{50896:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var t=o(24246),a=o(71670);const s={title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",slug:"develop-using-devcontainer",authors:["benoitf"],tags:["podman-desktop","devcontainer","codespaces"],hide_table_of_contents:!1},i=void 0,r={permalink:"/blog/develop-using-devcontainer",source:"@site/blog/2022-11-17-develop-podman-using-codespaces.md",title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",date:"2022-11-17T00:00:00.000Z",formattedDate:"November 17, 2022",tags:[{label:"podman-desktop",permalink:"/blog/tags/podman-desktop"},{label:"devcontainer",permalink:"/blog/tags/devcontainer"},{label:"codespaces",permalink:"/blog/tags/codespaces"}],readingTime:6.985,hasTruncateMarker:!0,authors:[{name:"Florent Benoit",title:"Maintainer of Podman Desktop",url:"https://github.com/benoitf",imageURL:"https://github.com/benoitf.png",key:"benoitf"}],frontMatter:{title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",slug:"develop-using-devcontainer",authors:["benoitf"],tags:["podman-desktop","devcontainer","codespaces"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Release Notes - Podman Desktop 0.10",permalink:"/blog/podman-desktop-release-0.10"}},l={authorsImageUrls:[void 0]},d=[];function c(e){const n={a:"a",p:"p",...(0,a.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["GitHub ",(0,t.jsx)(n.a,{href:"https://github.blog/changelog/2022-11-09-codespaces-for-free-and-pro-accounts/",children:"announced last week"})," that Codespaces is available for everyone and it includes free minutes."]}),"\n",(0,t.jsxs)(n.p,{children:["Let see how we can use a ",(0,t.jsx)(n.a,{href:"https://containers.dev/",children:"Development Container"})," 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."]}),"\n",(0,t.jsx)(n.p,{children:"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 !"})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},71670:(e,n,o)=>{o.d(n,{Z:()=>r,a:()=>i});var t=o(27378);const a={},s=t.createContext(a);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7251],{50896:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var o=t(24246),a=t(71670);const s={title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",slug:"develop-using-devcontainer",authors:["benoitf"],tags:["podman-desktop","devcontainer","codespaces"],hide_table_of_contents:!1},i=void 0,r={permalink:"/blog/develop-using-devcontainer",source:"@site/blog/2022-11-17-develop-podman-using-codespaces.md",title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",date:"2022-11-17T00:00:00.000Z",formattedDate:"November 17, 2022",tags:[{label:"podman-desktop",permalink:"/blog/tags/podman-desktop"},{label:"devcontainer",permalink:"/blog/tags/devcontainer"},{label:"codespaces",permalink:"/blog/tags/codespaces"}],readingTime:6.985,hasTruncateMarker:!0,authors:[{name:"Florent Benoit",title:"Principal Software Engineer",url:"https://github.com/benoitf",imageURL:"https://github.com/benoitf.png",key:"benoitf"}],frontMatter:{title:"Build & run Podman Desktop in a DevContainer",description:"Develop Podman Desktop using a DevContainer locally or using GitHub Codespaces.",slug:"develop-using-devcontainer",authors:["benoitf"],tags:["podman-desktop","devcontainer","codespaces"],hide_table_of_contents:!1},unlisted:!1,prevItem:{title:"Release Notes - Podman Desktop 0.10",permalink:"/blog/podman-desktop-release-0.10"}},l={authorsImageUrls:[void 0]},d=[];function c(e){const n={a:"a",p:"p",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["GitHub ",(0,o.jsx)(n.a,{href:"https://github.blog/changelog/2022-11-09-codespaces-for-free-and-pro-accounts/",children:"announced last week"})," that Codespaces is available for everyone and it includes free minutes."]}),"\n",(0,o.jsxs)(n.p,{children:["Let see how we can use a ",(0,o.jsx)(n.a,{href:"https://containers.dev/",children:"Development Container"})," 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."]}),"\n",(0,o.jsx)(n.p,{children:"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 !"})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},71670:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var o=t(27378);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);

View file

@ -0,0 +1 @@
"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5594],{72989:s=>{s.exports=JSON.parse('{"label":"podman","permalink":"/blog/tags/podman","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2,12 +2,123 @@
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://podman-desktop.io/blog</id>
<title>Podman Desktop Blog</title>
<updated>2023-11-03T00:00:00.000Z</updated>
<updated>2023-12-06T00:00:00.000Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://podman-desktop.io/blog"/>
<subtitle>Podman Desktop Blog</subtitle>
<icon>https://podman-desktop.io/img/favicon.ico</icon>
<rights>Copyright © 2023 Podman Desktop</rights>
<entry>
<title type="html"><![CDATA[Share your local podman images with the Kubernetes cluster]]></title>
<id>https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster</id>
<link href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster"/>
<updated>2023-12-06T00:00:00.000Z</updated>
<summary type="html"><![CDATA[Build image and use it directly in your kubernetes cluster]]></summary>
<content type="html"><![CDATA[<p>As developers we constantly improve and refine our applications. One of the challenges we face is quickly iterating when working with container images and kubernetes deployments/pods.</p>
<p>For example, when we want to try a new image in a kubernetes pod, this image needs to be available on a private/public registry or on the nodes of the kubernetes cluster.
Sometimes we need to call extra commands such as <code>kind load docker-image</code> or <code>minikube cache add &lt;image&gt;</code> or publish the image first to a 3rd party registry.</p>
<p>You'll agree that trying out a new image in a Kubernetes pod should be as seamless as building the image itself.</p>
<p>In this blog post, we will explore the best practice for streamlining the image iteration process in Kubernetes with Podman Desktop.</p>
<p><img loading="lazy" alt="hero" src="https://podman-desktop.io/assets/images/selkie-family-1b33ecd1c85565d5af69c52a03180a61.png" width="1920" height="1080" class="img_SS3x"></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="introduction">Introduction<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction"></a></h2>
<p>When using kind or minikube or other 3rd party tools to setup a local kubernetes cluster, we have several ways to publish images.</p>
<p>Minikube published 8 ways of doing that at <a href="https://minikube.sigs.k8s.io/docs/handbook/pushing/" target="_blank" rel="noopener noreferrer">https://minikube.sigs.k8s.io/docs/handbook/pushing/</a></p>
<p>There are pros and cons either way. Using a third party registry implies that you need to publish the image after each build of the image before being able to use it in the kubernetes cluster. While Podman Desktop could automate the synchronization between the local registry (where you are doing <code>podman build</code>) and the third party registry, there remains a duplication of layers between the local and third party registry. And if you change the first layer, it can take a lot of time to send again all the data.</p>
<p>Loading images requires to pack/unpack the files so it's not adequate for large images.</p>
<p>Minikube offers a Podman environment, but it's important to note that it utilizes version 3.4 inside a container within the Podman machine. This implies the existence of two Podman instances.</p>
<p>The 3.4 version is considerably outdated and do not provide new enhancements and support towards compose, compliance with Docker REST API and 3rd party tools.</p>
<p>Could we just build the image and use it in kubernetes?</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="podman-and-kubernetescri-o">podman and kubernetes/cri-o<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#podman-and-kubernetescri-o" class="hash-link" aria-label="Direct link to podman and kubernetes/cri-o" title="Direct link to podman and kubernetes/cri-o"></a></h2>
<p>In the kubernetes world, we need a container engine runtime. At the early stage, container runtimes were integrated with ad hoc solutions on top of docker, rkt, or others.</p>
<p>But to separate concerns and to be extensible, a new interface was added: CRI for "Container Runtime Interface". Using the CRI interface we can plug container engines. And there are several runtimes such as containerd, cri-o and others.
<a href="https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md</a></p>
<p>What is interesting to us is the cri-o project. This project is implementing the CRI interface but also adopting some projects of the <a href="https://github.com/containers" target="_blank" rel="noopener noreferrer">containers</a> organization where <a href="https://github.com/containers/podman" target="_blank" rel="noopener noreferrer">podman</a> and <a href="https://github.com/containers/podman-desktop" target="_blank" rel="noopener noreferrer">podman-desktop</a> live.</p>
<p>So it means cri-o uses image management from <a href="https://github.com/containers/image" target="_blank" rel="noopener noreferrer">https://github.com/containers/image</a> project and handle storage with <a href="https://github.com/containers/storage" target="_blank" rel="noopener noreferrer">https://github.com/containers/storage</a> project.</p>
<p>And this is what is really interesting as a podman user. As it is using common libraries between cri-o and podman, it means that in the same environment, podman and cri-o read and write the images at a common location in <code>/var/lib/containers</code> folder.</p>
<p>If we move one step ahead, if we mount the <code>/var/lib/containers</code> folder of podman into the cri-o container it means that the kubernetes cluster could find the images that the podman machine is building.</p>
<p>Oh wait, it means that no more registry, additional steps would be required? Yes just build and load it.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-to-the-rescue">Minikube to the rescue<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-to-the-rescue" class="hash-link" aria-label="Direct link to Minikube to the rescue" title="Direct link to Minikube to the rescue"></a></h2>
<p>While we have the goal of using both cri-o and podman altogether, we can explore the current projects allowing us to quickly setup kubernetes clusters.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="kind">kind<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#kind" class="hash-link" aria-label="Direct link to kind" title="Direct link to kind"></a></h3>
<p>On the <code>kind</code> side, there is a default configuration that is using containerd and there is no plan to support an alternative such as cri-o <a href="https://github.com/kubernetes-sigs/kind/issues/1369#issuecomment-867440704" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes-sigs/kind/issues/1369#issuecomment-867440704</a></p>
<p>That said, some people try to maintain a way to do that but not officialy <a href="https://gist.github.com/aojea/bd1fb766302779b77b8f68fa0a81c0f2" target="_blank" rel="noopener noreferrer">https://gist.github.com/aojea/bd1fb766302779b77b8f68fa0a81c0f2</a></p>
<p>By doing that, we would also need to mount <code>/var/lib/containers</code> folder from the host (the podman machine) to the container. And there is no easy flag in kind.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="minikube">Minikube<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube" class="hash-link" aria-label="Direct link to Minikube" title="Direct link to Minikube"></a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-options">Minikube options<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-options" class="hash-link" aria-label="Direct link to Minikube options" title="Direct link to Minikube options"></a></h4>
<p>Minikube supports more options and provides a way to select the container engine runtime. And it includes support for cri-o.</p>
<p>We can use the <code>container-runtime</code> parameter and ask for <code>cri-o</code> runtime. Command-line should include <code>--container-runtime=cri-o</code>.</p>
<p>Then, we do have a podman/cri-o environment inside the container and can use <code>eval $(minikube podman-env)</code> to use the Windows/macOS podman CLI.</p>
<p>One issue is that we then have two 'Podman engines': one running inside the Podman machine and another one running inside the container. The Podman included in the container is using version 3.4, as it's on Debian/Ubuntu stable, while the recent version of Podman is 4.7.x.</p>
<p>Can we mount the podman machine <code>/var/lib/containers</code> into the container ?</p>
<p>Yes! minikube provides some options to do additional mount with <code>--mount-string</code> argument. It is not obvious but you also need to add the <code>--mount</code> in addition to this parameter. Full argument is <code>--mount --mount-string "&lt;host-path:container-path&gt;"</code></p>
<p>But <code>/var</code> is already a mounted folder. So here the idea is to change the path of where cri-o is storing its data.</p>
<p>So we can provide a custom mounted path and make cri-o use that custom location. Let's pickup <code>/host-containers</code>.</p>
<p>When starting minikube we need then to add <code>--mount --mount-string "/var/lib/containers:/host-containers"</code>.</p>
<p>Regarding the configuration of cri-o, currently, it's not achievable using Minikube options. However, Minikube does offer the flexibility to modify the base image.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-kicbase-image">Minikube kicbase image<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-kicbase-image" class="hash-link" aria-label="Direct link to Minikube kicbase image" title="Direct link to Minikube kicbase image"></a></h4>
<p>Let's do our own base image named kicbase image.</p>
<p>Minikube includes a default configuration file for cri-o.
<a href="https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/02-crio.conf" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/02-crio.conf</a></p>
<p>We need to change this default configuration to say that for storing the images, cri-o needs to use another directory. This new directory <code>/host-containers</code> will be mounted from the <code>/var/lib/containers</code> folder inside the podman machine. This is how cri-o is able to see podman images.</p>
<p>Let's include the configuration part in this file.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[crio]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">root = "/host-containers/storage"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">runroot = "/host-containers/storage"</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Let's also upgrade the Podman inside the container by adding the necessary instruction to the Dockerfile.</p>
<p>The Dockerfile is coming from <a href="https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/Dockerfile#L178-L186" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/Dockerfile#L178-L186</a></p>
<p>In the file, replace</p>
<div class="language-Dockerfile language-dockerfile codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><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"> clean-install podman &amp;&amp; </span><span class="token instruction operator">\</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>with</p>
<div class="language-Dockerfile language-dockerfile codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><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"> sh -c </span><span class="token instruction string" style="color:rgb(255, 121, 198)">"echo 'deb https://downloadcontent.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04/ /' &gt; /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list"</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"> curl -LO https://downloadcontent.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_22.04/Release.key &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"> apt-key add - &lt; Release.key &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"> </span><span class="token instruction comment" style="color:rgb(98, 114, 164)"># need to add dbus-user-session else we have</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)"># cannot open sd-bus: No such file or directory: OCI runtime attempted to invoke a command that was not found</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> clean-install dbus-user-session podman &amp;&amp; </span><span class="token instruction operator">\</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Let's rebuild the image and publish it. You can find it at <code>quay.io/fbenoit/kicbase:multiarch-2023-11-06</code> .
To build the image, clone <a href="https://github.com/kubernetes/minikube" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube</a> repository, and edit the files referenced before.</p>
<p>The command to build the kicbase image is <code>make local-kicbase</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="trying-out-cri-o-using-the-podman-machine-storage-folder">Trying out cri-o using the podman machine storage folder<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#trying-out-cri-o-using-the-podman-machine-storage-folder" class="hash-link" aria-label="Direct link to Trying out cri-o using the podman machine storage folder" title="Direct link to Trying out cri-o using the podman machine storage folder"></a></h4>
<p>At the time of writing this blog post, the version <code>v1.32.0-beta.0</code> has been used. For different versions you might need to build your own kicbase image.</p>
<p>One crucial note: cri-o is running in root mode, this is why we mount to <code>/var/lib/containers</code> (and then in rootful mode).</p>
<p>For simplicity, let's use a rootful podman machine to map the same folder at the two locations.</p>
<p>Ok now let's try in two steps:</p>
<ol>
<li>Create a podman machine:</li>
</ol>
<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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> machine init </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--cpus</span><span class="token plain"> </span><span class="token number">4</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--memory</span><span class="token plain"> </span><span class="token number">6000</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rootful</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="2">
<li>Start the cluster using our kicbase image</li>
</ol>
<p>We specify Podman as the driver (the default is Docker), state our preference to use cri-o as the container runtime instead of containerd, use our custom image that performs the update of Podman's version and the modification of cri-o's configuration to use a different storage folder. Finally, we specify an additional mount.</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">minikube start </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--driver</span><span class="token operator">=</span><span class="token plain">podman --container-runtime</span><span class="token operator">=</span><span class="token plain">cri-o --base-image</span><span class="token operator">=</span><span class="token plain">quay.io/fbenoit/kicbase:multiarch-2023-11-06 </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--mount</span><span class="token plain"> --mount-string </span><span class="token string" style="color:rgb(255, 121, 198)">"/var/lib/containers:/host-containers"</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="verification">Verification<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification"></a></h4>
<p>Assuming the cluster was able to start, there is a new kubernetes cluster configured in the <code>$HOME/.kube/config</code> file.</p>
<p>Using <code>kubectl</code> we can start a deployment</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> https://k8s.io/examples/application/deployment.yaml</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>you can check pods are running using</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">app</span><span class="token operator">=</span><span class="token plain">nginx</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" 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 if you check your podman images</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">podman images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>you'll see nginx being listed so images are shared.</p>
<p>Now, you can build image using a Containerfile or pull an image, connect to the control plane instance in Podman Desktop (open a shell in minikube container) and run</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">crictl images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" 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 will list the images of podman</p>
<p>Note: by default, kubernetes will use the image pull policy <code>Always</code> using the <code>latest</code> tag on your image. So it might try to fetch/pull/refresh the image you built locally. Use a specific tag or change the <code>imagePullPolicy</code> to <code>IfNotPresent</code> in your deployments.</p>
<p>You can now use your own Containerfile/Dockerfile and build an image using <code>podman build</code> command. And then check that the image is available as well in the kubernetes cluster by listing images:</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">crictl images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="conclusion">Conclusion<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion"></a></h3>
<p>We have explored how developers can significantly reduce turnaround times by integrating Podman and Kubernetes seamlessly.</p>
<p>Now, let's experiment with it and provide feedback through the Podman Desktop issue tracker at <a href="https://github.com/containers/podman-desktop/issues/" target="_blank" rel="noopener noreferrer">https://github.com/containers/podman-desktop/issues/</a> .</p>
<p>Here are the next steps Podman Desktop plans to take to enhance ease of use for users:</p>
<ul>
<li>To make things easier, automate the process by adding this setup to a creation wizard.</li>
<li>Collaborate with upstream Minikube project to simplify choices and remove the requirement for customized kicbase images.</li>
<li>Enhancing the overall user-friendliness of the solution for an improved developer experience.</li>
</ul>]]></content>
<author>
<name>Florent Benoit</name>
<uri>https://github.com/benoitf</uri>
</author>
<category label="podman-desktop" term="podman-desktop"/>
<category label="podman" term="podman"/>
<category label="images" term="images"/>
<category label="kubernetes" term="kubernetes"/>
</entry>
<entry>
<title type="html"><![CDATA[Release Notes - Podman Desktop 1.5]]></title>
<id>https://podman-desktop.io/blog/podman-desktop-release-1.5</id>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -4,11 +4,118 @@
<title>Podman Desktop Blog</title>
<link>https://podman-desktop.io/blog</link>
<description>Podman Desktop Blog</description>
<lastBuildDate>Fri, 03 Nov 2023 00:00:00 GMT</lastBuildDate>
<lastBuildDate>Wed, 06 Dec 2023 00:00:00 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>https://github.com/jpmonette/feed</generator>
<language>en</language>
<copyright>Copyright © 2023 Podman Desktop</copyright>
<item>
<title><![CDATA[Share your local podman images with the Kubernetes cluster]]></title>
<link>https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster</link>
<guid>https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster</guid>
<pubDate>Wed, 06 Dec 2023 00:00:00 GMT</pubDate>
<description><![CDATA[Build image and use it directly in your kubernetes cluster]]></description>
<content:encoded><![CDATA[<p>As developers we constantly improve and refine our applications. One of the challenges we face is quickly iterating when working with container images and kubernetes deployments/pods.</p>
<p>For example, when we want to try a new image in a kubernetes pod, this image needs to be available on a private/public registry or on the nodes of the kubernetes cluster.
Sometimes we need to call extra commands such as <code>kind load docker-image</code> or <code>minikube cache add &lt;image&gt;</code> or publish the image first to a 3rd party registry.</p>
<p>You'll agree that trying out a new image in a Kubernetes pod should be as seamless as building the image itself.</p>
<p>In this blog post, we will explore the best practice for streamlining the image iteration process in Kubernetes with Podman Desktop.</p>
<p><img loading="lazy" alt="hero" src="https://podman-desktop.io/assets/images/selkie-family-1b33ecd1c85565d5af69c52a03180a61.png" width="1920" height="1080" class="img_SS3x"></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="introduction">Introduction<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction"></a></h2>
<p>When using kind or minikube or other 3rd party tools to setup a local kubernetes cluster, we have several ways to publish images.</p>
<p>Minikube published 8 ways of doing that at <a href="https://minikube.sigs.k8s.io/docs/handbook/pushing/" target="_blank" rel="noopener noreferrer">https://minikube.sigs.k8s.io/docs/handbook/pushing/</a></p>
<p>There are pros and cons either way. Using a third party registry implies that you need to publish the image after each build of the image before being able to use it in the kubernetes cluster. While Podman Desktop could automate the synchronization between the local registry (where you are doing <code>podman build</code>) and the third party registry, there remains a duplication of layers between the local and third party registry. And if you change the first layer, it can take a lot of time to send again all the data.</p>
<p>Loading images requires to pack/unpack the files so it's not adequate for large images.</p>
<p>Minikube offers a Podman environment, but it's important to note that it utilizes version 3.4 inside a container within the Podman machine. This implies the existence of two Podman instances.</p>
<p>The 3.4 version is considerably outdated and do not provide new enhancements and support towards compose, compliance with Docker REST API and 3rd party tools.</p>
<p>Could we just build the image and use it in kubernetes?</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="podman-and-kubernetescri-o">podman and kubernetes/cri-o<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#podman-and-kubernetescri-o" class="hash-link" aria-label="Direct link to podman and kubernetes/cri-o" title="Direct link to podman and kubernetes/cri-o"></a></h2>
<p>In the kubernetes world, we need a container engine runtime. At the early stage, container runtimes were integrated with ad hoc solutions on top of docker, rkt, or others.</p>
<p>But to separate concerns and to be extensible, a new interface was added: CRI for "Container Runtime Interface". Using the CRI interface we can plug container engines. And there are several runtimes such as containerd, cri-o and others.
<a href="https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/community/blob/master/contributors/devel/sig-node/container-runtime-interface.md</a></p>
<p>What is interesting to us is the cri-o project. This project is implementing the CRI interface but also adopting some projects of the <a href="https://github.com/containers" target="_blank" rel="noopener noreferrer">containers</a> organization where <a href="https://github.com/containers/podman" target="_blank" rel="noopener noreferrer">podman</a> and <a href="https://github.com/containers/podman-desktop" target="_blank" rel="noopener noreferrer">podman-desktop</a> live.</p>
<p>So it means cri-o uses image management from <a href="https://github.com/containers/image" target="_blank" rel="noopener noreferrer">https://github.com/containers/image</a> project and handle storage with <a href="https://github.com/containers/storage" target="_blank" rel="noopener noreferrer">https://github.com/containers/storage</a> project.</p>
<p>And this is what is really interesting as a podman user. As it is using common libraries between cri-o and podman, it means that in the same environment, podman and cri-o read and write the images at a common location in <code>/var/lib/containers</code> folder.</p>
<p>If we move one step ahead, if we mount the <code>/var/lib/containers</code> folder of podman into the cri-o container it means that the kubernetes cluster could find the images that the podman machine is building.</p>
<p>Oh wait, it means that no more registry, additional steps would be required? Yes just build and load it.</p>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-to-the-rescue">Minikube to the rescue<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-to-the-rescue" class="hash-link" aria-label="Direct link to Minikube to the rescue" title="Direct link to Minikube to the rescue"></a></h2>
<p>While we have the goal of using both cri-o and podman altogether, we can explore the current projects allowing us to quickly setup kubernetes clusters.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="kind">kind<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#kind" class="hash-link" aria-label="Direct link to kind" title="Direct link to kind"></a></h3>
<p>On the <code>kind</code> side, there is a default configuration that is using containerd and there is no plan to support an alternative such as cri-o <a href="https://github.com/kubernetes-sigs/kind/issues/1369#issuecomment-867440704" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes-sigs/kind/issues/1369#issuecomment-867440704</a></p>
<p>That said, some people try to maintain a way to do that but not officialy <a href="https://gist.github.com/aojea/bd1fb766302779b77b8f68fa0a81c0f2" target="_blank" rel="noopener noreferrer">https://gist.github.com/aojea/bd1fb766302779b77b8f68fa0a81c0f2</a></p>
<p>By doing that, we would also need to mount <code>/var/lib/containers</code> folder from the host (the podman machine) to the container. And there is no easy flag in kind.</p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="minikube">Minikube<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube" class="hash-link" aria-label="Direct link to Minikube" title="Direct link to Minikube"></a></h3>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-options">Minikube options<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-options" class="hash-link" aria-label="Direct link to Minikube options" title="Direct link to Minikube options"></a></h4>
<p>Minikube supports more options and provides a way to select the container engine runtime. And it includes support for cri-o.</p>
<p>We can use the <code>container-runtime</code> parameter and ask for <code>cri-o</code> runtime. Command-line should include <code>--container-runtime=cri-o</code>.</p>
<p>Then, we do have a podman/cri-o environment inside the container and can use <code>eval $(minikube podman-env)</code> to use the Windows/macOS podman CLI.</p>
<p>One issue is that we then have two 'Podman engines': one running inside the Podman machine and another one running inside the container. The Podman included in the container is using version 3.4, as it's on Debian/Ubuntu stable, while the recent version of Podman is 4.7.x.</p>
<p>Can we mount the podman machine <code>/var/lib/containers</code> into the container ?</p>
<p>Yes! minikube provides some options to do additional mount with <code>--mount-string</code> argument. It is not obvious but you also need to add the <code>--mount</code> in addition to this parameter. Full argument is <code>--mount --mount-string "&lt;host-path:container-path&gt;"</code></p>
<p>But <code>/var</code> is already a mounted folder. So here the idea is to change the path of where cri-o is storing its data.</p>
<p>So we can provide a custom mounted path and make cri-o use that custom location. Let's pickup <code>/host-containers</code>.</p>
<p>When starting minikube we need then to add <code>--mount --mount-string "/var/lib/containers:/host-containers"</code>.</p>
<p>Regarding the configuration of cri-o, currently, it's not achievable using Minikube options. However, Minikube does offer the flexibility to modify the base image.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="minikube-kicbase-image">Minikube kicbase image<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#minikube-kicbase-image" class="hash-link" aria-label="Direct link to Minikube kicbase image" title="Direct link to Minikube kicbase image"></a></h4>
<p>Let's do our own base image named kicbase image.</p>
<p>Minikube includes a default configuration file for cri-o.
<a href="https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/02-crio.conf" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/02-crio.conf</a></p>
<p>We need to change this default configuration to say that for storing the images, cri-o needs to use another directory. This new directory <code>/host-containers</code> will be mounted from the <code>/var/lib/containers</code> folder inside the podman machine. This is how cri-o is able to see podman images.</p>
<p>Let's include the configuration part in this file.</p>
<div class="language-toml codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-toml codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[crio]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">root = "/host-containers/storage"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">runroot = "/host-containers/storage"</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Let's also upgrade the Podman inside the container by adding the necessary instruction to the Dockerfile.</p>
<p>The Dockerfile is coming from <a href="https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/Dockerfile#L178-L186" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube/blob/v1.32.0/deploy/kicbase/Dockerfile#L178-L186</a></p>
<p>In the file, replace</p>
<div class="language-Dockerfile language-dockerfile codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><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"> clean-install podman &amp;&amp; </span><span class="token instruction operator">\</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>with</p>
<div class="language-Dockerfile language-dockerfile codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><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"> sh -c </span><span class="token instruction string" style="color:rgb(255, 121, 198)">"echo 'deb https://downloadcontent.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/xUbuntu_22.04/ /' &gt; /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list"</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"> curl -LO https://downloadcontent.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_22.04/Release.key &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"> apt-key add - &lt; Release.key &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"> </span><span class="token instruction comment" style="color:rgb(98, 114, 164)"># need to add dbus-user-session else we have</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)"># cannot open sd-bus: No such file or directory: OCI runtime attempted to invoke a command that was not found</span><span class="token instruction"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token instruction"> clean-install dbus-user-session podman &amp;&amp; </span><span class="token instruction operator">\</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Let's rebuild the image and publish it. You can find it at <code>quay.io/fbenoit/kicbase:multiarch-2023-11-06</code> .
To build the image, clone <a href="https://github.com/kubernetes/minikube" target="_blank" rel="noopener noreferrer">https://github.com/kubernetes/minikube</a> repository, and edit the files referenced before.</p>
<p>The command to build the kicbase image is <code>make local-kicbase</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="trying-out-cri-o-using-the-podman-machine-storage-folder">Trying out cri-o using the podman machine storage folder<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#trying-out-cri-o-using-the-podman-machine-storage-folder" class="hash-link" aria-label="Direct link to Trying out cri-o using the podman machine storage folder" title="Direct link to Trying out cri-o using the podman machine storage folder"></a></h4>
<p>At the time of writing this blog post, the version <code>v1.32.0-beta.0</code> has been used. For different versions you might need to build your own kicbase image.</p>
<p>One crucial note: cri-o is running in root mode, this is why we mount to <code>/var/lib/containers</code> (and then in rootful mode).</p>
<p>For simplicity, let's use a rootful podman machine to map the same folder at the two locations.</p>
<p>Ok now let's try in two steps:</p>
<ol>
<li>Create a podman machine:</li>
</ol>
<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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> machine init </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--cpus</span><span class="token plain"> </span><span class="token number">4</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--memory</span><span class="token plain"> </span><span class="token number">6000</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--rootful</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol start="2">
<li>Start the cluster using our kicbase image</li>
</ol>
<p>We specify Podman as the driver (the default is Docker), state our preference to use cri-o as the container runtime instead of containerd, use our custom image that performs the update of Podman's version and the modification of cri-o's configuration to use a different storage folder. Finally, we specify an additional mount.</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">minikube start </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--driver</span><span class="token operator">=</span><span class="token plain">podman --container-runtime</span><span class="token operator">=</span><span class="token plain">cri-o --base-image</span><span class="token operator">=</span><span class="token plain">quay.io/fbenoit/kicbase:multiarch-2023-11-06 </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--mount</span><span class="token plain"> --mount-string </span><span class="token string" style="color:rgb(255, 121, 198)">"/var/lib/containers:/host-containers"</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_JmGV" id="verification">Verification<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification"></a></h4>
<p>Assuming the cluster was able to start, there is a new kubernetes cluster configured in the <code>$HOME/.kube/config</code> file.</p>
<p>Using <code>kubectl</code> we can start a deployment</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> https://k8s.io/examples/application/deployment.yaml</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>you can check pods are running using</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl get pods </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">app</span><span class="token operator">=</span><span class="token plain">nginx</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" 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 if you check your podman images</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">podman images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>you'll see nginx being listed so images are shared.</p>
<p>Now, you can build image using a Containerfile or pull an image, connect to the control plane instance in Podman Desktop (open a shell in minikube container) and run</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">crictl images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" 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 will list the images of podman</p>
<p>Note: by default, kubernetes will use the image pull policy <code>Always</code> using the <code>latest</code> tag on your image. So it might try to fetch/pull/refresh the image you built locally. Use a specific tag or change the <code>imagePullPolicy</code> to <code>IfNotPresent</code> in your deployments.</p>
<p>You can now use your own Containerfile/Dockerfile and build an image using <code>podman build</code> command. And then check that the image is available as well in the kubernetes cluster by listing images:</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" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token plain">crictl images</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 viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" 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 viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="conclusion">Conclusion<a href="https://podman-desktop.io/blog/sharing-podman-images-with-kubernetes-cluster#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion"></a></h3>
<p>We have explored how developers can significantly reduce turnaround times by integrating Podman and Kubernetes seamlessly.</p>
<p>Now, let's experiment with it and provide feedback through the Podman Desktop issue tracker at <a href="https://github.com/containers/podman-desktop/issues/" target="_blank" rel="noopener noreferrer">https://github.com/containers/podman-desktop/issues/</a> .</p>
<p>Here are the next steps Podman Desktop plans to take to enhance ease of use for users:</p>
<ul>
<li>To make things easier, automate the process by adding this setup to a creation wizard.</li>
<li>Collaborate with upstream Minikube project to simplify choices and remove the requirement for customized kicbase images.</li>
<li>Enhancing the overall user-friendliness of the solution for an improved developer experience.</li>
</ul>]]></content:encoded>
<category>podman-desktop</category>
<category>podman</category>
<category>images</category>
<category>kubernetes</category>
</item>
<item>
<title><![CDATA[Release Notes - Podman Desktop 1.5]]></title>
<link>https://podman-desktop.io/blog/podman-desktop-release-1.5</link>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

27
blog/tags/images.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

27
blog/tags/podman.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more