<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shayne Boyer</title>
    <description>The latest articles on DEV Community by Shayne Boyer (@spboyer).</description>
    <link>https://dev.to/spboyer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F59907%2Fa7fc0361-8c9a-47ad-ba31-74603a740203.jpg</url>
      <title>DEV Community: Shayne Boyer</title>
      <link>https://dev.to/spboyer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spboyer"/>
    <language>en</language>
    <item>
      <title>🚀 Build Your First Remote MCP Server on Azure Using TypeScript — and Supercharge Your AI Workflows</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Wed, 26 Nov 2025 17:30:56 +0000</pubDate>
      <link>https://dev.to/spboyer/build-your-first-remote-mcp-server-on-azure-using-typescript-and-supercharge-your-ai-workflows-4aib</link>
      <guid>https://dev.to/spboyer/build-your-first-remote-mcp-server-on-azure-using-typescript-and-supercharge-your-ai-workflows-4aib</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1518770660439-4636190af475%3Fq%3D80%26w%3D1920" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1518770660439-4636190af475%3Fq%3D80%26w%3D1920" alt="Azure Remote MCP Header" width="1920" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're experimenting with the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, you've already seen how powerful it is for connecting tools, agents, and applications into unified workflows.&lt;/p&gt;

&lt;p&gt;But the real magic happens when your MCP server is &lt;strong&gt;not&lt;/strong&gt; running on your laptop… but deployed in the cloud.&lt;/p&gt;

&lt;p&gt;Azure now provides &lt;strong&gt;first-class support for Remote MCP Servers built in TypeScript and JavaScript&lt;/strong&gt;, giving you scalable, secure, team-ready capabilities for AI-integrated workflows—from GitHub Copilot to custom agent frameworks.&lt;/p&gt;

&lt;p&gt;This post covers why Remote MCP Servers matter, how Azure Functions make them simple, and where to start with official docs and sample repos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌩️ Why Build a Remote MCP Server?
&lt;/h2&gt;

&lt;p&gt;Local MCP servers are great for quick prototyping, but teams hit real limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local servers can’t scale&lt;/li&gt;
&lt;li&gt;They aren’t shareable&lt;/li&gt;
&lt;li&gt;They break inside containers and DevBoxes&lt;/li&gt;
&lt;li&gt;They can’t reach VNet-secured resources&lt;/li&gt;
&lt;li&gt;They rely on local credentials&lt;/li&gt;
&lt;li&gt;Long-running tasks are fragile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remote MCP Servers on Azure solve all of this.&lt;/p&gt;

&lt;p&gt;Running in Azure Functions gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Serverless scale&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise-grade security&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity (no secrets on laptops)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team-wide reusability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration with Azure services&lt;/strong&gt; (Key Vault, SQL, Cosmos, Storage, Container Apps, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building anything “agentic,” this unlocks a new world of capabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Start With the Official Microsoft Docs
&lt;/h2&gt;

&lt;p&gt;Azure has three key resources to help you get started:&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Full Tutorial (TypeScript)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Build a Remote MCP server on Azure Functions&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-mcp-tutorial?tabs=mcp-extension&amp;amp;pivots=programming-language-typescript" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/azure-functions/functions-mcp-tutorial?tabs=mcp-extension&amp;amp;pivots=programming-language-typescript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up your project&lt;/li&gt;
&lt;li&gt;Writing your first MCP action&lt;/li&gt;
&lt;li&gt;Deploying with &lt;code&gt;azd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Securing access&lt;/li&gt;
&lt;li&gt;Testing from VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  👉 Quickstart: Custom Remote MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/scenario-custom-remote-mcp-server?tabs=linux&amp;amp;pivots=programming-language-typescript" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/azure-functions/scenario-custom-remote-mcp-server?tabs=linux&amp;amp;pivots=programming-language-typescript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perfect if you already understand Functions and want the shortest path to success.&lt;/p&gt;


&lt;h3&gt;
  
  
  👉 Official Sample Repo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions" rel="noopener noreferrer"&gt;https://github.com/Azure-Samples/remote-mcp-functions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple MCP endpoints&lt;/li&gt;
&lt;li&gt;Schemas &amp;amp; patterns&lt;/li&gt;
&lt;li&gt;Deployment templates (&lt;code&gt;azd&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Logging + error-handling examples&lt;/li&gt;
&lt;li&gt;A recommended project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use this repo as your starting point when building your own server.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 How It Works (Simplified)
&lt;/h2&gt;

&lt;p&gt;A Remote MCP server is just an &lt;strong&gt;Azure Function that returns MCP-compliant JSON&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a minimal TypeScript example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Hello function - responds with hello message&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mcpToolHello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_toolArguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InvocationContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_toolArguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Get name from the tool arguments&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcptoolargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;triggerMetadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcptoolargs&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mcptoolargs&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, I am MCP Tool!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, I am MCP Tool!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Register the hello tool&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;toolName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Simple hello world MCP Tool that responses with a hello message.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;toolProperties&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Required property to identify the caller.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mcpToolHello&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy to Azure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;azd up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your MCP server is reachable from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code MCP Extension&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;LangChain agents&lt;/li&gt;
&lt;li&gt;Custom MCP clients&lt;/li&gt;
&lt;li&gt;Automation pipelines and CI/CD&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 What Developers Are Building Today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Cloud &amp;amp; infra automation
&lt;/h3&gt;

&lt;p&gt;Validate Bicep, deploy Container Apps, check resource health.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 DevOps workflows
&lt;/h3&gt;

&lt;p&gt;Run tests, inspect containers, automate PR tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Secure enterprise data connectors
&lt;/h3&gt;

&lt;p&gt;Provide scoped, read-only access to internal SQL, Storage, Key Vault, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Knowledge tools
&lt;/h3&gt;

&lt;p&gt;Chunk, embed, and search documents stored in Azure.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Multi-step orchestration
&lt;/h3&gt;

&lt;p&gt;Expose “one-call” MCP actions that run entire workflows under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Why TypeScript + Azure Functions Is a Perfect Match
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type-safe MCP schemas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serverless autoscale&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero infrastructure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity → no secrets in your MCP client&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-command deploy&lt;/strong&gt; (&lt;code&gt;azd up&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Great for local dev, Codespaces, or remote teams&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're already writing Node/TS, this feels natural and productive.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Try It Yourself — And Give Feedback
&lt;/h2&gt;

&lt;p&gt;This is an evolving area—and Microsoft is actively looking for real developer feedback.&lt;/p&gt;

&lt;p&gt;If you're building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;custom AI tools&lt;/li&gt;
&lt;li&gt;cloud automation&lt;/li&gt;
&lt;li&gt;team-wide secure connectors&lt;/li&gt;
&lt;li&gt;multi-tool agent solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now is the perfect time to explore Remote MCP Servers and help shape the next wave of agentic development.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Wrap-Up
&lt;/h2&gt;

&lt;p&gt;Remote MCP Servers on Azure give developers &lt;strong&gt;cloud-grade scale, identity, and reliability&lt;/strong&gt;, and TypeScript support makes them incredibly easy to adopt.&lt;/p&gt;

&lt;p&gt;Start building now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tutorial:&lt;/strong&gt; &lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/functions-mcp-tutorial?tabs=mcp-extension&amp;amp;pivots=programming-language-typescript" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/azure-functions/functions-mcp-tutorial?tabs=mcp-extension&amp;amp;pivots=programming-language-typescript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quickstart:&lt;/strong&gt; &lt;a href="https://learn.microsoft.com/en-us/azure/azure-functions/scenario-custom-remote-mcp-server?tabs=linux&amp;amp;pivots=programming-language-typescript" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/azure/azure-functions/scenario-custom-remote-mcp-server?tabs=linux&amp;amp;pivots=programming-language-typescript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sample Repo:&lt;/strong&gt; &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions" rel="noopener noreferrer"&gt;https://github.com/Azure-Samples/remote-mcp-functions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you make something cool—publish it!&lt;br&gt;
If you hit a rough edge—open an issue.&lt;br&gt;
If you have ideas—share them loudly.&lt;/p&gt;

&lt;p&gt;We’re still early in this space, and &lt;strong&gt;your creativity helps shape the direction of MCP and cloud-based agentic workflows.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>azure</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Building Container Images Without Docker: Introducing pycontainer-build</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Mon, 24 Nov 2025 18:36:28 +0000</pubDate>
      <link>https://dev.to/spboyer/building-container-images-without-docker-introducing-pycontainer-build-5go7</link>
      <guid>https://dev.to/spboyer/building-container-images-without-docker-introducing-pycontainer-build-5go7</guid>
      <description>&lt;p&gt;What if you could build production-ready container images for your Python projects without installing Docker, writing Dockerfiles, or dealing with daemon dependencies? That's the vision behind &lt;strong&gt;pycontainer-build&lt;/strong&gt; — a native, Docker-free container image builder for Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with Traditional Container Builds
&lt;/h3&gt;

&lt;p&gt;Today, containerizing Python applications typically requires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Installing Docker Desktop or Docker Engine&lt;/strong&gt; — Not always possible in locked-down corporate environments, cloud IDEs like GitHub Codespaces, or CI/CD runners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing and maintaining Dockerfiles&lt;/strong&gt; — Boilerplate, multi-stage builds, and keeping base images updated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding Docker-specific concepts&lt;/strong&gt; — Layers, build contexts, caching strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker-in-Docker in CI&lt;/strong&gt; — Complex and fragile setups with privileged containers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These friction points slow down developer onboarding and create unnecessary complexity for a straightforward task: packaging Python code into a container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter pycontainer-build
&lt;/h3&gt;

&lt;p&gt;Inspired by &lt;a href="https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk/" rel="noopener noreferrer"&gt;.NET's native container support&lt;/a&gt; and tools like &lt;a href="https://github.com/GoogleContainerTools/jib" rel="noopener noreferrer"&gt;Jib&lt;/a&gt; (Java) and &lt;a href="https://github.com/ko-build/ko" rel="noopener noreferrer"&gt;ko&lt;/a&gt; (Go), &lt;strong&gt;pycontainer-build&lt;/strong&gt; provides a Python-native way to create OCI-compliant container images.&lt;/p&gt;

&lt;p&gt;Here's what it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Build a container image&lt;/span&gt;
pycontainer build &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp:latest

&lt;span class="c"&gt;# That's it!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Dockerfile. No Docker daemon. Just pure Python creating OCI images.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;pycontainer-build introspects your Python project and automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detects your Python version&lt;/strong&gt; from &lt;code&gt;requires-python&lt;/code&gt; in &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selects the right base image&lt;/strong&gt; (e.g., &lt;code&gt;python:3.11-slim&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finds your entry points&lt;/strong&gt; from &lt;code&gt;[project.scripts]&lt;/code&gt; in &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packages your application files&lt;/strong&gt; into layers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creates an OCI-compliant image layout&lt;/strong&gt; ready for registries&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Under the hood, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses only Python stdlib (no external dependencies!)&lt;/li&gt;
&lt;li&gt;Creates proper OCI image manifests and configs&lt;/li&gt;
&lt;li&gt;Generates content-addressable layers (SHA256 digests)&lt;/li&gt;
&lt;li&gt;Supports pushing to any OCI registry (GHCR, ACR, Docker Hub, private registries)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-World Example
&lt;/h3&gt;

&lt;p&gt;Let's say you have a FastAPI application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_root&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from pycontainer!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# pyproject.toml&lt;/span&gt;
&lt;span class="nn"&gt;[project]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"myapi"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;requires-python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.11&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"fastapi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"uvicorn[standard]"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[project.scripts]&lt;/span&gt;
&lt;span class="py"&gt;myapi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"uvicorn app:app --host 0.0.0.0 --port 8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build and push with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pycontainer build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag&lt;/span&gt; ghcr.io/myorg/myapi:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--include-deps&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pycontainer-build will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull &lt;code&gt;python:3.11-slim&lt;/code&gt; as the base image&lt;/li&gt;
&lt;li&gt;Package your &lt;code&gt;app.py&lt;/code&gt; and dependencies&lt;/li&gt;
&lt;li&gt;Configure the entrypoint to run uvicorn&lt;/li&gt;
&lt;li&gt;Push the image to GitHub Container Registry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Compare this to a typical Dockerfile approach:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Copy application code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Expose port&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;

&lt;span class="c"&gt;# Run the application&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; ghcr.io/myorg/myapi:latest &lt;span class="nb"&gt;.&lt;/span&gt;
docker push ghcr.io/myorg/myapi:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Dockerfile approach requires Docker installed, manual maintenance of the Dockerfile, and explicit knowledge of best practices (multi-stage builds, layer optimization, etc.). pycontainer-build handles all of this automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🎯 Zero Docker Dependencies
&lt;/h4&gt;

&lt;p&gt;Pure Python implementation using only stdlib. Works in environments where Docker isn't available or allowed.&lt;/p&gt;

&lt;h4&gt;
  
  
  🧠 Smart Auto-Detection
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Python version from &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Entry points from &lt;code&gt;[project.scripts]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Project structure (&lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;app/&lt;/code&gt;, or package directories)&lt;/li&gt;
&lt;li&gt;Web frameworks (FastAPI, Flask, Django)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  📦 Base Image Support
&lt;/h4&gt;

&lt;p&gt;Build on top of official Python images, distroless, or custom base images. Properly merges layers and configuration.&lt;/p&gt;

&lt;h4&gt;
  
  
  🚀 Registry Integration
&lt;/h4&gt;

&lt;p&gt;Push to any OCI-compatible registry with automatic authentication:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;li&gt;Azure Container Registry (ACR)&lt;/li&gt;
&lt;li&gt;Docker Hub&lt;/li&gt;
&lt;li&gt;Private registries&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ⚡ Layer Caching
&lt;/h4&gt;

&lt;p&gt;Content-addressable caching with LRU eviction. Only rebuild layers that changed.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔒 Security &amp;amp; Compliance
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;SBOM generation (SPDX 2.3 or CycloneDX 1.4)&lt;/li&gt;
&lt;li&gt;Reproducible builds with deterministic timestamps&lt;/li&gt;
&lt;li&gt;No secrets in images (proper credential handling)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🔌 Toolchain Integrations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Poetry plugin&lt;/strong&gt;: &lt;code&gt;poetry build-container&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hatch plugin&lt;/strong&gt;: &lt;code&gt;hatch build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions&lt;/strong&gt;: Reusable workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Developer CLI&lt;/strong&gt;: Custom build hooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code extension&lt;/strong&gt;: Build from command palette&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. CI/CD Without Docker&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Actions&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-python@v5&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install pycontainer-build&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pycontainer build --tag ghcr.io/${{ github.repository }}:latest --push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need for Docker daemon or privileged containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Local Development&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick iteration&lt;/span&gt;
pycontainer build &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp:dev
podman run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 myapp:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Multi-Service Applications&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build multiple services&lt;/span&gt;
pycontainer build &lt;span class="nt"&gt;--context&lt;/span&gt; ./api &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp-api:latest
pycontainer build &lt;span class="nt"&gt;--context&lt;/span&gt; ./worker &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp-worker:latest
pycontainer build &lt;span class="nt"&gt;--context&lt;/span&gt; ./frontend &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp-frontend:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Restricted Environments&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Codespaces (no Docker daemon)&lt;/li&gt;
&lt;li&gt;Azure Dev Box&lt;/li&gt;
&lt;li&gt;Corporate locked-down workstations&lt;/li&gt;
&lt;li&gt;Air-gapped environments (offline builds)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration Options
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Command-Line Interface
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pycontainer build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp:v1.2.3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--base-image&lt;/span&gt; python:3.11-slim &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--include-deps&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workdir&lt;/span&gt; /app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;value &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/amd64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sbom&lt;/span&gt; spdx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--config&lt;/span&gt; pycontainer.toml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Configuration File (&lt;code&gt;pycontainer.toml&lt;/code&gt;)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[build]&lt;/span&gt;
&lt;span class="py"&gt;base_image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"python:3.11-slim"&lt;/span&gt;
&lt;span class="py"&gt;workdir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/app"&lt;/span&gt;
&lt;span class="py"&gt;include_deps&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;reproducible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[build.labels]&lt;/span&gt;
&lt;span class="py"&gt;maintainer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"team@example.com"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0.0"&lt;/span&gt;

&lt;span class="nn"&gt;[build.env]&lt;/span&gt;
&lt;span class="py"&gt;PORT&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"8080"&lt;/span&gt;
&lt;span class="py"&gt;ENV&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"production"&lt;/span&gt;

&lt;span class="nn"&gt;[registry]&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ghcr.io/myorg/myapp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Python API
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pycontainer.config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BuildConfig&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pycontainer.builder&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ImageBuilder&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BuildConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;myapp:latest&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python:3.11-slim&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;include_deps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ENV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;generate_sbom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spdx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reproducible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ImageBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for integration with build tools, AI agents, and automation scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Under the Hood: OCI Image Spec
&lt;/h3&gt;

&lt;p&gt;pycontainer-build creates compliant OCI images following the &lt;a href="https://github.com/opencontainers/image-spec" rel="noopener noreferrer"&gt;OCI Image Specification&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/image/
  ├── index.json              # OCI index (manifest list)
  ├── oci-layout              # Version marker
  ├── blobs/sha256/
  │   ├── &amp;lt;manifest-digest&amp;gt;   # Manifest blob
  │   ├── &amp;lt;config-digest&amp;gt;     # Config blob
  │   └── &amp;lt;layer-digest&amp;gt;      # Application layer (tar)
  └── refs/tags/
      └── &amp;lt;tag-name&amp;gt;          # Tag reference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created as a tar archive with proper paths (&lt;code&gt;/app/src/&lt;/code&gt;, &lt;code&gt;/app/pyproject.toml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Compressed (optional)&lt;/li&gt;
&lt;li&gt;Hashed with SHA256 for content-addressable storage&lt;/li&gt;
&lt;li&gt;Referenced in the manifest by digest&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means images are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt; — Work with any OCI-compatible runtime (Docker, Podman, containerd, CRI-O)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cacheable&lt;/strong&gt; — Layers shared across images save space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifiable&lt;/strong&gt; — SHA256 digests ensure integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparison with Other Tools
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;pycontainer&lt;/th&gt;
&lt;th&gt;Docker/Dockerfile&lt;/th&gt;
&lt;th&gt;Jib (Java)&lt;/th&gt;
&lt;th&gt;ko (Go)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No Docker daemon&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language-native&lt;/td&gt;
&lt;td&gt;✅ Python&lt;/td&gt;
&lt;td&gt;❌ Generic&lt;/td&gt;
&lt;td&gt;✅ Java&lt;/td&gt;
&lt;td&gt;✅ Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero config&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ Requires Dockerfile&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-detects dependencies&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure stdlib&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python-specific optimizations&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Current Limitations
&lt;/h3&gt;

&lt;p&gt;This is an &lt;strong&gt;experimental project&lt;/strong&gt;. Known limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-arch builds&lt;/strong&gt;: Platform flag sets metadata only; no actual cross-compilation yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework detection&lt;/strong&gt;: Supports FastAPI, Flask, Django (easy to extend)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SBOM scope&lt;/strong&gt;: Python packages only (doesn't parse OS packages from base images)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are planned for future phases. Contributions welcome!&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Installation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install from source (PyPI package coming soon)&lt;/span&gt;
git clone https://github.com/spboyer/pycontainer-build.git
&lt;span class="nb"&gt;cd &lt;/span&gt;pycontainer-build
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Quick Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a sample app&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;myapp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;myapp
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'print("Hello from container!")'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; app.py
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pyproject.toml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[project]
name = "myapp"
version = "0.1.0"
requires-python = "&amp;gt;=3.11"
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Build container&lt;/span&gt;
pycontainer build &lt;span class="nt"&gt;--tag&lt;/span&gt; myapp:latest

&lt;span class="c"&gt;# Output location&lt;/span&gt;
&lt;span class="nb"&gt;ls &lt;/span&gt;dist/image/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Push to GitHub Container Registry
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Authenticate (uses GitHub CLI or GITHUB_TOKEN env var)&lt;/span&gt;
gh auth login

&lt;span class="c"&gt;# Build and push&lt;/span&gt;
pycontainer build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag&lt;/span&gt; ghcr.io/yourusername/myapp:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;h4&gt;
  
  
  For Python Developers
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simpler workflow&lt;/strong&gt; than writing Dockerfiles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster onboarding&lt;/strong&gt; to containerization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Docker Desktop licensing concerns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Python experience&lt;/strong&gt; (feels like &lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;poetry&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  For DevOps Teams
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eliminate Docker-in-Docker&lt;/strong&gt; complexity in CI/CD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster builds&lt;/strong&gt; with intelligent caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security compliance&lt;/strong&gt; with SBOM generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible builds&lt;/strong&gt; with deterministic layers&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  For the Python Ecosystem
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Modern, standards-based&lt;/strong&gt; approach to containers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foundation for tool integrations&lt;/strong&gt; (Poetry, Hatch, Azure DevOps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opens possibilities&lt;/strong&gt; for Python in cloud-native environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aligns with .NET/Java&lt;/strong&gt; container strategies (unified multi-language story)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Roadmap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Completed&lt;/strong&gt; (Phases 0-4):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Core OCI image generation&lt;/li&gt;
&lt;li&gt;✅ Registry push support&lt;/li&gt;
&lt;li&gt;✅ Base image support&lt;/li&gt;
&lt;li&gt;✅ Layer caching&lt;/li&gt;
&lt;li&gt;✅ SBOM generation&lt;/li&gt;
&lt;li&gt;✅ Toolchain integrations (Poetry, Hatch, GitHub Actions, VS Code)&lt;/li&gt;
&lt;li&gt;✅ Framework auto-detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Coming Soon&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔜 Full multi-arch builds (ARM64, AMD64)&lt;/li&gt;
&lt;li&gt;🔜 PyPI package distribution&lt;/li&gt;
&lt;li&gt;🔜 More framework support (Streamlit, Gradio, etc.)&lt;/li&gt;
&lt;li&gt;🔜 Build optimization (parallel layer creation)&lt;/li&gt;
&lt;li&gt;🔜 Integration with more CI/CD platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try It Out and Share Feedback!
&lt;/h3&gt;

&lt;p&gt;This project is experimental and evolving based on community feedback. I'd love to hear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What use cases resonate with you?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What blockers do you face with current Docker workflows?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What features would make this production-ready for your team?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href="https://github.com/spboyer/pycontainer-build" rel="noopener noreferrer"&gt;github.com/spboyer/pycontainer-build&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Feedback &amp;amp; Issues&lt;/strong&gt;: &lt;a href="https://github.com/spboyer/pycontainer-build/issues" rel="noopener noreferrer"&gt;github.com/spboyer/pycontainer-build/issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Documentation&lt;/strong&gt;: See &lt;a href="https://github.com/spboyer/pycontainer-build#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt; for more details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find this useful, give it a star ⭐ on GitHub and share your experience!&lt;/p&gt;




&lt;h3&gt;
  
  
  Acknowledgments
&lt;/h3&gt;

&lt;p&gt;Inspired by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/sdk-container-builds" rel="noopener noreferrer"&gt;.NET SDK's native container support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoogleContainerTools/jib" rel="noopener noreferrer"&gt;Jib (Java)&lt;/a&gt; — Daemonless container builds&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ko-build/ko" rel="noopener noreferrer"&gt;ko (Go)&lt;/a&gt; — Simple container images for Go&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>docker</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Unveiling VS Code for Web - Azure</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Mon, 11 Nov 2024 18:29:54 +0000</pubDate>
      <link>https://dev.to/azure/unveiling-vs-code-for-web-azure-20ch</link>
      <guid>https://dev.to/azure/unveiling-vs-code-for-web-azure-20ch</guid>
      <description>&lt;p&gt;Watch the live stream replay - &lt;a href="https://www.youtube.com/live/qmJigVn8gcg?si=uvAaygofN7CRiHkf" rel="noopener noreferrer"&gt;View the VS Code You Tube&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://aka.ms/VSCodefortheWebAzure" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Sign Up for the Private Preview&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Welcome to the freshly minted VS Code for Web - Azure, a development environment designed to simplify your Azure app building experience. This synergistic blend of VS Code and Azure is geared towards developers, offering a universal environment powered by Azure, to create, debug, and deploy applications. Let's dive into this transformative upgrade, its offerings, and how it revolutionizes the development experience. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose VS Code for Web - Azure?
&lt;/h2&gt;

&lt;p&gt;VS Code for Web - Azure is a potent tool for developers looking to deploy their apps using Azure services seamlessly. Boasting a host of Azure's incredible features, this fully-fledged development environment is baked into the browser, unleashing the power of Azure development minus the intimidating setup process. The best part? It syncs seamlessly with your Azure subscription, bringing the universe of Azure services right at your doorstep.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/live/qmJigVn8gcg?si=uvAaygofN7CRiHkf" rel="noopener noreferrer"&gt;Check out the discussion&lt;/a&gt; during an interactive live stream with insightful commentary by Olivia, a Developer Advocate on the VS Code team, Alex, an engineer on the Azure extensions team, and Meera, a Product Manager in the Azure Dev Tools team.  &lt;/p&gt;

&lt;p&gt;Watch the live stream replay - &lt;a href="https://www.youtube.com/live/qmJigVn8gcg?si=uvAaygofN7CRiHkf" rel="noopener noreferrer"&gt;View the VS Code You Tube&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  One-click Provision and Deploy
&lt;/h2&gt;

&lt;p&gt;Through the arsenal of curated Azure Developer CLI (azd) templates, you can effortlessly deploy a containerized app, configure CI/CD, or even launch your machine learning model. This simple Flask app or an intricate AI app is only a click away!&lt;/p&gt;

&lt;p&gt;&lt;a href="link" class="ltag_cta ltag_cta--branded"&gt;Check out the new AI Azure App Templates&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcsh9zr36phz8me88tji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcsh9zr36phz8me88tji.png" alt="Image description" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on 'try template,' brings you to VS Code for the Web. You will be required to sign in to your Azure account, a one-time process that carries over to all your future sessions. With a swift click on 'one-click provision and deploy,' and choosing your Azure subscription and Azure location, you set in motion a series of automated processes, leading up to deploying the app. What's more, while your deployment is underway, you could get busy beneath the surface with the host of features enlisted in the walkthrough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Azure on Your Browser
&lt;/h2&gt;

&lt;p&gt;From conversing with GitHub copilot, a preloaded option, and an enviable service that suggests code and auto-completes your lines to managing your Azure resources, you are thrust into an all-in-one space for effective project management. Whether it's deploying your app using Azure CLI or using the Azure Developer CLI, the terminal employed in VS Code for Web - Azure is a wellspring of opportunities.&lt;/p&gt;

&lt;p&gt;As a developer, you can now get a handle on all your Azure subscriptions, monitor and manage Azure applications, using CI/CD, build your app, and deploy it all within this single space! Notably, all these services are tethered to anchored compute, allowing for an array of tasks. &lt;/p&gt;

&lt;h2&gt;
  
  
  Saving Your Work
&lt;/h2&gt;

&lt;p&gt;When dealing with a web-based coding environment, an immediate concern is retaining changes made to your code. Fortunately, you can save the changes to your projects in VS Code for Web - Azure by committing your code to GitHub. With just a few clicks, every line and letter could be saved to your GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;VS Code for Web - Azure dispenses the need for bouncing between different applications, simplifies the initiation process, and mitigates the cognitive overhead associated with juggling various tools.&lt;/p&gt;

&lt;p&gt;The private preview phase of VS Code for Web - Azure is an invite for feedback from developers worldwide. What's your take on this exciting new development environment, and what features would make your coding experience more enjoyable?&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/developer/tools/" rel="noopener noreferrer"&gt;Azure Developer Tools&lt;/a&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/cloud-shell/overview" rel="noopener noreferrer"&gt;Azure Cloud Shell&lt;/a&gt;&lt;br&gt;
&lt;a href="https://copilot.github.com/" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack" rel="noopener noreferrer"&gt;VS Code Azure Extensions&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Streamline Your Azure Workflow with GitHub Copilot for Azure in VS Code</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Fri, 01 Nov 2024 18:08:03 +0000</pubDate>
      <link>https://dev.to/azure/streamline-your-azure-workflow-with-github-copilot-for-azure-in-vs-code-2a2n</link>
      <guid>https://dev.to/azure/streamline-your-azure-workflow-with-github-copilot-for-azure-in-vs-code-2a2n</guid>
      <description>&lt;p&gt;I'm excited to share some great news with you all. We've just launched the public preview of &lt;a href="https://aka.ms/InstallGitHubCopilotForAzure" rel="noopener noreferrer"&gt;GitHub Copilot for Azure&lt;/a&gt; - a fantastic new tool that seamlessly integrates with GitHub Copilot Chat in VS Code. Think of it as your personal assistant for navigating the Azure cloud.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://techcommunity.microsoft.com/t5/microsoft-developer-community/streamline-your-azure-workflow-introducing-github-copilot-for/ba-p/4276989" rel="noopener noreferrer"&gt;announcement post&lt;/a&gt; from Chris Harris!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fs%2Fgxcuf89792%2Fimages%2FbS00Mjc2OTg5LTYzMTQ2M2k4RUEyRkQ5NEJGNzVEN0JC%3Frevision%3D12" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fs%2Fgxcuf89792%2Fimages%2FbS00Mjc2OTg5LTYzMTQ2M2k4RUEyRkQ5NEJGNzVEN0JC%3Frevision%3D12" alt="azure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GitHub Copilot for Azure?
&lt;/h2&gt;

&lt;p&gt;Instead of constantly switching between your IDE and the Azure portal to manage infrastructure or search for commands and arguments, you can now focus on what you do best – writing code. Whether you're provisioning services or deploying apps, just ask &lt;strong&gt;@azure&lt;/strong&gt; in GitHub Copilot Chat and handle it all right inside your editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learning about Azure&lt;/strong&gt;: GitHub Copilot for Azure makes learning about Azure services a breeze. It pulls in relevant, up-to-date documentation like answers on Azure OpenAI models, Azure AI Search, or even how pricing works for services like Azure SQL, all within your coding environment. This is super handy for developers just starting with Azure, helping them grasp complex concepts faster, while also saving time for experienced developers who need quick reminders or details on the latest services and features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploying Apps&lt;/strong&gt;: GitHub Copilot for Azure takes the hassle out of deploying your apps by guiding you through tasks like setting up resources or automating deployments. Whether you're building a RAG (Retrieval-Augmented Generation) app with Python, creating a CI/CD pipeline, or using the Azure Developer CLI (azd) to deploy your project, &lt;strong&gt;@azure&lt;/strong&gt; can suggest app templates, the right commands, and configurations straight from your code editor. No need to search for sample applications, look up CLI commands, or YAML syntax - &lt;strong&gt;@azure&lt;/strong&gt; fills in the blanks for you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;: Sometimes things go wrong. When they do, GitHub Copilot for Azure simplifies diagnosing and troubleshooting by providing quick insights into your application's performance and resource issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started Now!
&lt;/h2&gt;

&lt;p&gt;You can get started right now by installing &lt;a href="https://aka.ms/InstallGitHubCopilotForAzure" rel="noopener noreferrer"&gt;GitHub Copilot for Azure from the VS Code Marketplace&lt;/a&gt;. It's designed to make your life easier and your workflow smoother.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cloud</category>
      <category>vscode</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>.NET Learning Challenge!</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Sun, 01 Nov 2020 20:00:26 +0000</pubDate>
      <link>https://dev.to/dotnet/net-learning-challenge-4008</link>
      <guid>https://dev.to/dotnet/net-learning-challenge-4008</guid>
      <description>&lt;h2&gt;
  
  
  Compete, Learn, and Develop Skills
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aka.ms/dotnetskills" rel="noopener noreferrer"&gt;https://aka.ms/dotnetskills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;November 1, 2020 - November 30, 2020&lt;/p&gt;

&lt;p&gt;Compete against friends and coworkers by completing interactive modules on how to build apps across multiple platforms with .NET and earn your rank on the leaderboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9khe4qluvaxrs11sxt33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9khe4qluvaxrs11sxt33.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over 40 hours of &lt;strong&gt;FREE&lt;/strong&gt; Learning inside of this awesome collection of 8 Paths and 5 additional bonus modules.&lt;/p&gt;

&lt;p&gt;Topics include Basic C# skills, Web API development, Blazor Apps, Static Web Apps, Xamarin and Visual Studio or VS Code&lt;/p&gt;

&lt;p&gt;Get started by going to &lt;a href="https://aka.ms/dotnetskills" rel="noopener noreferrer"&gt;https://aka.ms/dotnetskills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learning Paths include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build .NET applications with C#&lt;/li&gt;
&lt;li&gt;Add logic to your C# applications with C#&lt;/li&gt;
&lt;li&gt;Work with data in C#&lt;/li&gt;
&lt;li&gt;many more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modules include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a web API with ASP.NET Core&lt;/li&gt;
&lt;li&gt;Improve the developer experience of an API with Swagger&lt;/li&gt;
&lt;li&gt;Build a web app with Blazor Web Assembly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of the challenge, you'll have marketable skills to better yourself and your career.&lt;/p&gt;

&lt;p&gt;Tweet about your progress with the hastag &lt;strong&gt;#dotnetskills&lt;/strong&gt;. Let me know &lt;a class="mentioned-user" href="https://dev.to/spboyer"&gt;@spboyer&lt;/a&gt; how you're doing. Challenge your friends and colleagues. How many modules and paths can you complete this month?&lt;/p&gt;

&lt;p&gt;Have fun and learn.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ASP.NET Community StandUp : FAST Framework</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Mon, 13 Jul 2020 16:12:26 +0000</pubDate>
      <link>https://dev.to/dotnet/asp-net-community-standup-fast-framework-4lbg</link>
      <guid>https://dev.to/dotnet/asp-net-community-standup-fast-framework-4lbg</guid>
      <description>&lt;p&gt;&lt;a href="https://fast.design"&gt;FAST&lt;/a&gt; is a collection of JavaScript packages centered around web standards, designed to help you efficiently tackle some of the most common challenges in website and application design and development.&lt;/p&gt;

&lt;p&gt;In this episode, Rob Eisenberg sits with us to run through a number of the components, a &lt;a href="https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor?WT.mc_id=blog-devto-shboyer"&gt;Blazor web assembly&lt;/a&gt; example and answer questions about the what and why and talk about the roadmap for FAST!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sYTH_xYH3iA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Be sure to subscribe to the &lt;a href="https://www.youtube.com/channel/UCiaZbznpWV1o-KLxj8zqR6A"&gt;.NET Foundation Channel&lt;/a&gt; for more great .NET Content&lt;/p&gt;

&lt;h3&gt;
  
  
  Links from the show
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.theurlist.com/aspnet-standup-2020-07-07"&gt;Jon's Community Links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FAST - &lt;a href="https://fast.design"&gt;https://fast.design&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/fast/"&gt;FAST Github repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://explore.fast.design/components"&gt;FAST Component explorer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>dotnet</category>
      <category>css</category>
    </item>
    <item>
      <title>Are you reading the "What's New" in .NET docs?</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Fri, 21 Feb 2020 14:47:32 +0000</pubDate>
      <link>https://dev.to/dotnet/are-you-reading-the-what-s-new-in-net-docs-152f</link>
      <guid>https://dev.to/dotnet/are-you-reading-the-what-s-new-in-net-docs-152f</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AEoJh6cY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/02/document_desk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AEoJh6cY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/02/document_desk.png" alt="Are you reading the"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you know that every month, the docs team at Microsoft has a post for &lt;a href="https://docs.microsoft.com/dotnet/whats-new/?WT.mc_id=blog-docs-shboyer"&gt;what's new in the .NET documentation&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;For each month there are new articles, updates to existing docs, and kudos for the &lt;a href="https://docs.microsoft.com/en-us/dotnet/whats-new/dotnet-2020-01#community-contributors"&gt;community contributors&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's super easy to get involved in contributing to the docs for the related technologies you are invested or interested in.  See the &lt;a href="https://docs.microsoft.com/contribute?WT.mc_id=blog-docs-shboyer"&gt;Microsoft docs contributors guide&lt;/a&gt; or simply click the "Edit" link at the top of any doc to get started, they are all open source!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are some of the highlights for&lt;a href="https://docs.microsoft.com/dotnet/whats-new/dotnet-2020-01?WT.mc_id=blog-docs-shboyer"&gt;last month&lt;/a&gt; .NET Docs&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.microsoft.com/dotnet/architecture/cloud-native/?WT.mc_id=blog-docs-shboyer"&gt;&lt;strong&gt;Architecting Cloud-Native Apps for Azure architecture guide e-book&lt;/strong&gt;&lt;/a&gt; added some new sections -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/dotnet/architecture/cloud-native/azure-caching?WT.mc_id=blog-docs-shboyer"&gt;Caching in a cloud native app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/dotnet/architecture/cloud-native/database-per-microservice?WT.mc_id=blog-docs-shboyer"&gt;Database per microservice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/dotnet/architecture/cloud-native/elastic-search-in-azure?WT.mc_id=blog-docs-shboyer"&gt;Elasticsearch in in a cloud native app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.microsoft.com/dotnet/csharp/?WT.mc_id=blog-docs-shboyer"&gt;C# language&lt;/a&gt;&lt;/strong&gt; revised the &lt;a href="https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/value-types?WT.mc_id=blog-docs-shboyer"&gt;Value types&lt;/a&gt; and &lt;a href="https://docs.microsoft.com/dotnet/csharp/programming-guide/xmldoc/inheritdoc?WT.mc_id=blog-docs-shboyer"&gt;added new  xml documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET&lt;/strong&gt; added a great new article in the &lt;strong&gt;&lt;a href="https://docs.microsoft.com/dotnet/standard/?WT.mc_id=blog-docs-shboyer"&gt;.NET Guide&lt;/a&gt;&lt;/strong&gt; on &lt;a href="https://docs.microsoft.com/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to?WT.mc_id=blog-docs-shboyer"&gt;How to migrate from Newtonsoft.Json to System.Text.Json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Other areas of the docs are also adding similar related what's new pages too. Check out &lt;strong&gt;&lt;a href="https://docs.microsoft.com/aspnet/core/whats-new/?view=aspnetcore-3.1&amp;amp;WT.mc_id=blog-docs-shboyer"&gt;ASP.NET Core docs updates&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://docs.microsoft.com/xamarin/whats-new/?WT.mc_id=blog-docs-shboyer"&gt;Xamarin updates&lt;/a&gt;&lt;/strong&gt; too!&lt;/p&gt;

&lt;p&gt;The docs continue to grow and evolve. Check in often on these pages to keep up to date with the latest content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oAyMDuos--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/y5qmK8RV5Vw" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oAyMDuos--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/y5qmK8RV5Vw" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Updating the my blog from AppService to Containers...finally</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Fri, 17 Jan 2020 18:53:34 +0000</pubDate>
      <link>https://dev.to/azure/updating-the-my-blog-from-appservice-to-containers-finally-1i61</link>
      <guid>https://dev.to/azure/updating-the-my-blog-from-appservice-to-containers-finally-1i61</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5RMkxj4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1455487890814-f11ab4eaec4b%3Fixlib%3Drb-1.2.1%26q%3D80%26fm%3Djpg%26crop%3Dentropy%26cs%3Dtinysrgb%26w%3D2000%26fit%3Dmax%26ixid%3DeyJhcHBfaWQiOjExNzczfQ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5RMkxj4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1455487890814-f11ab4eaec4b%3Fixlib%3Drb-1.2.1%26q%3D80%26fm%3Djpg%26crop%3Dentropy%26cs%3Dtinysrgb%26w%3D2000%26fit%3Dmax%26ixid%3DeyJhcHBfaWQiOjExNzczfQ" alt="Updating the my blog from AppService to Containers...finally"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have been running the well known &lt;a href="https://ghost.org"&gt;ghost blogging platform&lt;/a&gt; on &lt;a href="https://docs.microsoft.com/azure/app-service/?WT.mc_id=-blog-shboyer"&gt;Azure AppService&lt;/a&gt; since ghost was version 0.10, about 8 years. In fact, it was before Azure had resource groups.&lt;/p&gt;

&lt;p&gt;This means that it's Node, on Windows Servers and I am doing a bit of maintenance for upgrading the version of the platform. Running things like gulp.js scripts for builds and so and hoping for &lt;a href="https://github.com/projectkudu/kudu/wiki"&gt;Kudu&lt;/a&gt;to do my git deployment after a couple of tries because I am running on a small box and there are limitations for networking and npm and start scripts to complete in enough time.&lt;/p&gt;

&lt;p&gt;After a few successful upgrades, it became overwhelmingly painful to try and make the updates and life, work, etc. got in the way and now ghost is on version 3.2 and I am far to behind to try and do a manual update. So the jump to containers makes sense.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;The data conversion was a little more work as I had to install ghost 1.0, import my data &amp;gt; export it and then import to 3.0.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Choosing the setup
&lt;/h1&gt;

&lt;p&gt;I am using the latest &lt;strong&gt;ghost:3.2-alpine&lt;/strong&gt; image available on Docker Hub.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker run -d -p 3001:2368 ghost:3.2-alpine&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It uses SQLite by default as the backend, but also offers MySQL which I'll use as an option through MySQL on Azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analytics
&lt;/h2&gt;

&lt;p&gt;I have been using Google Analytics for the past 12 years on my blog and want to continue with this solution. However, if you're starting a new solution, &lt;a href="https://docs.microsoft.com/azure/azure-monitor/app/app-insights-overview?WT.mc_id=-blog-shboyer"&gt;Application Insights&lt;/a&gt; is a quick click option when creating your AppService instance.&lt;/p&gt;

&lt;p&gt;Create a new Dockerfile and add &lt;a href="https://docs.microsoft.com/azure/azure-monitor/app/app-insights-overview?WT.mc_id=-blog-shboyer"&gt;Application Insights&lt;/a&gt; in this manner:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM ghost:3.2-alpine

# Add app-insights globally
RUN npm install -g applicationinsights

# Link app insights to avoid rebuild/validate projects npm package tree
RUN cd current &amp;amp;&amp;amp; npm link applicationinsights 

# ENV APPINSIGHTS_INSTRUMENTATIONKEY xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
RUN sed -i.bak -e "/var startTime = Date.now(),/a appInsights = require('applicationinsights'), " \
                -e "/ghost, express, common, urlService, parentApp;/a appInsights.setup().start();" current/index.js

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You'll need to build your own Dockerfile and host it in a repository. i.e. Azure Container Registry, Docker Hub, GitHub etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This adds the npm package for &lt;a href="https://docs.microsoft.com/azure/azure-monitor/app/app-insights-overview?WT.mc_id=-blog-shboyer"&gt;Application Insights&lt;/a&gt; and adds the script to the &lt;strong&gt;index,js&lt;/strong&gt; files of the application. Be sure to add your &lt;strong&gt;APPINSIGHTS_INSTRUMENTATIONKEY&lt;/strong&gt; environment variable to your App Service Configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure Web App for Containers
&lt;/h2&gt;

&lt;p&gt;As I mentioned, the previous version was hosted in Azure App Service on Windows (Node 10 + Windows). Now we are moving to Linux (Alpine) on &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/containers/"&gt;Web App for Containers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/azure/app-service/containers/app-service-linux-cli?WT.mc_id=-blog-shboyer"&gt;Creating the app service&lt;/a&gt; was really simple. A single command line got the job started for me.  (ok maybe 2, need a service plan too)&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Created my S1 service plan
az appservice plan create -n spboyerblog20 -g spboyer --is-linux - "East US" --sku S1 --number-of-workers 1

# Create the app service with the alpine 3.2 ghost image
az webapp create -n spboyer -g spboyer -p spboyerblog20 -i ghost:3.2-alpine

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  MySQL
&lt;/h3&gt;

&lt;p&gt;I have setup the database backend using &lt;a href="https://azure.microsoft.com/services/mysql/?WT.mc_id=-blog-shboyer"&gt;Azure Database for MySQL&lt;/a&gt; selecting bare minimums and an auto growth option - Basic, 1 vCore(s), 10 GB.&lt;/p&gt;

&lt;p&gt;The data connections are set as ENV variables in my application settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oBUXe_IE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oBUXe_IE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image.png" alt="Updating the my blog from AppService to Containers...finally"&gt;&lt;/a&gt;Database settings for MySQL&lt;/p&gt;

&lt;p&gt;Using a service for my data takes care of the potential data loss should the container fail. However, there are files like my &lt;strong&gt;themes and images&lt;/strong&gt; that I want to make sure I don't lose if the container decides to restart or when I put in a customer container and CI/CD.  Enter -&amp;gt; &lt;a href="https://docs.microsoft.com/azure/storage/?WT.mc_id=-blog-shboyer"&gt;Azure Storage&lt;/a&gt; and &lt;a href="https://docs.microsoft.com/azure/app-service/containers/how-to-serve-content-from-azure-storage?WT.mc_id=-blog-shboyer"&gt;Path mappings in Web App for Containers&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;I created a File Share in my storage account called &lt;strong&gt;contentfiles,&lt;/strong&gt; where I can upload/update this content as well as interact with it using any SDK or even an Azure Function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mAg8aUs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mAg8aUs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image-1.png" alt="Updating the my blog from AppService to Containers...finally"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, to map the path to the container set it in the &lt;strong&gt;Path mappings&lt;/strong&gt; section of my configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xuj0mXDV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xuj0mXDV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tattoocoder.com/content/images/2020/01/image-2.png" alt="Updating the my blog from AppService to Containers...finally"&gt;&lt;/a&gt;Path Mappings&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be sure to set the ENV in configuration&lt;br&gt;&lt;br&gt;
&lt;strong&gt;paths__contentPath&lt;/strong&gt; to &lt;strong&gt;/var/lib/ghost/content_files&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This can also be done using the Azure CLI, however I found it easier using the GUI for this task.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;az webapp config storage-account add -g &amp;lt;resource-group&amp;gt; --custom-id Content-name [Storage Account Name] --share-name contentfiles --access-key [Storage Account Key] mount-path /var/lib/ghost/content_files&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other configuration settings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NODE_ENV : production&lt;/li&gt;
&lt;li&gt;url : .azurewebsites.net OR your custom domain (cause links to break)&lt;/li&gt;
&lt;li&gt;WEBSITES_PORT : 2368 (internal port for ghost) - this my be a regression for auto detecting port used by containers.&lt;/li&gt;
&lt;li&gt;PORT : 2368  (internal port for ghost) - this my be a regression for auto detecting port used by containers. &lt;em&gt;not a duplicate&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional Notable changes
&lt;/h2&gt;

&lt;p&gt;I run Cloudflare for DNS and caching, so there were some changes I needed to make for my custom domains. The DNS changes took about 30 seconds to make the A, CNAME and TXT updates. Either it's much easier or I know what I'm doing.&lt;/p&gt;

&lt;p&gt;Caching was purged, pushed a button and SSL - done, comes free with Cloudflare.&lt;/p&gt;




&lt;p&gt;After all that, very happy. Was great and Azure was super easy to get setup on containers and now I am positioned for CI/CD on GitHub Actions or Azure DevOps or whatever I want. Bring on the updates!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1qHh5nWJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/SdyaoeeEutE" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1qHh5nWJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/SdyaoeeEutE" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>docker</category>
      <category>ghost</category>
    </item>
    <item>
      <title>So Many Ways to Learn .NET in 2020</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Wed, 08 Jan 2020 16:59:46 +0000</pubDate>
      <link>https://dev.to/dotnet/so-many-ways-to-learn-net-in-2020-ga3</link>
      <guid>https://dev.to/dotnet/so-many-ways-to-learn-net-in-2020-ga3</guid>
      <description>&lt;p&gt;It's a new year and sure to be on your list, as well as mine, is learning. Here is a quick list of some .NET learning resources for you to check off that resolution for 2020.&lt;/p&gt;

&lt;h2&gt;
  
  
  .NET 101 Videos - &lt;a href="https://dotnet.microsoft.com/learn/videos?WT.mc_id=learn-blog-shboyer"&gt;dot.net/videos&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q5Glfwkw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/dotnet-videos-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q5Glfwkw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/dotnet-videos-1.png" alt="So Many Ways to Learn .NET in 2020"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In September of 2019, many members if the .NET team created over 100 videos for topics including C# 101, .NET, desktop apps, ASP.NET web apps, learning containers and Docker. More have been added recently including a whole series around creating and managing NuGet packages.&lt;/p&gt;

&lt;p&gt;All of the videos are available on &lt;a href="https://www.youtube.com/channel/UCvtT19MZW8dq5Wwfu6B0oxw"&gt;YouTube&lt;/a&gt; or &lt;a href="https://channel9.msdn.com/Search?term=101&amp;amp;WT.mc_id=learn-blog-shboyer"&gt;Channel 9&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsoft Learn
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/?WT.mc_id=learn-blog-shboyer"&gt;Microsoft Learn&lt;/a&gt; allows you to master core concepts at your speed. Take 15 minutes to complete a module or start a whole learning path over a course of an hour or multiple hours on your schedule.&lt;/p&gt;

&lt;h4&gt;
  
  
  C# Modules
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3zKmqmVg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/csharp-learn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3zKmqmVg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/csharp-learn.png" alt="So Many Ways to Learn .NET in 2020"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/browse/?term=c%23&amp;amp;WT.mc_id=learn-blog-shboyer"&gt;Over 20 Modules&lt;/a&gt; on C# available.&lt;/p&gt;

&lt;h4&gt;
  
  
  ASP.NET / .NET Core Modules
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SWvja5uz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/aspnet-learn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SWvja5uz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://tattoocoder.com/content/images/2020/01/aspnet-learn.png" alt="So Many Ways to Learn .NET in 2020"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/modules/build-web-api-net-core/?WT.mc_id=learn-blog-shboyer"&gt;Create a web API with ASP.NET Core&lt;/a&gt; - Create a RESTful service with ASP.NET Core that supports Create, Read, Update, Delete (CRUD) operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/modules/create-razor-pages-aspnet-core/?WT.mc_id=learn-blog-shboyer"&gt;Create a web UI with ASP.NET Core&lt;/a&gt; - ASP.NET Core supports creating webpages using a built-in templating engine called Razor. In this module, you'll learn how to create webpages using Razor with ASP.NET Core.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/modules/secure-aspnet-core-identity/?WT.mc_id=learn-blog-shboyer"&gt;Secure an ASP.NET Core web app with the Identity framework&lt;/a&gt; - Add authentication and authorization to an ASP.NET Core web app using the Identity framework.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/learn/modules/persist-data-ef-core/?WT.mc_id=learn-blog-shboyer"&gt;Persist and retrieve relational data with Entity Framework Core&lt;/a&gt; - Query and manage relational data in a .NET Core app with an Object-Relational Mapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docs, Docs, Docs!
&lt;/h2&gt;

&lt;p&gt;There are so many pages of tutorials, reference pages, SDK, and examples in the docs. &lt;a href="https://docs.microsoft.com/"&gt;https://docs.microsoft.com/&lt;/a&gt; is the entry point, however here are the .NET related pages for you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/dotnet/?WT.mc_id=learn-blog-shboyer"&gt;.NET Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/aspnet/?WT.mc_id=learn-blog-shboyer"&gt;ASP.NET Core Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/xamarin/?WT.mc_id=learn-blog-shboyer"&gt;Xamarin Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/dotnet/azure/?view=azure-dotnet&amp;amp;WT.mc_id=learn-blog-shboyer"&gt;.NET on Azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Others
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://channel9.msdn.com/Shows/On-NET?WT.mc_id=learn-blog-shboyer"&gt;On.NET Show&lt;/a&gt; - Channel 9 show hosted by Cecil Phillip &lt;a href="https://twitter.com/cecilphillip"&gt;cecilphillip&lt;/a&gt;, Rich Lander &lt;a href="https://twitter.com/runfaster2000"&gt;@runfaster2000&lt;/a&gt; and other guest hosts. Great content where they look at the APIs, the tooling, and some of the interesting projects being created in the .NET ecosystem. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://channel9.msdn.com/Shows/Azure-Friday?WT.mc_id=learn-blog-shboyer"&gt;Azure Friday&lt;/a&gt; - Join Scott Hanselman, Donovan Brown, or Lara Rubbelke as they host the engineers who build Azure, demo it, answer questions, and share insights.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aka.ms/cloudnativeshow"&gt;Cloud Native Show&lt;/a&gt; - Follow Shayne as he explores Microsoft campus to get the definition (and more) straight from engineers and product teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is in no way an exhaustive list, there are many blogs, and other video resources out on the web. Feel free to comment with your favorites!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xrRLg4hC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/QtisthvhzHU" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xrRLg4hC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://feeds.feedburner.com/%257Er/Tattoocoder/%257E4/QtisthvhzHU" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>learning</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Where does serverless fit in cloud native apps?</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Mon, 09 Dec 2019 16:15:38 +0000</pubDate>
      <link>https://dev.to/azure/where-does-serverless-fit-in-cloud-native-apps-52m6</link>
      <guid>https://dev.to/azure/where-does-serverless-fit-in-cloud-native-apps-52m6</guid>
      <description>&lt;p&gt;A critical characteristic of cloud native architectures it the ability to dynamically scale and support massive numbers of users, events, and requests on these distributed applications and teams. Serverless can help in handling these challenges without having to worry about infrastructure or even an entire application. Jeff jumps into the show production and chats with us on how this fits into the plan for cloud native apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://channel9.msdn.com/Shows/The-Cloud-Native-Show/Where-Does-Serverless-Fit-in-Cloud-Native?WT.mc_id=cloudnativeshow-ch9-shboyer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gwYMZmtx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.shields.io/badge/watcch%2520episode%2520on-CH9-orange" alt="Watch episode on channel9"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/1kIH5qnlJzk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Topics from the show
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://aka.ms/cldntvshw/functions"&gt;Azure Functions&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aka.ms/cldntvshw/logicapps"&gt;Azure Logic Apps&lt;/a&gt; &lt;br&gt;
&lt;a href="https://aka.ms/cldntvshw/appinsight"&gt;Azure Application Insights&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See more episodes at &lt;a href="https://aka.ms/cloudnativeshow"&gt;https://aka.ms/cloudnativeshow&lt;/a&gt; or on our &lt;a href="https://www.youtube.com/playlist?list=PLlrxD0HtieHgyGYmk-h-NGpMEGCfn70Xc"&gt;YouTube Channel&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>podcast</category>
      <category>azure</category>
    </item>
    <item>
      <title>.NET Conf</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Tue, 27 Aug 2019 23:14:34 +0000</pubDate>
      <link>https://dev.to/dotnet/net-conf-58mg</link>
      <guid>https://dev.to/dotnet/net-conf-58mg</guid>
      <description>&lt;p&gt;.NET Conf is a FREE, 3-day virtual developer event co-organized by the .NET community and Microsoft. This year .NET Core 3.0 will launch at .NET Conf 2019! Come celebrate and learn about the new release. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Download the &lt;a href="https://dotnet.microsoft.com/download/dotnet-core/3.0?WT.mc_id=devto-blog-shboyer"&gt;.NET Core 3.0 Preview&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Find out more at &lt;a href="https://www.dotnetconf.net/"&gt;www.dotnetconf.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Listen to Beth and Golnaz discuss the event, some history and more.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/w32mGFYqGsE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  More .NET Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/?WT.mc_id=blog-devto-shboyer"&gt;dot.net&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet?WT.mc_id=blog-devto-shboyer"&gt;What is .NET?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dotnet/core/blob/master/roadmap.md"&gt;.NET Core Roadmap&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>webdev</category>
      <category>csharp</category>
      <category>azure</category>
    </item>
    <item>
      <title>Have you tried ML.NET?</title>
      <dc:creator>Shayne Boyer</dc:creator>
      <pubDate>Sun, 25 Aug 2019 20:37:04 +0000</pubDate>
      <link>https://dev.to/dotnet/have-you-tried-ml-net-bh0</link>
      <guid>https://dev.to/dotnet/have-you-tried-ml-net-bh0</guid>
      <description>&lt;p&gt;&lt;a href="https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet?WT.mc_id=devto-blog-shboyer"&gt;ML.NET&lt;/a&gt; is an open source and cross-platform machine learning framework made for .NET developers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet?WT.mc_id=devto-blog-shboyer"&gt;ML.NET on dot.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/learn/ml-dotnet/get-started-tutorial/intro?WT.mc_id=devto-blog-shboyer"&gt;ML.NET Tutorial - Get started in 10 minutes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using &lt;a href="https://dotnet.microsoft.com/apps/machinelearning-ai/ml-dotnet?WT.mc_id=devto-blog-shboyer"&gt;ML.NET&lt;/a&gt; you can easily build custom machine learning models for scenarios like sentiment analysis, price prediction, sales forecasting, recommendation, image classification, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-0/?WT.mc_id=devto-blog-shboyer"&gt;ML.NET 1.0 was released at //Build 2019&lt;/a&gt;, and since then the team has been working hard on adding more features and capabilities.&lt;/p&gt;

&lt;p&gt;Through the survey below, we would love to get feedback on how we can make your journey to infuse Machine Learning in your apps easier with .NET.&lt;/p&gt;

&lt;p&gt;Help shape and improve ML.NET for your needs by taking the short survey below!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.research.net/r/FPGS3FG"&gt;Take the survey!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally posted by &lt;a href="https://devblogs.microsoft.com/dotnet/author/brachtmamicrosoft-com/"&gt;Bri Achtman&lt;/a&gt; at &lt;a href="https://devblogs.microsoft.com/dotnet/hey-net-have-you-tried-ml-net/?WT.mc_id=devto-blog-shboyer"&gt;Hey .NET! Have you tried ML.NET?&lt;br&gt;
&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>dotnet</category>
      <category>webdev</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
