{"id":718,"date":"2025-05-29T15:47:00","date_gmt":"2025-05-29T14:47:00","guid":{"rendered":"https:\/\/noiseonthenet.space\/noise\/?p=718"},"modified":"2025-05-29T20:21:59","modified_gmt":"2025-05-29T19:21:59","slug":"developing-python-containers-simplified","status":"publish","type":"post","link":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/","title":{"rendered":"Developing python containers, simplified"},"content":{"rendered":"<div id=\"org60e12f2\" class=\"figure\"> <p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?ssl=1\" alt=\"frank-mckenna-tjX_sniNzgQ-unsplash.jpg\" \/> <\/p> <\/div>\n\n<p> Photo by <a href=\"https:\/\/unsplash.com\/@frankiefoto?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">frank mckenna<\/a> on <a href=\"https:\/\/unsplash.com\/photos\/assorted-color-filed-intermodal-containers-tjX_sniNzgQ?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">Unsplash<\/a> <\/p>\n<div id=\"outline-container-org20033f4\" class=\"outline-2\">\n<h2 id=\"org20033f4\">Developing containers<\/h2>\n<div class=\"outline-text-2\" id=\"text-org20033f4\">\n<p> When I develop a containerized service I want to: <\/p>\n\n<ul class=\"org-ul\">\n<li>easily edit the code<\/li>\n<li>easily run unit tests<\/li>\n<li>easily launch interactive sessions for debug<\/li>\n<\/ul>\n\n<p> I&rsquo;ve tried various solutions in the past with different degrees of success and effort <\/p>\n\n<ul class=\"org-ul\">\n<li>create a development image which mounts an external directory\n\n<ul class=\"org-ul\">\n<li>connect to an shell into the development container to launch application and tests<\/li>\n<\/ul><\/li>\n<li>create an interactive development with jupyter lab\n\n<ul class=\"org-ul\">\n<li>connect to a shell from a web browser and edit files from it<\/li>\n<\/ul><\/li>\n<li>create an image to launch unit tests<\/li>\n<\/ul>\n<p> And some more combination of this kind. <\/p>\n\n<p> My development cycle was slow due to <\/p>\n\n<ul class=\"org-ul\">\n<li>the limited amount of tools available in the image<\/li>\n<li>multiple image building to run test and to create the production image<\/li>\n<\/ul>\n\n<p> This has been very frustrating until recently <\/p>\n<\/div>\n<\/div>\n<div id=\"outline-container-org3487cf8\" class=\"outline-2\">\n<h2 id=\"org3487cf8\">Hatch<\/h2>\n<div class=\"outline-text-2\" id=\"text-org3487cf8\">\n<p> I tried Poetry for a while in my development and it worked great <\/p>\n\n<p> I won&rsquo;t go in all of the details that made me choose Hatch for this task; I will just list which features I use the most <\/p>\n\n<ul class=\"org-ul\">\n<li>automatic virtual environment creation to launch the application<\/li>\n<li>automatic test virtual environments<\/li>\n<li>test grids with different python versions<\/li>\n<li>fast format (black) and lint (ruff)<\/li>\n<li>easy upload of packages in our private pip repositories<\/li>\n<li>stick to the basic <code>pyproject.toml<\/code> layout<\/li>\n<\/ul>\n\n<p> This worked well also for some apps running on both windows and linux. <\/p>\n<\/div>\n<\/div>\n<div id=\"outline-container-orgdaf5b30\" class=\"outline-2\">\n<h2 id=\"orgdaf5b30\">My workflow<\/h2>\n<div class=\"outline-text-2\" id=\"text-orgdaf5b30\">\n<p> I develop everything in my host machine (which is a linux box or VM) with my tools of choice (emacs) <\/p>\n\n<p> App execution is performed via <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\">hatch run python -m mypackage\n<\/pre>\n<\/div>\n\n<p> Tests are performed with the great <code>pytest<\/code> library <\/p>\n\n<p> App tests are performed via <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\">hatch test\n<\/pre>\n<\/div>\n\n<p> which may have also the usual pytest arguments and flags <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\">hatch test -n auto tests\/test_one_file.py -k regex_methods\n<\/pre>\n<\/div>\n\n<p> Usually I wrap these commands in convenient scripts e.g. <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\"><span style=\"color: #6c7086;\">#<\/span><span style=\"color: #6c7086;\">!env bash<\/span>\n<span style=\"color: #6c7086;\"># <\/span><span style=\"color: #6c7086;\">move to script directory, assuming it is<\/span>\n<span style=\"color: #6c7086;\"># <\/span><span style=\"color: #6c7086;\">the project root<\/span>\n<span style=\"color: #f9e2af;\">cd<\/span> $<span style=\"color: #f38ba8;\">(<\/span><span style=\"color: #fa8072;\">dirname $0<\/span><span style=\"color: #f38ba8;\">)<\/span>\n\n<span style=\"color: #6c7086;\"># <\/span><span style=\"color: #6c7086;\">add the src directory if this is your layout<\/span>\n<span style=\"color: #f38ba8;\">export<\/span> <span style=\"color: #cdd6f4;\">PYTHONPATH<\/span>=src\n\n<span style=\"color: #6c7086;\"># <\/span><span style=\"color: #6c7086;\">read an env file in case<\/span>\n<span style=\"color: #f38ba8;\">set<\/span> -o allexport\n<span style=\"color: #f38ba8;\">source<\/span> .env\n<span style=\"color: #f38ba8;\">set<\/span> +o allexport\n\n<span style=\"color: #6c7086;\"># <\/span><span style=\"color: #6c7086;\">launch the app<\/span>\nhatch run python -m app\n<\/pre>\n<\/div>\n\n<p> finally create a <code>Dockerfile<\/code>; this may look like this <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-Dockerfile\" id=\"nil\">FROM python:3.12-slim\nCOPY pyproject.toml\nCOPY src\nRUN pip install .\n# add a CMD here\n<\/pre>\n<\/div>\n<p> and a <code>compose.yaml<\/code> <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-yaml\" id=\"nil\">services:\n  myproject:\n    image: myproject:${VERSION}\n    env_file: .env\n<\/pre>\n<\/div>\n<p> to test the image in the local docker service before deploying <\/p>\n\n<p> I can add this in the scripts to get the version from python <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\"><span style=\"color: #f38ba8;\">export<\/span> <span style=\"color: #cdd6f4;\">VERSION<\/span>=$<span style=\"color: #f38ba8;\">(<\/span><span style=\"color: #fa8072;\">hatch version<\/span><span style=\"color: #f38ba8;\">)<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"outline-container-org23bf96d\" class=\"outline-2\">\n<h2 id=\"org23bf96d\">Using PIP for tests<\/h2>\n<div class=\"outline-text-2\" id=\"text-org23bf96d\">\n<p> Hatch uses UV as a default package manager when creating virtual environments for test unless you tell to do it differently <\/p>\n\n<p> While UV is a great tool I want to use the same global pip configuration as <\/p>\n\n<ul class=\"org-ul\">\n<li>within my company&rsquo;s premises it exposes a path to my CA certificates<\/li>\n<li>add some private pip repos<\/li>\n<\/ul>\n\n<p> I added this snippet to my <code>project.toml<\/code> to have this working <\/p>\n\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-toml\" id=\"nil\">[<span style=\"color: #f9e2af;\">tool.hatch.envs.hatch-test<\/span>]\n<span style=\"color: #cdd6f4;\">installer<\/span>=<span style=\"color: #a6e3a1;\">\"pip\"<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"outline-container-org64fb248\" class=\"outline-2\">\n<h2 id=\"org64fb248\">Pip is missing in my virtual environment<\/h2>\n<div class=\"outline-text-2\" id=\"text-org64fb248\">\n<p> Sometime these environment are created without the pip package <\/p>\n\n<ol class=\"org-ol\">\n<li>find where your hatch environment are\n\n<ol class=\"org-ol\">\n<li>launch python<\/li>\n<\/ol><\/li>\n<\/ol>\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\">hatch run python\n<\/pre>\n<\/div>\n<ol class=\"org-ol\">\n<li>chech the import paths<\/li>\n<\/ol>\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-python\" id=\"nil\"><span style=\"color: #cba6f7;\">import<\/span> sys\n<span style=\"color: #f38ba8;\">print<\/span>(sys.path)\n<\/pre>\n<\/div>\n<ol class=\"org-ol\">\n<li>activate your test environment<\/li>\n<\/ol>\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\"><span style=\"color: #f38ba8;\">source<\/span> ~\/.local\/share\/harch\/env\/my_project\/hatch-test.py3.12\/bin\/activate\n<\/pre>\n<\/div>\n<ol class=\"org-ol\">\n<li>force pip installation<\/li>\n<\/ol>\n<div class=\"org-src-container\">\n<label class=\"org-src-name\"><em><\/em><\/label>\n<pre class=\"src src-bash\" id=\"nil\">python -m enusrepip\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"outline-container-orgf77a29e\" class=\"outline-2\">\n<h2 id=\"orgf77a29e\">Conclusion<\/h2>\n<div class=\"outline-text-2\" id=\"text-orgf77a29e\">\n<p> This workflow fits most of the containerized applications I&rsquo;m currently working on, and speeds up my development cycle. <\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"How I accelerated my development cycle for containerized python apps","protected":false},"author":1,"featured_media":717,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[7],"class_list":["post-718","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-language-learning","tag-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Developing python containers, simplified - Noise On The Net<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Developing python containers, simplified - Noise On The Net\" \/>\n<meta property=\"og:description\" content=\"How I accelerated my development cycle for containerized python apps\" \/>\n<meta property=\"og:url\" content=\"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/\" \/>\n<meta property=\"og:site_name\" content=\"Noise On The Net\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-29T14:47:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-29T19:21:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"782\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"marco.p.v.vezzoli\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"marco.p.v.vezzoli\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/\"},\"author\":{\"name\":\"marco.p.v.vezzoli\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#\\\/schema\\\/person\\\/88c3a70f2b23480197bc61d6e1e2e982\"},\"headline\":\"Developing python containers, simplified\",\"datePublished\":\"2025-05-29T14:47:00+00:00\",\"dateModified\":\"2025-05-29T19:21:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/\"},\"wordCount\":454,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#\\\/schema\\\/person\\\/88c3a70f2b23480197bc61d6e1e2e982\"},\"image\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/noiseonthenet.space\\\/noise\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1\",\"keywords\":[\"Python\"],\"articleSection\":[\"Language learning\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/\",\"url\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/\",\"name\":\"Developing python containers, simplified - Noise On The Net\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/noiseonthenet.space\\\/noise\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1\",\"datePublished\":\"2025-05-29T14:47:00+00:00\",\"dateModified\":\"2025-05-29T19:21:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/noiseonthenet.space\\\/noise\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/noiseonthenet.space\\\/noise\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1\",\"width\":1200,\"height\":782},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/2025\\\/05\\\/developing-python-containers-simplified\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developing python containers, simplified\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#website\",\"url\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/\",\"name\":\"Noise On The Net\",\"description\":\"Sharing adventures in code\",\"publisher\":{\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#\\\/schema\\\/person\\\/88c3a70f2b23480197bc61d6e1e2e982\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/#\\\/schema\\\/person\\\/88c3a70f2b23480197bc61d6e1e2e982\",\"name\":\"marco.p.v.vezzoli\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g\",\"caption\":\"marco.p.v.vezzoli\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g\"},\"description\":\"Self taught assembler programming at 11 on my C64 (1983). Never stopped since then -- always looking up for curious things in the software development, data science and AI. Linux and FOSS user since 1994. MSc in physics in 1996. Working in large semiconductor companies since 1997 (STM, Micron) developing analytics and full stack web infrastructures, microservices, ML solutions\",\"sameAs\":[\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/marco-paolo-valerio-vezzoli-0663835\\\/\"],\"url\":\"https:\\\/\\\/noiseonthenet.space\\\/noise\\\/author\\\/marco-p-v-vezzoli\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Developing python containers, simplified - Noise On The Net","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/","og_locale":"en_US","og_type":"article","og_title":"Developing python containers, simplified - Noise On The Net","og_description":"How I accelerated my development cycle for containerized python apps","og_url":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/","og_site_name":"Noise On The Net","article_published_time":"2025-05-29T14:47:00+00:00","article_modified_time":"2025-05-29T19:21:59+00:00","og_image":[{"width":1200,"height":782,"url":"https:\/\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg","type":"image\/jpeg"}],"author":"marco.p.v.vezzoli","twitter_card":"summary_large_image","twitter_misc":{"Written by":"marco.p.v.vezzoli","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#article","isPartOf":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/"},"author":{"name":"marco.p.v.vezzoli","@id":"https:\/\/noiseonthenet.space\/noise\/#\/schema\/person\/88c3a70f2b23480197bc61d6e1e2e982"},"headline":"Developing python containers, simplified","datePublished":"2025-05-29T14:47:00+00:00","dateModified":"2025-05-29T19:21:59+00:00","mainEntityOfPage":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/"},"wordCount":454,"commentCount":0,"publisher":{"@id":"https:\/\/noiseonthenet.space\/noise\/#\/schema\/person\/88c3a70f2b23480197bc61d6e1e2e982"},"image":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1","keywords":["Python"],"articleSection":["Language learning"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/","url":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/","name":"Developing python containers, simplified - Noise On The Net","isPartOf":{"@id":"https:\/\/noiseonthenet.space\/noise\/#website"},"primaryImageOfPage":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#primaryimage"},"image":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1","datePublished":"2025-05-29T14:47:00+00:00","dateModified":"2025-05-29T19:21:59+00:00","breadcrumb":{"@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#primaryimage","url":"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1","contentUrl":"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1","width":1200,"height":782},{"@type":"BreadcrumbList","@id":"https:\/\/noiseonthenet.space\/noise\/2025\/05\/developing-python-containers-simplified\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/noiseonthenet.space\/noise\/"},{"@type":"ListItem","position":2,"name":"Developing python containers, simplified"}]},{"@type":"WebSite","@id":"https:\/\/noiseonthenet.space\/noise\/#website","url":"https:\/\/noiseonthenet.space\/noise\/","name":"Noise On The Net","description":"Sharing adventures in code","publisher":{"@id":"https:\/\/noiseonthenet.space\/noise\/#\/schema\/person\/88c3a70f2b23480197bc61d6e1e2e982"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/noiseonthenet.space\/noise\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/noiseonthenet.space\/noise\/#\/schema\/person\/88c3a70f2b23480197bc61d6e1e2e982","name":"marco.p.v.vezzoli","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g","caption":"marco.p.v.vezzoli"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/b9d9aab1df560bc14d73b0b442198f196ce39e7c7a38df1dc22fec0b97f17da9?s=96&d=mm&r=g"},"description":"Self taught assembler programming at 11 on my C64 (1983). Never stopped since then -- always looking up for curious things in the software development, data science and AI. Linux and FOSS user since 1994. MSc in physics in 1996. Working in large semiconductor companies since 1997 (STM, Micron) developing analytics and full stack web infrastructures, microservices, ML solutions","sameAs":["https:\/\/noiseonthenet.space\/noise\/","https:\/\/www.linkedin.com\/in\/marco-paolo-valerio-vezzoli-0663835\/"],"url":"https:\/\/noiseonthenet.space\/noise\/author\/marco-p-v-vezzoli\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/noiseonthenet.space\/noise\/wp-content\/uploads\/2025\/05\/frank-mckenna-tjX_sniNzgQ-unsplash.jpg?fit=1200%2C782&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pdDUZ5-bA","jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/posts\/718","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/comments?post=718"}],"version-history":[{"count":2,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/posts\/718\/revisions"}],"predecessor-version":[{"id":720,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/posts\/718\/revisions\/720"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/media\/717"}],"wp:attachment":[{"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/media?parent=718"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/categories?post=718"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/noiseonthenet.space\/noise\/wp-json\/wp\/v2\/tags?post=718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}