<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Skaffold – Guides</title>
    <link>https://skaffold.dev/docs/workflows/</link>
    <description>Recent content in Guides on Skaffold</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="https://skaffold.dev/docs/workflows/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Getting Started With Your Project</title>
      <link>https://skaffold.dev/docs/workflows/getting-started-with-your-project/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://skaffold.dev/docs/workflows/getting-started-with-your-project/</guid>
      <description>
        
        
        &lt;p&gt;Skaffold requires a &lt;code&gt;skaffold.yaml&lt;/code&gt;, but - for supported projects - Skaffold can
generate a simple config for you that you can get started with. To configure
Skaffold for your application you can run &lt;a href=&#34;../../docs/init/&#34;&gt;&lt;code&gt;skaffold init&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Running &lt;a href=&#34;../../docs/init/&#34;&gt;&lt;code&gt;skaffold init&lt;/code&gt;&lt;/a&gt; at the root of your project directory will walk you
through a wizard and create a &lt;code&gt;skaffold.yaml&lt;/code&gt; that defines how your project is
built and deployed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;../../images/init-flow.png&#34; alt=&#34;init-flow&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;You can further set up &lt;a href=&#34;../../docs/filesync/&#34;&gt;File Sync&lt;/a&gt; for source files
that do not need a rebuild in &lt;a href=&#34;../../docs/workflows/dev/&#34;&gt;dev mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Skaffold automatically forwards Kubernetes Services in &lt;a href=&#34;../../docs/workflows/dev/&#34;&gt;dev mode&lt;/a&gt; if you run it with &lt;code&gt;--port-forward&lt;/code&gt;. If your project contains resources other than services, you can set-up &lt;a href=&#34;../../docs/port-forwarding/&#34;&gt;port-forwarding&lt;/a&gt;
to port-forward these resources in &lt;a href=&#34;../../docs/workflows/dev/&#34;&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/a&gt; or &lt;a href=&#34;../../docs/workflows/debug/&#34;&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/a&gt; mode.&lt;/p&gt;
&lt;p&gt;For more understanding on how init works, see &lt;a href=&#34;../../docs/init/&#34;&gt;&lt;code&gt;skaffold init&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: skaffold dev</title>
      <link>https://skaffold.dev/docs/workflows/dev/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://skaffold.dev/docs/workflows/dev/</guid>
      <description>
        
        
        &lt;p&gt;&lt;code&gt;skaffold dev&lt;/code&gt; enables continuous local development on an application.
While in &lt;code&gt;dev&lt;/code&gt; mode, Skaffold will watch an application&amp;rsquo;s source files, and when it detects changes,
will rebuild your images (or sync files to your running containers), push any new images, test built images, and redeploy the application to your cluster.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skaffold dev&lt;/code&gt; is considered Skaffold&amp;rsquo;s main mode of operation, as it allows you
to leverage all of the features of Skaffold in a continuous way while iterating
on your application.&lt;/p&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;💡 Tip&lt;/h4&gt;
    Running &lt;code&gt;skaffold dev&lt;/code&gt; is equivalent to running the IDE command &lt;code&gt;Run on Kubernetes&lt;/code&gt; if you&amp;rsquo;re using Skaffold with the &lt;a href=&#34;../../docs/install/#managed-ide&#34;&gt;Cloud Code IDE extensions&lt;/a&gt;. In addition to this guide you should also look at the corresponding guides for &lt;a href=&#34;https://cloud.google.com/code/docs/vscode/running-an-application&#34;&gt;VSCode&lt;/a&gt;, &lt;a href=&#34;https://cloud.google.com/code/docs/intellij/deploying-a-k8-app&#34;&gt;IntelliJ&lt;/a&gt; and &lt;a href=&#34;https://ide.cloud.google.com/?walkthrough_tutorial_url=https%3A%2F%2Fwalkthroughs.googleusercontent.com%2Fcontent%2Fgke_cloud_code_create_app%2Fgke_cloud_code_create_app.md&#34;&gt;Cloud Shell&lt;/a&gt;.
&lt;/div&gt;

&lt;h2 id=&#34;dev-loop&#34;&gt;Dev loop&lt;/h2&gt;
&lt;p&gt;When &lt;code&gt;skaffold dev&lt;/code&gt; is run, Skaffold will first do a full build, test, render and deploy of all artifacts specified in the &lt;code&gt;skaffold.yaml&lt;/code&gt;, similar to &lt;code&gt;skaffold run&lt;/code&gt;. By default, Skaffold will exit if any of these stages fails.  Upon successful build, test, render and deploy, Skaffold will start watching all source file dependencies for all artifacts specified in the project. As changes are made to these source files, Skaffold will rebuild and retest the associated artifacts, and redeploy the new changes to your cluster.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;--keep-running-on-failure&lt;/code&gt; flag can be used to keep Skaffold running by suspending the Skaffold session while encountering errors in the first build, test, render, deploy. The user can attempt to fix the errors and then restore the session by pressing any key or exit the session with &lt;code&gt;Ctrl+C&lt;/code&gt;. The session will be suspended again unless the errors are fixed.  Using this flag should result in an better experience for &lt;code&gt;dev&lt;/code&gt; sessions where errors occur that would otherwise cause Skaffold to exit&lt;/p&gt;
&lt;p&gt;The dev loop will run until the user cancels the Skaffold process with &lt;code&gt;Ctrl+C&lt;/code&gt;. Upon receiving this signal, Skaffold will clean up all deployed artifacts on the active cluster, meaning that Skaffold won&amp;rsquo;t abandon any Kubernetes resources that it created throughout the lifecycle of the run. This can be optionally disabled by using the &lt;code&gt;--no-prune&lt;/code&gt; flag.&lt;/p&gt;
&lt;h2 id=&#34;precedence-of-actions&#34;&gt;Precedence of Actions&lt;/h2&gt;
&lt;p&gt;The actions performed by Skaffold during the dev loop have precedence over one another, so that behavior is always predictable. The order of actions is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/filesync/&#34;&gt;File Sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/builders/&#34;&gt;Build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/testers/&#34;&gt;Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/deployers/&#34;&gt;Deploy&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;file-watcher-and-watch-modes&#34;&gt;File Watcher and Watch Modes&lt;/h2&gt;
&lt;p&gt;Skaffold computes the dependencies for each artifact based on the builder being used, and the root directory of the artifact. Once all source file dependencies are computed, in &lt;code&gt;dev&lt;/code&gt; mode, Skaffold will continuously watch these files for changes in the background, and conditionally re-run the loop when changes are detected.&lt;/p&gt;
&lt;p&gt;By default, Skaffold uses filesystem notifications of your OS to monitor changes
on the local filesystem and re-runs the loop on every change.&lt;/p&gt;
&lt;p&gt;Skaffold also supports a &lt;code&gt;polling&lt;/code&gt; mode where the filesystem is checked for
changes on a configurable interval, or a &lt;code&gt;manual&lt;/code&gt; mode, where Skaffold waits for
user input to check for file changes. These watch modes can be configured
through the &lt;code&gt;--trigger&lt;/code&gt; flag.&lt;/p&gt;
&lt;h2 id=&#34;controlling-the-dev-loop-with-api&#34;&gt;Controlling the Dev Loop with API&lt;/h2&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    This section is intended for developers who build tooling on top of Skaffold.
&lt;/div&gt;

&lt;p&gt;By default, the dev loop will carry out all actions (as needed) each time a file is changed locally, with the exception of operating in &lt;code&gt;manual&lt;/code&gt; trigger mode. However, individual actions can be gated off by user input through the Skaffold API.&lt;/p&gt;
&lt;p&gt;With this API, users can selectively turn off the automatic dev loop and can tell Skaffold to wait for user input before performing any of these actions, even if the requisite files were changed on the filesystem. By doing so, users can &amp;ldquo;queue up&amp;rdquo; changes while they are iterating locally, and then have Skaffold rebuild and redeploy only when asked. This can be very useful when builds are happening more frequently than desired, when builds or deploys take a long time or are otherwise very costly, or when users want to integrate other tools with &lt;code&gt;skaffold dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more documentation, see the &lt;a href=&#34;../../docs/design/api/&#34;&gt;Skaffold API Docs&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Debugging With Skaffold</title>
      <link>https://skaffold.dev/docs/workflows/debug/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://skaffold.dev/docs/workflows/debug/</guid>
      <description>
        
        
        &lt;p&gt;Skaffold lets you set breakpoints and step through your application, even when deployed to remote Kubernetes clusters, as if the code were running locally on your machine. Skaffold detects the language runtimes of your container images, reconfigures the pods for debugging, forwards debugging ports, and then monitors for when debuggable containers come online.  IDE integrations like Cloud Code leverage Skaffold&amp;rsquo;s events to automatically set up debugging sessions.&lt;/p&gt;
&lt;p&gt;Debugging is currently supported for five language runtimes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go 1.13+ (runtime ID: &lt;code&gt;go&lt;/code&gt;) using &lt;a href=&#34;https://github.com/go-delve/delve&#34;&gt;Delve&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NodeJS (runtime ID: &lt;code&gt;nodejs&lt;/code&gt;) using the NodeJS Inspector (Chrome DevTools)&lt;/li&gt;
&lt;li&gt;Java and JVM languages (runtime ID: &lt;code&gt;jvm&lt;/code&gt;) using JDWP&lt;/li&gt;
&lt;li&gt;Python 3.5-3.10 runtimes (runtime ID: &lt;code&gt;python&lt;/code&gt;) using &lt;code&gt;debugpy&lt;/code&gt; (Debug Adapter Protocol) or &lt;code&gt;pydevd&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;NOTE: Python 3.11 support is planned and coming soon but is currently still in progress&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;.NET Core (runtime ID: &lt;code&gt;netcore&lt;/code&gt;) using &lt;code&gt;vsdbg&lt;/code&gt; (only for VS Code)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skaffold can usually detect the correct language runtime if present. However if you encounter difficulties then checkout the &lt;a href=&#34;#supported-language-runtimes&#34;&gt;Supported Language Runtimes&lt;/a&gt; section for the exact heuristics that Skaffold uses and you can modify your application accordingly, or read about &lt;a href=&#34;#can-images-be-debugged-without-the-runtime-support-images&#34;&gt;how you can manually configure your container image&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;recommended-debugging-using-cloud-code&#34;&gt;(Recommended) Debugging using Cloud Code&lt;/h2&gt;
&lt;p&gt;The easiest way to debug using Skaffold is by using the &lt;a href=&#34;../../docs/install/#managed-ide&#34;&gt;Cloud Code IDE extension&lt;/a&gt; for Visual Studio Code, JetBrains IDEs, and Cloud Shell. Cloud Code will automatically configure container images for debugging so you can debug Kubernetes services just like how you would debug a local service in your IDE.&lt;/p&gt;
&lt;p&gt;For more information, see the corresponding documentation for &lt;a href=&#34;https://cloud.google.com/code/docs/vscode/debug&#34;&gt;VS Code&lt;/a&gt;, &lt;a href=&#34;https://cloud.google.com/code/docs/intellij/kubernetes-debugging&#34;&gt;IntelliJ&lt;/a&gt; and &lt;a href=&#34;https://cloud.google.com/code/docs/shell/debug&#34;&gt;Cloud Shell&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;detailed-debugger-configuration-and-setup&#34;&gt;Detailed debugger configuration and setup&lt;/h2&gt;
&lt;p&gt;This section describes how Skaffold configures the container image for debugging for the supported language runtimes, and how to setup with certain IDEs.&lt;/p&gt;
&lt;p&gt;Note that many debuggers may require additional information for the location of source files.
We are looking for ways to identify this information and to pass it back if found.&lt;/p&gt;
&lt;div class=&#39;code-tabs&#39;&gt;
    &lt;ul class=&#34;nav nav-tabs&#34;&gt;&lt;/ul&gt;
    &lt;div class=&#34;tab-content&#34;&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;GO&#34;&gt;
    &lt;h4 id=&#34;go-runtime-go-protocols-dlv&#34;&gt;Go (runtime: &lt;code&gt;go&lt;/code&gt;, protocols: &lt;code&gt;dlv&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Go-based applications are configured to run under
&lt;a href=&#34;https://github.com/go-delve/delve&#34;&gt;Delve&lt;/a&gt; in its headless-server mode.&lt;/p&gt;
&lt;p&gt;On recognizing a Go-based container image, &lt;code&gt;debug&lt;/code&gt; rewrites the container image&amp;rsquo;s
entrypoint to invoke your application using &lt;code&gt;dlv&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dlv exec --headless --continue --accept-multiclient --listen=:56268 --api-version=2 &amp;lt;app&amp;gt; -- &amp;lt;args&amp;gt; ...
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;skaffold-debug-using-the-jetbrains-goland-and-intellij-ultimate&#34;&gt;Skaffold debug using the JetBrains GoLand and IntelliJ Ultimate&lt;/h5&gt;
&lt;p&gt;Debugging is only supported in JetBrains IDEs for Go applications built using Go Modules.
The IDE settings must also be explicitly configured to use Go Modules.  Errors like
&lt;code&gt;cannot find debugger path&lt;/code&gt; indicate misconfiguration.&lt;/p&gt;
&lt;h5 id=&#34;skaffold-debug-using-the-vs-code-go-extension&#34;&gt;Skaffold debug using the VS Code Go extension&lt;/h5&gt;
&lt;p&gt;If you use the debug functionality of the
&lt;a href=&#34;https://github.com/golang/vscode-go&#34;&gt;VS Code Go extension&lt;/a&gt; to connect to
&lt;code&gt;dlv&lt;/code&gt;, you may need to configure &lt;em&gt;local&lt;/em&gt; and &lt;em&gt;remote&lt;/em&gt; source paths, via
either the &lt;code&gt;cwd&lt;/code&gt; and &lt;code&gt;remotePath&lt;/code&gt; properties, or the &lt;code&gt;substitutePath&lt;/code&gt; array
property
(&lt;a href=&#34;https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md#launch-configurations&#34;&gt;reference&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;cwd&lt;/code&gt; or &lt;code&gt;from&lt;/code&gt; properties should be the absolute path of the top-level
directory of your source files and should generally match the artifact&amp;rsquo;s
&lt;code&gt;context&lt;/code&gt; directory in &lt;code&gt;skaffold.yaml&lt;/code&gt;. You can represent this using the
&lt;code&gt;${workspaceFolder}&lt;/code&gt; variable.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;remotePath&lt;/code&gt; or &lt;code&gt;to&lt;/code&gt; properties should be set to the absolute path of the
source location &lt;em&gt;during compilation&lt;/em&gt;. For example, the &lt;code&gt;golang&lt;/code&gt; images, which
are
&lt;a href=&#34;https://github.com/GoogleContainerTools/skaffold/tree/main/examples/getting-started/Dockerfile&#34;&gt;often used in multi-stage builds&lt;/a&gt;,
have a default working directory of &lt;code&gt;/go&lt;/code&gt;. The following
&lt;a href=&#34;https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md#remote-debugging&#34;&gt;configuration&lt;/a&gt;
works in this case:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Skaffold Debug&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;go&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;attach&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;remote&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;56268&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;cwd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${workspaceFolder}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;remotePath&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/go&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can use the &lt;code&gt;substitutePath&lt;/code&gt; property instead of &lt;code&gt;cwd&lt;/code&gt; and &lt;code&gt;remotePath&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Skaffold Debug&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;go&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;attach&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;remote&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;56268&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;substitutePath&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${workspaceFolder}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/go&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you use the &lt;code&gt;ko&lt;/code&gt; local builder, the source path during compilation matches
the source path in your IDE. In this case, the value for &lt;code&gt;remotePath&lt;/code&gt; will
match &lt;code&gt;cwd&lt;/code&gt;. If the values of both &lt;code&gt;cwd&lt;/code&gt; and &lt;code&gt;remotePath&lt;/code&gt; are
&lt;code&gt;${workspaceFolder}&lt;/code&gt;, you can omit these properties.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;NODEJS&#34;&gt;
    &lt;h4 id=&#34;nodejs-runtime-nodejs-protocols-devtools&#34;&gt;NodeJS (runtime: &lt;code&gt;nodejs&lt;/code&gt;, protocols: &lt;code&gt;devtools&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;NodeJS applications are configured to use the Chrome DevTools inspector via the &lt;code&gt;--inspect&lt;/code&gt; argument.&lt;/p&gt;
&lt;p&gt;On recognizing a NodeJS-based container image, &lt;code&gt;debug&lt;/code&gt; rewrites the container image&amp;rsquo;s
entrypoint to invoke your application with &lt;code&gt;--inspect&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;node --inspect=9229 &amp;lt;app.js&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    Many applications use NodeJS-based tools as part of their launch, like &lt;tt&gt;npm&lt;/tt&gt;, rather than
invoke &lt;tt&gt;node&lt;/tt&gt; directly.  These intermediate &lt;tt&gt;node&lt;/tt&gt; instances may interpret the
&lt;tt&gt;&amp;ndash;inspect&lt;/tt&gt; arguments.  Skaffold introduces a &lt;tt&gt;node&lt;/tt&gt; wrapper that
only invokes the real &lt;tt&gt;node&lt;/tt&gt; with &lt;tt&gt;&amp;ndash;inspect&lt;/tt&gt; if running an application script,
and skips scripts located in &lt;tt&gt;node_modules&lt;/tt&gt;.  For more details see the
&lt;a href=&#34;https://github.com/GoogleContainerTools/container-debug-support/pull/34&#34;&gt;associated PR&lt;/a&gt;.
&lt;/div&gt;
&lt;p&gt;A debugging client must first obtain &lt;a href=&#34;https://github.com/nodejs/node/issues/9185#issuecomment-254872466&#34;&gt;the inspector UUID&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;JAVA&#34;&gt;
    &lt;h4 id=&#34;java-and-other-jvm-languages-runtime-jvm-protocols-jdwp&#34;&gt;Java and Other JVM Languages (runtime: &lt;code&gt;jvm&lt;/code&gt;, protocols: &lt;code&gt;jdwp&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Java/JVM applications are configured to expose the JDWP agent using the &lt;code&gt;JAVA_TOOL_OPTIONS&lt;/code&gt;
environment variable.
Note that the use of &lt;code&gt;JAVA_TOOL_OPTIONS&lt;/code&gt; causes extra debugging output from the JVM on launch.&lt;/p&gt;
&lt;p&gt;On recognizing a JVM-based container image, &lt;code&gt;debug&lt;/code&gt; rewrites the container image&amp;rsquo;s
environment to set:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n,quiet=y
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;PYTHON&#34;&gt;
    &lt;h4 id=&#34;python-runtime-python-protocols-dap-or-pydevd&#34;&gt;Python (runtime: &lt;code&gt;python&lt;/code&gt;, protocols: &lt;code&gt;dap&lt;/code&gt; or &lt;code&gt;pydevd&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Python applications are configured to use either  &lt;a href=&#34;https://github.com/microsoft/debugpy/&#34;&gt;&lt;code&gt;debugpy&lt;/code&gt;&lt;/a&gt; or
&lt;a href=&#34;https://github.com/fabioz/PyDev.Debugger&#34;&gt;&lt;code&gt;pydevd&lt;/code&gt;&lt;/a&gt;.  &lt;code&gt;debugpy&lt;/code&gt; uses the
&lt;a href=&#34;https://microsoft.github.io/debug-adapter-protocol/&#34;&gt;&lt;em&gt;debug adapter protocol&lt;/em&gt; (DAP)&lt;/a&gt; which
is supported by Visual Studio Code, &lt;a href=&#34;https://projects.eclipse.org/projects/technology.lsp4e&#34;&gt;Eclipse LSP4e&lt;/a&gt;,
&lt;a href=&#34;https://microsoft.github.io/debug-adapter-protocol/implementors/tools/&#34;&gt;and other editors and IDEs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On recognizing a Python-based container image, &lt;code&gt;debug&lt;/code&gt; rewrites the container image&amp;rsquo;s
entrypoint to invoke Python using either the &lt;code&gt;pydevd&lt;/code&gt; or &lt;code&gt;debugpy&lt;/code&gt; modules:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python -m debugpy --listen 5678 &amp;lt;app&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python -m pydevd --server --port 5678 &amp;lt;app.py&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    As many Python web frameworks use launcher scripts, like &lt;code&gt;gunicorn&lt;/code&gt;, Skaffold now uses
a debug launcher that examines the app command-line.
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;.NETCORE&#34;&gt;
    &lt;h4 id=&#34;net-core-runtime-dotnet-protocols-vsdbg&#34;&gt;.NET Core (runtime: &lt;code&gt;dotnet&lt;/code&gt;, protocols: &lt;code&gt;vsdbg&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;.NET Core applications are configured to be deployed along with &lt;code&gt;vsdbg&lt;/code&gt;
for VS Code.&lt;/p&gt;
&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;JetBrains Rider&lt;/h4&gt;
    This set up does not yet work automatically with &lt;a href=&#34;https://github.com/GoogleCloudPlatform/cloud-code-intellij/issues/2903&#34;&gt;Cloud Code for IntelliJ in JetBrains Rider&lt;/a&gt;.
There is &lt;a href=&#34;https://github.com/GoogleCloudPlatform/cloud-code-intellij/wiki/Manual-set-up-for-remote-debugging-in-Rider&#34;&gt;a manual workaround&lt;/a&gt;.
&lt;/div&gt;
&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Omnisharp for VS Code&lt;/h4&gt;
    &lt;p&gt;For users of &lt;a href=&#34;https://github.com/OmniSharp/omnisharp-vscode&#34;&gt;VS Code&amp;rsquo;s debug adapter for C#&lt;/a&gt;:**
the following configuration can be used to debug a container. It assumes that your code is deployed
in &lt;code&gt;/app&lt;/code&gt; or &lt;code&gt;/src&lt;/code&gt; folder in the container. If that is not the case, the &lt;code&gt;sourceFileMap&lt;/code&gt; property
should be changed to match the correct folder. &lt;code&gt;processId&lt;/code&gt; is usually 1 but might be different if you
have an unusual entrypoint. You can also use &lt;code&gt;&amp;quot;${command:pickRemoteProcess}&amp;quot;&lt;/code&gt; instead if supported by
your base image.  (&lt;code&gt;//&lt;/code&gt; comments must be stripped.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Skaffold Debug&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;coreclr&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;attach&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;processId&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;justMyCode&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// set to `true` in debug configuration and `false` in release configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pipeTransport&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pipeProgram&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubectl&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pipeArgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;exec&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;-i&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;lt;NAME OF YOUR POD&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// name of the pod you debug.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pipeCwd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${workspaceFolder}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;debuggerPath&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/dbg/netcore/vsdbg&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// location where vsdbg binary installed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;quoteArgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;sourceFileMap&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Change this mapping if your app in not deployed in /src or /app in your docker image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;/src&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${workspaceFolder}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;/app&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${workspaceFolder}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// May also be like this, depending of your repository layout
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// &amp;#34;/src&amp;#34;: &amp;#34;${workspaceFolder}/src&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// &amp;#34;/app&amp;#34;: &amp;#34;${workspaceFolder}/src/&amp;lt;YOUR PROJECT TO DEBUG&amp;gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;supported-language-runtimes&#34;&gt;Supported Language Runtimes&lt;/h2&gt;
&lt;p&gt;The language runtime for the artifacts can be specified in the &lt;code&gt;skaffold.yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;build&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;artifacts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/k8s-skaffold/example&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;runtimeType&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;go&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# specify one of `go`, `nodejs`, `jvm`, `python`, or `netcore`&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;local&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Otherwise Skaffold &lt;code&gt;debug&lt;/code&gt; recognizes the language runtime used in a
container image for specific language runtimes using standard heuristics described below.&lt;/p&gt;
&lt;div class=&#39;code-tabs&#39;&gt;
    &lt;ul class=&#34;nav nav-tabs&#34;&gt;&lt;/ul&gt;
    &lt;div class=&#34;tab-content&#34;&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;GO&#34;&gt;
    &lt;h4 id=&#34;go-runtime-go&#34;&gt;Go (runtime: &lt;code&gt;go&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Go-based container images are recognized by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the presence of one of the
&lt;a href=&#34;https://godoc.org/runtime&#34;&gt;standard Go runtime environment variables&lt;/a&gt;:
&lt;code&gt;GODEBUG&lt;/code&gt;, &lt;code&gt;GOGC&lt;/code&gt;, &lt;code&gt;GOMAXPROCS&lt;/code&gt;, or &lt;code&gt;GOTRACEBACK&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;the presence of the
&lt;a href=&#34;https://github.com/google/ko#static-assets&#34;&gt;&lt;code&gt;KO_DATA_PATH&lt;/code&gt; environment variable&lt;/a&gt;
in container images built by
&lt;a href=&#34;../../docs/builders/builder-types/ko/&#34;&gt;&lt;code&gt;ko&lt;/code&gt;&lt;/a&gt;, or&lt;/li&gt;
&lt;li&gt;is launching using &lt;code&gt;dlv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unless you built your container image using &lt;code&gt;ko&lt;/code&gt;, set one of the standard Go
environment variables to allow Skaffold to detect your container as Go.
&lt;code&gt;GOTRACEBACK=single&lt;/code&gt; is the default setting for Go, so you can add this
environment variable without changing behavior. Alternatively, &lt;code&gt;GOTRACEBACK=all&lt;/code&gt;
is a useful setting in many situtions.&lt;/p&gt;
&lt;p&gt;Your application should be built with the &lt;code&gt;-gcflags=&#39;all=-N -l&#39;&lt;/code&gt; flag to
disable optimizations and inlining. If you do not add this flag, debugging can
becoming confusing due to seemingly-random execution jumps that happen due to
statement reordering and inlining. Skaffold configures Docker builds with a
&lt;code&gt;SKAFFOLD_GO_GCFLAGS&lt;/code&gt; build argument that you should use in your &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;FROM golang
ENV GOTRACEBACK=all
COPY . .
ARG SKAFFOLD_GO_GCFLAGS
RUN go build -gcflags=&amp;#34;${SKAFFOLD_GO_GCFLAGS}&amp;#34; -o /app .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that the Alpine Linux-based &lt;code&gt;golang&lt;/code&gt; container images do not include a
C compiler which is required to build with &lt;code&gt;-gcflags=&#39;all=-N -l&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The ko builder adds &lt;code&gt;-gcflags=&#39;all=-N -l&#39;&lt;/code&gt; automatically when you use
&lt;code&gt;skaffold debug&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We recommend that you do &lt;em&gt;not&lt;/em&gt; add the &lt;code&gt;-trimpath&lt;/code&gt; flag when debugging, as this
flag removes information from the resulting binary that aids debugging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;JAVA&#34;&gt;
    &lt;h4 id=&#34;java-and-other-jvm-languages-runtime-jvm&#34;&gt;Java and Other JVM Languages (runtime: &lt;code&gt;jvm&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;JVM application are recognized by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the presence of a &lt;code&gt;JAVA_VERSION&lt;/code&gt; or &lt;code&gt;JAVA_TOOL_OPTIONS&lt;/code&gt; environment variable, or&lt;/li&gt;
&lt;li&gt;the container command-line invokes &lt;code&gt;java&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;NODEJS&#34;&gt;
    &lt;h4 id=&#34;nodejs-runtime-nodejs&#34;&gt;NodeJS (runtime: &lt;code&gt;nodejs&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;NodeJS images are recognized by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the presence of a &lt;code&gt;NODE_VERSION&lt;/code&gt;, &lt;code&gt;NODEJS_VERSION&lt;/code&gt;, or &lt;code&gt;NODE_ENV&lt;/code&gt; environment variable, or&lt;/li&gt;
&lt;li&gt;the container command-line invokes &lt;code&gt;node&lt;/code&gt; or &lt;code&gt;npm&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;PYTHON&#34;&gt;
    &lt;h4 id=&#34;python-runtime-python&#34;&gt;Python (runtime: &lt;code&gt;python&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Python application are recognized by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the presence of a standard Python environment variable:
&lt;code&gt;PYTHON_VERSION&lt;/code&gt;, &lt;code&gt;PYTHONVERBOSE&lt;/code&gt;, &lt;code&gt;PYTHONINSPECT&lt;/code&gt;, &lt;code&gt;PYTHONOPTIMIZE&lt;/code&gt;,
&lt;code&gt;PYTHONUSERSITE&lt;/code&gt;, &lt;code&gt;PYTHONUNBUFFERED&lt;/code&gt;, &lt;code&gt;PYTHONPATH&lt;/code&gt;, &lt;code&gt;PYTHONUSERBASE&lt;/code&gt;,
&lt;code&gt;PYTHONWARNINGS&lt;/code&gt;, &lt;code&gt;PYTHONHOME&lt;/code&gt;, &lt;code&gt;PYTHONCASEOK&lt;/code&gt;, &lt;code&gt;PYTHONIOENCODING&lt;/code&gt;,
&lt;code&gt;PYTHONHASHSEED&lt;/code&gt;, &lt;code&gt;PYTHONDONTWRITEBYTECODE&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;the container command-line invokes &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;python2&lt;/code&gt;, or &lt;code&gt;python3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&#34;tab-pane&#34; title=&#34;.NETCORE&#34;&gt;
    &lt;h4 id=&#34;net-core-runtime-dotnet&#34;&gt;.NET Core (runtime: &lt;code&gt;dotnet&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;.NET Core application are recognized by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the presence of a standard .NET environment variable:
&lt;code&gt;ASPNETCORE_URLS&lt;/code&gt;, &lt;code&gt;DOTNET_RUNNING_IN_CONTAINER&lt;/code&gt;,
&lt;code&gt;DOTNET_SYSTEM_GLOBALIZATION_INVARIANT&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;the container command-line invokes the &lt;a href=&#34;https://github.com/dotnet/sdk&#34;&gt;dotnet&lt;/a&gt; cli&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Furthermore, your app must be built with the &lt;code&gt;--configuration Debug&lt;/code&gt; options to disable optimizations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How It works&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; acts like &lt;code&gt;skaffold dev&lt;/code&gt;, but it configures containers in pods
for debugging as required for each container&amp;rsquo;s runtime technology.
The associated debugging ports are exposed and labelled so that they can be port-forwarded to the
local machine.
One notable difference from &lt;code&gt;skaffold dev&lt;/code&gt; is that &lt;code&gt;debug&lt;/code&gt; disables image rebuilding and
syncing as it leads to users accidentally terminating debugging sessions by saving file changes.
These behaviours can be re-enabled with the &lt;code&gt;--auto-build&lt;/code&gt;, &lt;code&gt;--auto-deploy&lt;/code&gt;, and &lt;code&gt;--auto-sync&lt;/code&gt;
flags, or triggering a &lt;a href=&#34;../../docs/design/api/#control-api&#34;&gt;devloop iteration&lt;/a&gt; using the Skaffold API.&lt;/p&gt;
&lt;p&gt;Enabling debugging has two phases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuring:&lt;/strong&gt; Skaffold automatically examines each built container image and
attempts to recognize the underlying language runtime.  Container images can be
explicitly configured too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring:&lt;/strong&gt; Skaffold watches the cluster to detect when debuggable containers
start execution.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;configuring-container-images-for-debugging&#34;&gt;Configuring container images for debugging&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; examines the &lt;em&gt;built artifacts&lt;/em&gt; to determine the underlying language runtime technology.
Kubernetes manifests that reference these artifacts are transformed on-the-fly to enable the
language runtime&amp;rsquo;s debugging functionality.  These transforms add or alter environment variables
and entrypoints, and more.&lt;/p&gt;
&lt;p&gt;Some language runtimes require additional support files to enable debugging.
For these languages, a special set of &lt;a href=&#34;https://github.com/GoogleContainerTools/container-debug-support&#34;&gt;runtime-specific images&lt;/a&gt;
are configured as &lt;em&gt;init-containers&lt;/em&gt; to populate a shared-volume that is mounted into
each of the appropriate containers.  These images are hosted at
&lt;code&gt;gcr.io/k8s-skaffold/skaffold-debug-support&lt;/code&gt;; alternative locations can be
specified in &lt;a href=&#34;../../docs/design/global-config/&#34;&gt;Skaffold&amp;rsquo;s global configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For images that are successfully recognized, Skaffold adds a &lt;code&gt;debug.cloud.google.com/config&lt;/code&gt;
annotation to the corresponding Kubernetes pod-spec that encode the debugging parameters.&lt;/p&gt;
&lt;h3 id=&#34;monitoring-for-debuggable-containers&#34;&gt;Monitoring for debuggable containers&lt;/h3&gt;
&lt;p&gt;Once the application is deployed, &lt;code&gt;debug&lt;/code&gt; monitors the cluster looking for debuggable pods with a
&lt;code&gt;debug.cloud.google.com/config&lt;/code&gt; annotation.  For each new debuggable pod,  Skaffold emits
an event that can be used by tools like IDEs to establish a debug session.&lt;/p&gt;
&lt;h3 id=&#34;additional-changes&#34;&gt;Additional changes&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;debug&lt;/code&gt; makes some other adjustments to simplify the debug experience:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Replica Counts&lt;/em&gt;: &lt;code&gt;debug&lt;/code&gt; rewrites  the replica counts to 1 for
deployments, replica sets, and stateful sets.  This results in
requests being serialized so that one request is processed at a time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Kubernetes Probes&lt;/em&gt;:  &lt;code&gt;debug&lt;/code&gt; changes the timeouts on HTTP-based
&lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/&#34;&gt;liveness, readiness, and startup probes&lt;/a&gt;
to 600 seconds (10 minutes) from the default of 1 second.
This change allows probes to be debugged, and avoids negative
consequences from blocked probes when the app is already suspended
during a debugging session.
Failed liveness probes in particular result in the container
being terminated and restarted.&lt;/p&gt;
&lt;p&gt;The probe timeout value can be set on a per-podspec basis by setting
a &lt;code&gt;debug.cloud.google.com/probe-timeouts&lt;/code&gt; annotation on the podspec&amp;rsquo;s metadata
with a valid duration (see &lt;a href=&#34;https://pkg.go.dev/time#ParseDuration&#34;&gt;Go&amp;rsquo;s time.ParseDuration()&lt;/a&gt;).
This probe timeout-rewriting can be skipped entirely by using &lt;code&gt;skip&lt;/code&gt;.  For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;annotations&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;debug.cloud.google.com/probe-timeouts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;skip&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;
&lt;h3 id=&#34;my-container-is-not-being-made-debuggable&#34;&gt;My container is not being made debuggable?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Was this image built by Skaffold?&lt;/strong&gt;
&lt;code&gt;debug&lt;/code&gt; only works for images that were built by
Skaffold so as to avoid affecting system- or infrastructure-level containers such as proxy sidecars.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Was Skaffold able to recognize the image?&lt;/strong&gt;
&lt;code&gt;debug&lt;/code&gt; emits a warning when it is unable to configure an image for debugging:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;WARN[0005] Image &amp;#34;image-name&amp;#34; not configured for debugging: unable to determine runtime for &amp;#34;image-name&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;See the language runtime section details on how container images are recognized.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is your container command-line using shell constructs?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Automatic debugging of Go and Python applications requires that Skaffold
adjust the command-line to use a specific launcher (&lt;code&gt;dlv&lt;/code&gt; for Go, or our
custom Python launcher to configure the appropriate debugging module).
These launchers require that the container command-line invokes the
binary or launch script (i.e., a &lt;code&gt;pip&lt;/code&gt;-generated launcher script such as &lt;code&gt;gunicorn&lt;/code&gt;).
Skaffold cannot debug Go and Python applications that use user-created
shell scripts, or that use shell constructs like &lt;code&gt;exec&lt;/code&gt; or &lt;code&gt;eval&lt;/code&gt;.
Either rewrite your container image command-line or
&lt;a href=&#34;#can-images-be-debugged-without-the-runtime-support-images&#34;&gt;manually configure your container for debugging&lt;/a&gt;.
For example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;❌ CMD launch.sh
❌ CMD exec gunicorn app:app
✅ CMD gunicorn app:app
✅ CMD [gunicorn, app:app]
✅ CMD [python, -m, gunicorn, app:app]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;why-arent-my-breakpoints-being-hit&#34;&gt;Why aren&amp;rsquo;t my breakpoints being hit?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Missing required language extension.&lt;/strong&gt;
Go, Python, and JavaScript debugging in IDEA Ultimate requires the
corresponding language plugin to be installed. If it is not installed,
the debugger will not attach and breakpoints will not be hit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breakpoints are not hit during program startup.&lt;/strong&gt;
Skaffold configures the containers to run-on-start (sometimes called
&lt;em&gt;continue&lt;/em&gt; mode), such that the containers do not wait for the
debugger to connect.  The container will have likely finished its
startup by the time the debugger is able to connect and configure
the breakpoints, and so breakpoints in the normal startup path are
unlikely to be hit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File mapping misconfiguration between local and container filesystems.&lt;/strong&gt;
Some language runtimes require configuring the IDE with a &lt;em&gt;source map&lt;/em&gt;
to map files in the container to their corresponding local files.
If this mapping is incorrect, then the remote debugging runtime
will not be able to find the source file for the breakpoint. The Cloud Code plugins generally prompt the user when required.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some builds use multi-stage dockerfiles to compile the binary using
a build-time image and then copy the binary into a smaller image
intended for deployment.  In these cases, the source mapping must
use the build-time paths.  For example, many Go builds use a &lt;code&gt;golang&lt;/code&gt;
image for building, where the source files are typically copied into &lt;code&gt;/go&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;JetBrains GoLand and IDEA Ultimate only support remote breakpoints
for Go applications built using Go Modules.  The IDE settings must
also be explicitly configured to use Go Modules.&lt;/li&gt;
&lt;li&gt;JVM languages do not require the mapping as the JVM uses class
names rather than file paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;can-images-be-debugged-without-the-runtime-support-images&#34;&gt;Can images be debugged without the runtime support images?&lt;/h3&gt;
&lt;p&gt;The special &lt;a href=&#34;https://github.com/GoogleContainerTools/container-debug-support&#34;&gt;runtime-support images&lt;/a&gt;
are provided as a convenience for automatic configuration.  You can
manually configure your images for debugging by one of the following
means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;skaffold debug&lt;/code&gt; usually recognizes already-configured container images
that use the appropriate debugger.  For example, you could use a
multi-stage Dockerfile with a &lt;code&gt;debug&lt;/code&gt; stage that invokes the
application using the debugger.&lt;/li&gt;
&lt;li&gt;Use a &lt;code&gt;debug.cloud.google.com/config&lt;/code&gt; workload annotation on the
pod-spec to describe the debug configuration of each container
image in the pod, as described in &lt;a href=&#34;#workload-annotations&#34;&gt;&lt;em&gt;Workload Annotations&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;limitations&#34;&gt;Limitations&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; has some limitations.&lt;/p&gt;
&lt;h3 id=&#34;unsupported-container-entrypoints&#34;&gt;Unsupported Container Entrypoints&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; requires being able to examine and alter the
command-line used in the container entrypoint.  This transformation
will not work with images that use intermediate launch scripts or
binaries.&lt;/p&gt;
&lt;h3 id=&#34;supported-deployers&#34;&gt;Supported Deployers&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; is only supported with the &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;kustomize&lt;/code&gt;, and &lt;code&gt;helm&lt;/code&gt; deployers.&lt;/p&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    Helm support requires using Helm v3.1.0 or greater.
&lt;/div&gt;

&lt;h3 id=&#34;deprecated-workload-api-objects&#34;&gt;Deprecated Workload API Objects&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skaffold debug&lt;/code&gt; does not support deprecated versions of Workload API objects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extensions/v1beta1&lt;/code&gt; and &lt;code&gt;apps/v1beta1&lt;/code&gt; was &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/HEAD/CHANGELOG/CHANGELOG-1.8.md#other-notable-changes-16&#34;&gt;deprecated in Kubernetes 1.8&lt;/a&gt;
and &lt;a href=&#34;https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/&#34;&gt;removed in Kubernetes 1.16&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apps/v1beta2&lt;/code&gt; was &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/HEAD/CHANGELOG/CHANGELOG-1.9.md#apps&#34;&gt;deprecated in Kubernetes 1.9&lt;/a&gt;
and &lt;a href=&#34;https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/&#34;&gt;removed in Kubernetes 1.16&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Applications should transition to the &lt;code&gt;apps/v1&lt;/code&gt; APIs,
&lt;a href=&#34;https://kubernetes.io/blog/2017/12/kubernetes-19-workloads-expanded-ecosystem/#workloads-api-ga&#34;&gt;introduced in Kubernetes 1.9&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;metadata-events&#34;&gt;Appendix: IDE Support via Events and Metadata&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;debug&lt;/code&gt; provides additional support for IDEs to detect the debuggable containers and to determine
appropriate configuration parameters.&lt;/p&gt;
&lt;h3 id=&#34;workload-annotations&#34;&gt;Workload Annotations&lt;/h3&gt;
&lt;p&gt;Each transformed workload object carries a &lt;code&gt;debug.cloud.google.com/config&lt;/code&gt; annotation with
a JSON object describing the debug configurations for the pod&amp;rsquo;s containers (linebreaks for readability):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;	debug.cloud.google.com/config={
		&amp;#34;&amp;lt;containerName&amp;gt;&amp;#34;:{&amp;#34;runtime&amp;#34;:&amp;#34;&amp;lt;runtimeId&amp;gt;&amp;#34;,...},
		&amp;#34;&amp;lt;containerName&amp;gt;&amp;#34;:{&amp;#34;runtime&amp;#34;:&amp;#34;&amp;lt;runtimeId&amp;gt;&amp;#34;,...},
		}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For example the following annotation indicates that the container named &lt;code&gt;web&lt;/code&gt; is a Go application
that is being debugged by a headless Delve session on port &lt;code&gt;56268&lt;/code&gt; (linebreaks for readability):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;debug.cloud.google.com/config={
  &amp;#34;web&amp;#34;:{
    &amp;#34;artifact&amp;#34;:&amp;#34;gcr.io/random/image&amp;#34;,
    &amp;#34;runtime&amp;#34;:&amp;#34;go&amp;#34;,
    &amp;#34;ports&amp;#34;:{&amp;#34;dlv&amp;#34;:56268},
    &amp;#34;workingDir&amp;#34;:&amp;#34;/some/path&amp;#34;}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;artifact&lt;/code&gt; is the corresponding artifact&amp;rsquo;s image name in the &lt;code&gt;skaffold.yaml&lt;/code&gt;.
&lt;code&gt;runtime&lt;/code&gt; is the language runtime detected (one of: &lt;code&gt;go&lt;/code&gt;, &lt;code&gt;jvm&lt;/code&gt;, &lt;code&gt;nodejs&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt;).
&lt;code&gt;ports&lt;/code&gt; is a list of debug ports keyed by the language runtime debugging protocol.
&lt;code&gt;workingDir&lt;/code&gt; is the working directory (if not an empty string).&lt;/p&gt;
&lt;h3 id=&#34;api-events&#34;&gt;API: Events&lt;/h3&gt;
&lt;p&gt;Each debuggable container being started or stopped raises a &lt;em&gt;debug-container-event&lt;/em&gt; through
Skaffold&amp;rsquo;s event mechanism (&lt;a href=&#34;https://skaffold.dev/docs/references/api/grpc/#debuggingcontainerevent&#34;&gt;gRPC&lt;/a&gt;,
&lt;a href=&#34;https://skaffold.dev/docs/references/api/swagger/#/SkaffoldService/Events&#34;&gt;REST&lt;/a&gt;).&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;`/v1/events` stream of `skaffold debug` within `examples/jib`&lt;/summary&gt;
&lt;p&gt;In this example, we do a &lt;code&gt;skaffold debug&lt;/code&gt;, and then kill the deployed pod.  The deployment starts a new pod.
We get a terminated event for the container for the killed pod.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;2020-02-05T03:27:30.114354Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;event&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;debuggingContainerEvent&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Started&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;podName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;containerName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;artifact&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;skaffold-jib&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;jvm&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;debugPorts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;jdwp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5005&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;entry&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Debuggable container started pod/web-f6d56bcc5-6csgs:web (default)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id=&#34;api-state&#34;&gt;API: State&lt;/h3&gt;
&lt;p&gt;The API&amp;rsquo;s &lt;em&gt;state&lt;/em&gt; (&lt;a href=&#34;../../docs/references/api/grpc/#skaffoldservice&#34;&gt;gRPC&lt;/a&gt;,
&lt;a href=&#34;../../docs/references/api/swagger/#/SkaffoldService/GetState&#34;&gt;REST&lt;/a&gt;) also includes a list of debuggable containers.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;The `/v1/state` listing debugging containers&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;buildState&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;artifacts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;skaffold-jib&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Complete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;deployState&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Complete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;forwardedPorts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;5005&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;localPort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5005&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;remotePort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5005&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;podName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;containerName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;portName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;jdwp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;pod&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;8080&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;localPort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;remotePort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;8081&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;localPort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8081&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;remotePort&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;podName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;containerName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;pod&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;resourceName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;statusCheckState&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Not Started&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;fileSyncState&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Not Started&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;debuggingContainers&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Started&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;podName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web-f6d56bcc5-6csgs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;containerName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;web&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;artifact&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;skaffold-jib&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;jvm&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;debugPorts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;jdwp&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;5005&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Continuous Delivery</title>
      <link>https://skaffold.dev/docs/workflows/ci-cd/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://skaffold.dev/docs/workflows/ci-cd/</guid>
      <description>
        
        
        

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    Skaffold is used under the hood to power Google Cloud Platform&amp;rsquo;s &lt;a href=&#34;https://cloud.google.com/deploy&#34;&gt;Cloud Deploy API&lt;/a&gt;.  See the docs &lt;a href=&#34;https://cloud.google.com/deploy/docs/using-skaffold&#34;&gt;here&lt;/a&gt; for more information on how to use Skaffold + Cloud Deploy for CI/CD
&lt;/div&gt;

&lt;p&gt;Skaffold provides several features and sub-command &amp;ldquo;building blocks&amp;rdquo; that make it very useful for integrating with (or creating entirely new) CI/CD pipelines.
The ability to use the same &lt;code&gt;skaffold.yaml&lt;/code&gt; for iterative development and continuous delivery eases handing off an application from a development team to an ops team.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the simplest use case: a single, full deployment of your application.&lt;/p&gt;
&lt;h2 id=&#34;run-entire-pipeline-end-to-end&#34;&gt;Run entire pipeline end-to-end&lt;/h2&gt;


&lt;div class=&#34;maturity&#34; style=&#34;background: var(--maturity-)&#34;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;skaffold run&lt;/code&gt; is a single command for a one-off deployment. It runs through every major phase of the Skaffold lifecycle: building your application images, tagging these images (and optionally pushing them to a remote registry), deploying your application to the target cluster, and monitoring the created resources for readiness.&lt;/p&gt;
&lt;p&gt;We recommend &lt;code&gt;skaffold run&lt;/code&gt; for the simplest Continuous Delivery setup, where it is sufficient to have a single step that deploys from version control to a cluster.&lt;/p&gt;
&lt;p&gt;For more sophisticated Continuous Delivery pipelines, Skaffold offers building blocks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/status-check/&#34;&gt;status-check&lt;/a&gt; -
wait for &lt;code&gt;deployments&lt;/code&gt; to stabilize and succeed only if all deployments are successful&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/workflows/ci-cd/#skaffold-build-skaffold-deploy&#34;&gt;&lt;code&gt;skaffold build&lt;/code&gt;&lt;/a&gt; - build, tag and push artifacts to a registry&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/workflows/ci-cd/#skaffold-build-skaffold-deploy&#34;&gt;&lt;code&gt;skaffold deploy&lt;/code&gt;&lt;/a&gt;  - deploy built artifacts to a cluster&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/workflows/ci-cd/#skaffold-render-skaffold-apply&#34;&gt;&lt;code&gt;skaffold render&lt;/code&gt;&lt;/a&gt;  - export the transformed Kubernetes manifests&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/workflows/ci-cd/#skaffold-render-skaffold-apply&#34;&gt;&lt;code&gt;skaffold apply&lt;/code&gt;&lt;/a&gt; - send hydrated Kubernetes manifests to the API server to create resources on the target cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;traditional-continuous-delivery&#34;&gt;Traditional continuous delivery&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;skaffold build&lt;/code&gt; will build your project&amp;rsquo;s artifacts, and push the build images to the specified registry. If your project is already configured to run with Skaffold, &lt;code&gt;skaffold build&lt;/code&gt; can be a very lightweight way of setting up builds for your CI pipeline. Passing the &lt;code&gt;--file-output&lt;/code&gt; flag to Skaffold build will also write out your built artifacts in JSON format to a file on disk, which can then by passed to &lt;code&gt;skaffold deploy&lt;/code&gt; later on. This is a great way of &amp;ldquo;committing&amp;rdquo; your artifacts when they have reached a state that you&amp;rsquo;re comfortable with, especially for projects with multiple artifacts for multiple services.&lt;/p&gt;
&lt;p&gt;Example using the current git state as a unique file ID to &amp;ldquo;commit&amp;rdquo; build state:&lt;/p&gt;
&lt;p&gt;Storing the build result in a commit specific JSON file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;STATE&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;$(&lt;/span&gt;git rev-list -1 HEAD --abbrev-commit&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold build --file-output build-&lt;span style=&#34;color:#000&#34;&gt;$STATE&lt;/span&gt;.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;outputs the tag generation and cache output from Skaffold:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generating tags...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; - gcr.io/k8s-skaffold/skaffold-example:v0.41.0-17-g3ad238db
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking cache...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; - gcr.io/k8s-skaffold/skaffold-example: Found. Tagging
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The content of the JSON file&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat build-&lt;span style=&#34;color:#000&#34;&gt;$STATE&lt;/span&gt;.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;looks like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;builds&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:[{&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;imageName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcr.io/k8s-skaffold/skaffold-example&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;tag&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcr.io/k8s-skaffold/skaffold-example:v0.41.0-17-g3ad238db@sha256:eeffb639f53368c4039b02a4d337bde44e3acc728b309a84353d4857ee95c369&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then use this build result file to deploy with Skaffold:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold deploy -a build-&lt;span style=&#34;color:#000&#34;&gt;$STATE&lt;/span&gt;.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and as we&amp;rsquo;d expect, we see a bit of deploy-related output from Skaffold:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tags used in deployment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; - gcr.io/k8s-skaffold/skaffold-example -&amp;gt; gcr.io/k8s-skaffold/skaffold-example:v0.41.0-17-g3ad238db@sha256:eeffb639f53368c4039b02a4d337bde44e3acc728b309a84353d4857ee95c369
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Starting deploy...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; - pod/getting-started configured
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;separation-of-rendering-and-deployment&#34;&gt;Separation of rendering and deployment&lt;/h2&gt;


&lt;div class=&#34;maturity&#34; style=&#34;background: var(--maturity-beta)&#34;&gt;&amp;nbsp;beta&amp;nbsp;&lt;/div&gt;

&lt;p&gt;Skaffold allows separating the generation of fully-hydrated Kubernetes manifests from the actual deployment of those manifests, using the &lt;code&gt;skaffold render&lt;/code&gt; and
&lt;code&gt;skaffold apply&lt;/code&gt; commands.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skaffold render&lt;/code&gt; builds all application images from your artifacts, templates the newly-generated image tags into your Kubernetes manifests (based on your project&amp;rsquo;s deployment configuration), and then prints out the final hydrated manifests to a file or your terminal.
This allows you to capture the full, declarative state of your application in configuration, such that &lt;em&gt;applying&lt;/em&gt; the changes to your cluster can be done as a separate step.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;skaffold apply&lt;/code&gt; consumes one or more fully-hydrated Kubernetes manifests, and then sends the results directly to the Kubernetes control plane via &lt;code&gt;kubectl&lt;/code&gt; to create resources on the target cluster. After creating the resources on your cluster, &lt;code&gt;skaffold apply&lt;/code&gt; uses Skaffold&amp;rsquo;s built-in health checking to monitor the created resources for readiness. See &lt;a href=&#34;../../docs/status-check/&#34;&gt;resource health checks&lt;/a&gt; for more information on how Skaffold&amp;rsquo;s resource health checking works.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: &lt;code&gt;skaffold apply&lt;/code&gt; always uses &lt;code&gt;kubectl&lt;/code&gt; to deploy resources to a target cluster, regardless of deployment configuration in the provided skaffold.yaml. Only a small subset of deploy configuration is honored when running &lt;code&gt;skaffold apply&lt;/code&gt;:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deploy.statusCheckDeadlineSeconds&lt;/li&gt;
&lt;li&gt;deploy.kubeContext&lt;/li&gt;
&lt;li&gt;deploy.logs.prefix&lt;/li&gt;
&lt;li&gt;deploy.kubectl.flags&lt;/li&gt;
&lt;li&gt;deploy.kubectl.defaultNamespace&lt;/li&gt;
&lt;li&gt;deploy.kustomize.flags&lt;/li&gt;
&lt;li&gt;deploy.kustomize.defaultNamespace&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    &lt;code&gt;skaffold apply&lt;/code&gt; attempts to honor the deployment configuration mentioned above.  But when conflicting configuration is detected in a multi-configuration project, &lt;code&gt;skaffold apply&lt;/code&gt; will not work.
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;skaffold apply&lt;/code&gt; works with any arbitrary Kubernetes YAML, whether it was generated by Skaffold or not, making it an ideal counterpart to &lt;code&gt;skaffold render&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;gitops-style-continuous-delivery&#34;&gt;GitOps-style continuous delivery&lt;/h3&gt;
&lt;p&gt;You can use this separation of rendering and deploying to enable GitOps CD pipelines.&lt;/p&gt;
&lt;p&gt;GitOps-based CD pipelines traditionally see fully-hydrated Kubernetes manifests committed to a configuration Git repository (separate from the application source), which triggers a deployment pipeline that applies the changes to resources on the cluster.&lt;/p&gt;
&lt;h3 id=&#34;example-hydrate-manifests-then-deployapply-to-cluster&#34;&gt;Example: Hydrate manifests then deploy/apply to cluster&lt;/h3&gt;
&lt;p&gt;First, use &lt;code&gt;skaffold render&lt;/code&gt; to hydrate the Kubernetes resource file with a newly-built image tag:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-code&#34; data-lang=&#34;code&#34;&gt;$ skaffold render --output render.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# render.yaml&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Pod&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;getting-started&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/k8s-skaffold/skaffold-example:v1.19.0-89-gdbedd2a20-dirty&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;getting-started&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, we can apply this output directly to the cluster:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-code&#34; data-lang=&#34;code&#34;&gt;$ skaffold apply render.yaml

Starting deploy...
 - pod/getting-started created
Waiting for deployments to stabilize...
Deployments stabilized in 49.277055ms
&lt;/code&gt;&lt;/pre&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: Managing ARM workloads [NEW]</title>
      <link>https://skaffold.dev/docs/workflows/handling-platforms/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://skaffold.dev/docs/workflows/handling-platforms/</guid>
      <description>
        
        
        &lt;p&gt;Skaffold has a lot of intelligence built-in to simplify working with ARM workloads. Whether developing on an Apple Silicon Macbook that uses an ARM based chip, or deploying to a GKE Kubernetes cluster having ARM nodes, Skaffold can take away the complexities that arise when the architecture of your development machine and Kubernetes cluster don&amp;rsquo;t match.&lt;/p&gt;
&lt;h2 id=&#34;why-is-image-architecture-important&#34;&gt;Why is image architecture important?&lt;/h2&gt;
&lt;p&gt;Container images are built targeting specific &lt;a href=&#34;https://en.wikipedia.org/wiki/Instruction_set_architecture&#34;&gt;Instruction Set Architectures&lt;/a&gt; like &lt;code&gt;amd64&lt;/code&gt;, &lt;code&gt;arm64&lt;/code&gt;, etc. &lt;strong&gt;You must use container images that are compatible with the architecture of the node where you intend to run the workloads.&lt;/strong&gt; For example, to deploy to a GKE cluster running ARM nodes, the image needs to be built for &lt;code&gt;linux/arm64&lt;/code&gt; platform.&lt;/p&gt;
&lt;p&gt;All image builders build for different default architecture and not all support cross-architecture builds. For instance &lt;a href=&#34;../../docs/builders/builder-types/docker/&#34;&gt;Docker&lt;/a&gt; will build the image for the same architecture as the host machine, whereas &lt;a href=&#34;../../docs/builders/builder-types/buildpacks/&#34;&gt;Buildpacks&lt;/a&gt; will always build it for &lt;code&gt;amd64&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, the following combination of development machine and cluster node architectures can make it difficult to build and deploy images correctly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dev machine architecture is &lt;code&gt;amd64&lt;/code&gt; while the target cluster runs &lt;code&gt;arm64&lt;/code&gt; nodes.&lt;/li&gt;
&lt;li&gt;Dev machine architecture is &lt;code&gt;arm64&lt;/code&gt; (say Apple Silicon Macbooks) while the target cluster runs &lt;code&gt;amd64&lt;/code&gt; nodes.&lt;/li&gt;
&lt;li&gt;The target cluster runs both &lt;code&gt;arm64&lt;/code&gt; and &lt;code&gt;amd64&lt;/code&gt; nodes (mixed node pools).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎉 &lt;em&gt;Skaffold provides an opionated way to handle all these cases effectively.&lt;/em&gt; 🎉&lt;/p&gt;
&lt;h2 id=&#34;skaffold-can-set-the-image-architecture-automatically&#34;&gt;Skaffold can set the image architecture automatically&lt;/h2&gt;
&lt;p&gt;When running Skaffold in an interactive mode like &lt;code&gt;skaffold dev&lt;/code&gt;, &lt;code&gt;skaffold debug&lt;/code&gt; or &lt;code&gt;skaffold run&lt;/code&gt; where the intention is to build an image from the application code, and immediately deploy it to a Kubernetes cluster, Skaffold will check the active Kubernetes cluster node architecture and provide that as an argument to the respective image builder. If the cluster has multiple architecture nodes, then Skaffold will also create appropriate Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity&#34;&gt;&lt;code&gt;affinity&lt;/code&gt;&lt;/a&gt; rules so that the Kubernetes Pods with these images are assigned to matching architecture nodes.&lt;/p&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    Skaffold will create platform node &lt;code&gt;affinity&lt;/code&gt; rules only for clusters having multiple architecture nodes. You can also force this using the flag &lt;code&gt;--enable-platform-node-affinity=true&lt;/code&gt; to always create these affinity rules in the Kubernetes manifests for built images.
&lt;/div&gt;

&lt;p&gt;Let&amp;rsquo;s test this in a &lt;a href=&#34;https://github.com/GoogleContainerTools/skaffold/tree/main/examples/cross-platform-builds&#34;&gt;sample Golang&lt;/a&gt; project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;skaffold.yaml&lt;/code&gt; file defines a single &lt;a href=&#34;https://github.com/GoogleContainerTools/skaffold/blob/main/examples/cross-platform-builds/Dockerfile&#34;&gt;Docker build artifact&lt;/a&gt; and deploys it in a &lt;a href=&#34;https://github.com/GoogleContainerTools/skaffold/blob/main/examples/cross-platform-builds/k8s-pod.yaml&#34;&gt;&lt;code&gt;Kubernetes Pod&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First set the active Kubernetes context to a cluster having only &lt;code&gt;linux/amd64&lt;/code&gt; nodes, and run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold dev --default-repo=your/container/registy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Skaffold will detect the cluster node platform &lt;code&gt;linux/amd64&lt;/code&gt; and build the image for this platform:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold dev --default-repo=gcr.io/k8s-skaffold
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Listing files to watch...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- skaffold-example
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generating tags...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- skaffold-example -&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; gcr.io/k8s-skaffold/skaffold-example:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Starting build...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Building [skaffold-example]...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Target platforms: [linux/amd64]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Build [skaffold-example] succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Starting deploy...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pod/getting-started created
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Waiting for deployments to stabilize...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pods is ready.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Deployments stabilized in 7.42 seconds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Press Ctrl+C to exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Watching for changes...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[getting-started] Hello world! Running on linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now set the active Kubernetes context to a cluster containing only &lt;code&gt;linux/arm64&lt;/code&gt; nodes. See &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/prepare-arm-workloads-for-deployment&#34;&gt;here&lt;/a&gt; to know how you can create an ARM GKE cluster.&lt;/p&gt;
&lt;p&gt;Re-running the &lt;code&gt;dev&lt;/code&gt; command will now build a &lt;code&gt;linux/arm64&lt;/code&gt; image.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold dev --default-repo=gcr.io/k8s-skaffold
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[getting-started] Hello world! Running on linux/arm64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now set the active Kubernetes context to a cluster containing both &lt;code&gt;linux/arm64&lt;/code&gt; and &lt;code&gt;linux/amd64&lt;/code&gt; nodes. You can create a GKE cluster with 2 node pools, one having &lt;code&gt;linux/amd64&lt;/code&gt; nodes, and the other having &lt;code&gt;linux/arm64&lt;/code&gt; nodes.&lt;/p&gt;
&lt;p&gt;Re-run the &lt;code&gt;dev&lt;/code&gt; command but with an explicit platform target this time via the &lt;code&gt;--platform&lt;/code&gt; flag. If we don&amp;rsquo;t provide the target platform explicitly then Skaffold will choose one between &lt;code&gt;linux/amd64&lt;/code&gt; and &lt;code&gt;linux/arm64&lt;/code&gt;, trying to match your local dev machine architecture.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold dev --default-repo=your/container/registy --platform=linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Skaffold will build a &lt;code&gt;linux/amd64&lt;/code&gt; image and insert a &lt;code&gt;nodeAffinity&lt;/code&gt; definition to the &lt;code&gt;Pod&lt;/code&gt; so that it gets scheduled on the matching architecture node.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold dev --default-repo=gcr.io/k8s-skaffold --platform=linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[getting-started] Hello world! Running on linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validate that the &lt;code&gt;nodeAffinity&lt;/code&gt; was applied by running the command (skip &lt;code&gt;| jq&lt;/code&gt; if you don&amp;rsquo;t have &lt;code&gt;jq&lt;/code&gt; installed):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pod getting-started  -o=jsonpath=&amp;#39;{.spec.affinity}&amp;#39; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; jq
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nodeAffinity&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;requiredDuringSchedulingIgnoredDuringExecution&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nodeSelectorTerms&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;matchExpressions&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes.io/os&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;In&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes.io/arch&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;operator&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;In&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This example will run the same whether you&amp;rsquo;re using an &lt;code&gt;arm64&lt;/code&gt; machine (say an Apple Silicon Macbook) or an &lt;code&gt;amd64&lt;/code&gt; machine.&lt;/p&gt;
&lt;p&gt;Skaffold also supports cross-architecture builds on &lt;a href=&#34;https://cloud.google.com/build&#34;&gt;Google Cloud Build&lt;/a&gt;. You can rerun this example, with the additional flag &lt;code&gt;--profile cloudbuild&lt;/code&gt; to all the &lt;code&gt;dev&lt;/code&gt; commands to build on &lt;code&gt;Google Cloud Build&lt;/code&gt; instead of the local Docker daemon.&lt;/p&gt;
&lt;h2 id=&#34;what-about-multi-arch-images&#34;&gt;What about multi-arch images?&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&#34;https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/&#34;&gt;multi-arch image&lt;/a&gt; is an image that can support multiple architectures. It looks like a single image with a single tag, but is actually a list of images targeting multiple architectures organized by an &lt;a href=&#34;https://github.com/opencontainers/image-spec/blob/main/image-index.md&#34;&gt;image index&lt;/a&gt;. When you deploy a multi-arch image to a cluster, the container runtime automatically chooses the right image that is compatible with the architecture of the node to which it is being deployed. This simplifies targeting multiple clusters of different architecture nodes, and/or mixed-architecture nodes.&lt;/p&gt;
&lt;p&gt;Skaffold supports building multi-platform images natively using the &lt;a href=&#34;../../docs/builders/builder-types/jib/&#34;&gt;jib builder&lt;/a&gt;, the &lt;a href=&#34;../../docs/builders/builder-types/ko/&#34;&gt;ko builder&lt;/a&gt; and the &lt;a href=&#34;../../docs/builders/builder-types/custom/&#34;&gt;custom builder&lt;/a&gt;. For other builders that support building cross-architecture images, Skaffold will iteratively build a single platform image for each target architecture and stitch them together into a multi-platform image, and push it to the registry.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/multi-arch-flow.png&#34; alt=&#34;multi-arch-flow&#34;&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s test this in the same &lt;a href=&#34;https://github.com/GoogleContainerTools/skaffold/tree/main/examples/cross-platform-builds&#34;&gt;sample Golang&lt;/a&gt; project as before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run this command to build for the target architectures &lt;code&gt;linux/amd64&lt;/code&gt; and &lt;code&gt;linux/arm64&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold build -t latest --default-repo=your/container/registy --platform=linux/amd64,linux/arm64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Building [skaffold-example]...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Target platforms: [linux/amd64,linux/arm64]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[+] Building 0.3s (13/13) FINISHED
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; =&amp;gt; writing image sha256:10af3142e460566f5791c48758f0040cef6932cbcb0766082dcbb0d8db7653e7
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; =&amp;gt; naming to gcr.io/k8s-skaffold/skaffold-example:latest_linux_amd64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;latest_linux_amd64: digest: sha256:15bd4f2380e99b3563f8add1aba9691e414d4cc5701363d9c74960a20fb276c4 size: 739
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[+] Building 52.8s (13/13) FINISHED
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; =&amp;gt; writing image sha256:68866691e2d6f079b116e097ae4e67a53eaf89e825b52d6f31f2e9cc566974de
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; =&amp;gt; naming to gcr.io/k8s-skaffold/skaffold-example:latest_linux_arm64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4e0c2525c370: Pushed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;latest_linux_arm64: digest: sha256:868d0aec1cc7d2ed1fa1e840f38ff1aa50c3cc3d3232ea17a065618eaec4e82b size: 739
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Build [skaffold-example] succeeded
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validate that the image just built was multi-arch, by running the following &lt;code&gt;docker&lt;/code&gt; command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker manifest inspect your/container/registry/skaffold-example:latest &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; grep -A 3 &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Outputs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;architecture&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;platform&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;architecture&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now if we render the Kubernetes Pod manifest for this multi-arch image, then it&amp;rsquo;ll have platform affinity definition targeting both &lt;code&gt;linux/amd64&lt;/code&gt; and &lt;code&gt;linux/arm64&lt;/code&gt; architectures.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;skaffold render --default-repo=your/container/registry --enable-platform-node-affinity
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Outputs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind: Pod
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  name: getting-started
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  namespace: default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  affinity:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nodeAffinity:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      requiredDuringSchedulingIgnoredDuringExecution:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nodeSelectorTerms:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - matchExpressions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          - key: kubernetes.io/os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            operator: In
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            values:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - linux
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          - key: kubernetes.io/arch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            operator: In
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            values:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - amd64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - matchExpressions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          - key: kubernetes.io/os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            operator: In
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            values:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - linux
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          - key: kubernetes.io/arch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            operator: In
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            values:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - arm64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  containers:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - image: gcr.io/k8s-skaffold/skaffold-example:latest@sha256:9ecf4e52f7ff64b35deacf9d6eedc03f35d69e0b4bf3679b97ba492f4389f784
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name: getting-started
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
    &lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;
    &lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Multi-arch images need to be pushed to a container registry, as the local Docker deamon doesn&amp;rsquo;t yet support storing multi-arch images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For interactive modes like &lt;code&gt;skaffold dev&lt;/code&gt; and &lt;code&gt;skaffold debug&lt;/code&gt; requiring fast and repeated &lt;code&gt;build-render-deploy&lt;/code&gt; iterations, Skaffold will choose only one build architecture and build a single-platform image, even if you specify multiple target platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you need to build a multi-arch image with an interactive mode then use &lt;code&gt;skaffold run&lt;/code&gt;. This will build the multi-arch image and deploy it to the active Kubernetes cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;


      </description>
    </item>
    
  </channel>
</rss>
