<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>there was a fish in the calculator</title><id>https://fishinthecalculator.me/feeds/tags/provisioning.xml</id><subtitle>Tag: provisioning</subtitle><updated>2026-05-05T22:13:01Z</updated><link href="https://fishinthecalculator.me/feeds/tags/provisioning.xml" rel="self" /><link href="https://fishinthecalculator.me" /><entry><title>Declarative, transactional, cloud native OCI provisioning with Guix</title><id>https://fishinthecalculator.me/blog/declarative-transactional-cloud-native-oci-provisioning-with-guix.html</id><author><name>Giacomo Leidi</name><email>therewasa@fishinthecalculator.me</email></author><updated>2025-05-06T23:33:00Z</updated><link href="https://fishinthecalculator.me/blog/declarative-transactional-cloud-native-oci-provisioning-with-guix.html" rel="alternate" /><content type="html">&lt;p&gt;Many applications are packaged in OCI images but not in Guix. A good subset of them is written either in NodeJS, Go, Rust or languages that, as a general approach, encourage applications to have huge dependency graphs.&lt;/p&gt;&lt;p&gt;The Guix project accepts package contributions that comply to very strict standards in terms of whether the package and its dependencies can be completely built from source. It's the reason why practically no Javascript application (or even web applications with complex frontends) are in Guix mainline. It is not clear whether they will ever be.&lt;/p&gt;&lt;h2 id=&quot;oci_backed_services&quot;&gt;OCI backed services&lt;/h2&gt;&lt;p&gt;Yet the Guix System is completely usable for self hosting purposes. If you use &lt;code&gt;docker compose&lt;/code&gt; on the Guix System, you end up having two different interfaces to manage your system services: Shepherd and Docker/Podman. The &lt;code&gt;oci-service-type&lt;/code&gt; aims at implementing Shepherd Services that look and feel native (so you can configure and manage them with the usual consistent interface that Guix exposes) but under the hood are implemented as &lt;code&gt;docker run&lt;/code&gt; or &lt;code&gt;podman run&lt;/code&gt; invocations.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;simple-service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'oci-provisioning&lt;/span&gt;
                    &lt;span class=&quot;syntax-symbol&quot;&gt;oci-service-type&lt;/span&gt;
                    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-extension&lt;/span&gt;
                      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;networks&lt;/span&gt;
                        &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-network-configuration&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;monitoring&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;containers&lt;/span&gt;
                       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                        &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;prom/prometheus&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;monitoring&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;ports&lt;/span&gt;
                           &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9000&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9000&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9090&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;9090&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                        &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;docker.io/grafana/grafana:latest&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;monitoring&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;ports&lt;/span&gt;
                           &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;3000:3000&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;volumes&lt;/span&gt;
                           &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/var/lib/grafana&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/var/lib/grafana&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this example two different Shepherd services are going to be added
to the system. Each &lt;code&gt;oci-container-configuration&lt;/code&gt; record translates to
a &lt;code&gt;docker run&lt;/code&gt; or &lt;code&gt;podman run&lt;/code&gt; invocation and its fields directly
map to options. You can refer to the &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/run&quot;&gt;Docker&lt;/a&gt; or &lt;a href=&quot;https://docs.podman.io/en/stable/markdown/podman-run.1.html&quot;&gt;Podman&lt;/a&gt; upstream documentation
for semantics of each value. If the images are not found, they will be pulled.
You can refer to the &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/pull/&quot;&gt;Docker&lt;/a&gt; or &lt;a href=&quot;https://docs.podman.io/en/stable/markdown/podman-pull.1.html&quot;&gt;Podman&lt;/a&gt; upstream documentation for semantics.&lt;/p&gt;&lt;h3 id=&quot;a_backend_example&quot;&gt;A backend example&lt;/h3&gt;&lt;p&gt;Let's start with a simple example, you can imagine this being the equivalent of your backend service or SQL process. Its behavior is quite simple: when someone sends an HTTP GET request for the &lt;code&gt;/whosin&lt;/code&gt; path at the port &lt;code&gt;7777&lt;/code&gt;, the script returns &lt;code&gt;out of office&lt;/code&gt; and writes &lt;code&gt;empty&lt;/code&gt; into &lt;code&gt;/tmp/office&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7777/whosin
    out of office
    
    $ cat /tmp/office
    empty&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In case any other path is queried, it returns &lt;code&gt;unknown path&lt;/code&gt; and the requested path over HTTP and writes &lt;code&gt;on fire&lt;/code&gt; into &lt;code&gt;/tmp/office&lt;/code&gt;.  This is what happens when the &lt;code&gt;/lallo&lt;/code&gt; path is requested:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7777/lallo &amp;amp;&amp;amp; cat /tmp/office
    unknown path /lallo
    on fire
    empty&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can now run the server in background with Shepherd, to check its behavior as a native process inside a Shepherd service:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd spawn transient -- `pwd`/backend.scm /tmp
    $ herd status | grep transient-
     + transient-198
    $ herd status transient-198
    ● Status of transient-198:
      It is transient, running since 07:24:53 PM (4 minutes ago).
      Main PID: 17653
      Command: backend.scm /tmp
      It is enabled.
      Provides: transient-198
      Requires: transient
      Will not be respawned.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see the behavior is the same as the one the script manifests when run from shell as a regular command:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7777/whosin &amp;amp;&amp;amp; cat /tmp/office
    out of office
    empty&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;the_frontend_script&quot;&gt;The frontend script&lt;/h3&gt;&lt;p&gt;You can imagine this being the equivalent of your frontend or some kind of middlweare service. Its behavior is: when someone sends an HTTP GET request for the &lt;code&gt;/doorbell&lt;/code&gt; path at the port &lt;code&gt;7778&lt;/code&gt;, the frontend calls the backend at &lt;code&gt;http://localhost:7777/whosin&lt;/code&gt;, then reads the &lt;code&gt;/tmp/office&lt;/code&gt; file contents and returns everything via HTTP to the client. Let's try:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd spawn transient -- `pwd`/frontend.scm /tmp http://localhost:7777/whosin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If we check now, we should have two different transient services, one for the backend and one for the frontend:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd status | grep transient-
     + transient-198
     + transient-199&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can now test whether the code is sound:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7777/lallo &amp;amp;&amp;amp; cat /tmp/office
    unknown path /lallo
    on fire
    
    $ curl localhost:7778/doorbell
    backend state: out of office
    office state: empty
    
    $ cat /tmp/office
    empty
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now let's try running these scripts inside containers and see what changes from the native Shepherd services and the containerized ones.&lt;/p&gt;&lt;h3 id=&quot;an_home_service_example&quot;&gt;An Home service example&lt;/h3&gt;&lt;p&gt;Let's start by defining a Guile OCI image in our Guix Home configuration and gexps for the scripts:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;guile-oci-image&lt;/span&gt;
      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-image&lt;/span&gt;
       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;repository&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;guile&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;value&lt;/span&gt;
        &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;specifications-&amp;gt;manifest&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;guile&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;pack-options&lt;/span&gt;
        &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-keyword&quot;&gt;#:symlinks&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/bin&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;bin&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;script-file&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;script-name&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;local-file&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;string-append&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;getenv&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;HOME&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                                 &lt;span class=&quot;syntax-comment&quot;&gt;;; I happen to store these scripts in my HOME directory,
&lt;/span&gt;                                 &lt;span class=&quot;syntax-comment&quot;&gt;;; you should replace this with the directory where you
&lt;/span&gt;                                 &lt;span class=&quot;syntax-comment&quot;&gt;;; store your scripts.
&lt;/span&gt;                                 &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;script-name&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;.scm&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;string-append&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;script-name&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;.scm&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;backend-script&lt;/span&gt;
     &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;script-file&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;backend&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;frontend-script&lt;/span&gt;
     &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;script-file&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;frontend&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And add the following to your Home services:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;home-oci-service-type&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;for-home&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-configuration&lt;/span&gt;
               &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;runtime&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'podman&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;simple-service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'home-oci-provisioning&lt;/span&gt;
          &lt;span class=&quot;syntax-symbol&quot;&gt;home-oci-service-type&lt;/span&gt;
          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-extension&lt;/span&gt;
           &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;networks&lt;/span&gt;
            &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-network-configuration&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-network&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;volumes&lt;/span&gt;
            &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-volume-configuration&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-volume&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;containers&lt;/span&gt;
            &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;backend&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;guile-oci-image&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;entrypoint&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/bin/guile&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-network&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;command&lt;/span&gt;
               &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;-s&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/backend.scm&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/my-volume&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;volumes&lt;/span&gt;
               &lt;span class=&quot;syntax-symbol&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-volume&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/my-volume&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                 &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;,backend-script&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/backend.scm&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;frontend&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;guile-oci-image&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;requirement&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;entrypoint&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/bin/guile&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-network&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;command&lt;/span&gt;
               &lt;span class=&quot;syntax-symbol&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;-s&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/frontend.scm&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/my-volume&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;http://backend:7777/whosin&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;volumes&lt;/span&gt;
               &lt;span class=&quot;syntax-symbol&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;my-volume&amp;quot;&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/my-volume&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                 &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;,frontend-script&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;syntax-string&quot;&gt;&amp;quot;/frontend.scm&amp;quot;&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can now run &lt;code&gt;guix home reconfigure ...&lt;/code&gt;. After Guix Home is done, check the services' status:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd status backend
    ● Status of backend:
      It is running since 11:21:38 PM (9 seconds ago).
      Main PID: 1756
      Command: /home/paul/.guix-home/profile/bin/podman run --rm --replace --name backend --entrypoint /bin/guile --network my-network -v my-volume:/my-volume -v /gnu/store/qiqwy2j7a598wp8v68294fpbjmmahrqc-backend.scm:/backend.scm localhost/guile:latest -s /backend.scm /my-volume
      It is enabled.
      Provides: backend
      Requires: home-podman-networks home-podman-volumes
      Custom action: command-line
      Will not be respawned.
    
    Recent messages (use '-n' to view more or less):
      2025-03-09 23:21:40 Copying config sha256:d111b778901b847eca5043a590e41c432a0471b3d8c3b75fe00fb2ad15088d59
      2025-03-09 23:21:40 Writing manifest to image destination
      2025-03-09 23:21:40 Loading image for backend from /gnu/store/2ndlvrpblk171qixkspywrrm4z5fah5n-backend.tar.gz...
      2025-03-09 23:21:40 Loaded image: localhost/guile.latest:latest
      2025-03-09 23:21:40 Tagged /gnu/store/2ndlvrpblk171qixkspywrrm4z5fah5n-backend.tar.gz with localhost/guile:latest...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and the same for the frontend:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd status frontend
    ● Status of frontend:
      It is running since 11:21:38 PM (36 seconds ago).
      Main PID: 1757
      Command: /home/paul/.guix-home/profile/bin/podman run --rm --replace --name frontend --entrypoint /bin/guile --network my-network -p 7778:7778 -v my-volume:/my-volume -v /gnu/store/m1avaw2681bbljxcidy7vb4x0i3898db-frontend.scm:/frontend.scm localhost/guile:latest -s /frontend.scm /my-volume http://backend:7777/whosin
      It is enabled.
      Provides: frontend
      Requires: home-podman-networks home-podman-volumes backend
      Custom action: command-line
      Will not be respawned.
    
    Recent messages (use '-n' to view more or less):
      2025-03-09 23:21:40 Writing manifest to image destination
      2025-03-09 23:21:40 Untagged: localhost/guile.latest:latest
      2025-03-09 23:21:40 Loading image for frontend from /gnu/store/ak3pzlin4ay98p14blxaj7zgrv8fh632-frontend.tar.gz...
      2025-03-09 23:21:40 Loaded image: localhost/guile.latest:latest
      2025-03-09 23:21:40 Tagged /gnu/store/ak3pzlin4ay98p14blxaj7zgrv8fh632-frontend.tar.gz with localhost/guile:latest...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now let's test the functionality. We only exposed the frontend port, so we expect not to be able to connect to &lt;code&gt;7777&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7777/whosin
    curl: (7) Failed to connect to localhost port 7777 after 0 ms: Couldn't connect to server&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;only to the frontend port (which is the &lt;code&gt;7778&lt;/code&gt;):&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ curl localhost:7778/doorbell
    backend state: out of office
    office state: empty&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can check the &lt;code&gt;office&lt;/code&gt; file contents with:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ podman volume export my-volume | tar xv
    office
    $ cat office
    empty&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, let's have a closer look at the Shepherd services. Shepherd services
provisioned by the &lt;code&gt;oci-service-type&lt;/code&gt; support different set of actions.&lt;/p&gt;&lt;p&gt;The network provisioning service provides the following action:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd doc home-podman-networks list-actions
    command-line:
      Prints home-podman-networks OCI runtime command line invocation.
    
    $ herd command-line home-podman-networks
    /home/paul/.guix-home/profile/bin/podman network create my-network&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;the same goes for the volumes provisioning service:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd doc home-podman-networks list-actions
    command-line:
      Prints home-podman-volumes OCI runtime command line invocation.
    
    $ herd command-line home-podman-volumes
    /home/paul/.guix-home/profile/bin/podman volume create my-volume&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and for containers which reference a cached image, like in our case:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ herd doc backend list-actions
    command-line:
      Prints backend OCI runtime command line invocation.
    
    $ herd command-line backend
    /home/paul/.guix-home/profile/bin/podman run --rm --replace --name backend --entrypoint /bin/guile --network my-network -v my-volume:/my-volume -v /gnu/store/qiqwy2j7a598wp8v68294fpbjmmahrqc-backend.scm:/backend.scm localhost/guile:latest -s /backend.scm /my-volume&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OCI containers that have a remote image reference in their &lt;code&gt;image&lt;/code&gt; field,
additionally support a &lt;code&gt;pull&lt;/code&gt; action:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    $ sudo herd doc podman-forgejo list-actions
    command-line:
      Prints podman-forgejo OCI runtime command line invocation.
    
    pull:
      Pull podman-forgejo image (codeberg.org/forgejo/forgejo:10.0.1-rootless).
    
    $ sudo herd command-line podman-forgejo
    /run/current-system/profile/bin/podman run --rm --replace --name podman-forgejo --env USER_UID=34595 --env USER_GID=98715 -p 3000:3000 -p 2202:22 -v forgejo:/var/lib/gitea -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro codeberg.org/forgejo/forgejo:10.0.1-rootless
    
    $ sudo tail -n 17 /var/log/forgejo.log
    2025-03-09 23:50:11 Trying to pull codeberg.org/forgejo/forgejo:10.0.1-rootless...
    2025-03-09 23:50:14 Getting image source signatures
    2025-03-09 23:50:14 Copying blob sha256:15ab256cd4da0c6bf93a7cfa7e85e16dc9da5020c3415b630e59b09df76d27db
    2025-03-09 23:50:14 Copying blob sha256:71d5a7a4eeb57275b451cfab8e904d9fa727a37f88fa3bc75942e1b4460acd44
    2025-03-09 23:50:14 Copying blob sha256:66a3d608f3fa52124f8463e9467f170c784abd549e8216aa45c6960b00b4b79b
    2025-03-09 23:50:14 Copying blob sha256:662951a9d959644cb6d446eed38ee5a42b231df7100397a93a5c2f22bf68712b
    2025-03-09 23:50:14 Copying blob sha256:9cace756fe1f230966ec1022c17c33168f14c9e067e559c97950fdbfa2bba40b
    2025-03-09 23:50:14 Copying blob sha256:d962a541e1a1144a3c08f44260b04c7e37cdd99db572c8ae6a8f54cd8f9eafbe
    2025-03-09 23:50:14 Copying blob sha256:7dc8ff21196384b18f484da3eb1bde3064c7b506de71fdf45c6a12e7425d3bb9
    2025-03-09 23:50:14 Copying blob sha256:82cdec355329fbe7dbbfeee91deca478d805ea4a20a07bf4f486beeb6ec9c342
    2025-03-09 23:50:14 Copying blob sha256:c768a4796c3cea8130cd679fcdebbe3ec0c2d7399bc5e85758e20efb4eb834b6
    2025-03-09 23:50:14 Copying blob sha256:43402951a99e9088f7eb19a737a806b81906305e15cd5bb0ecf1a1fa816da5f9
    2025-03-09 23:50:14 Copying blob sha256:003e5af9ef5613ad37b723e8bf9fdbf80c2a656c9a61741941797ebcc1891cc3
    2025-03-09 23:50:14 Copying blob sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
    2025-03-09 23:50:14 Copying config sha256:55f1bcd32c34de7e1544e5dfac45208cce1a8bb298858ff61978ff858c7c5f6b
    2025-03-09 23:50:14 Writing manifest to image destination
    2025-03-09 23:50:14 55f1bcd32c34de7e1544e5dfac45208cce1a8bb298858ff61978ff858c7c5f6b&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;oci-container-service-type_vs_oci-service-type&quot;&gt;oci-container-service-type vs oci-service-type&lt;/h2&gt;&lt;p&gt;The new &lt;code&gt;oci-service-type&lt;/code&gt; deprecates the &lt;code&gt;oci-container-service-type&lt;/code&gt;: it is
completely backward compatible and now, while deprecated, the
&lt;code&gt;oci-container-service-type&lt;/code&gt; is actually implemented extending the
&lt;code&gt;oci-service-type&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;It brings additional features, such as: rootless podman support, the ability
to provision networks and volumes, and better image caching.&lt;/p&gt;&lt;p&gt;To make the switch in service code you need to change your extension from&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service-extension&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-service-type&lt;/span&gt;
                       &lt;span class=&quot;syntax-symbol&quot;&gt;oci-bonfire-configuration-&amp;gt;oci-container-configuration&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;service-extension&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;oci-service-type&lt;/span&gt;
                       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-special&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;
                         &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-extension&lt;/span&gt;
                          &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;containers&lt;/span&gt;
                           &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                            &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-bonfire-configuration-&amp;gt;oci-container-configuration&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To make the switch in &lt;code&gt;operating-system&lt;/code&gt; records, you need to change from&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;simple-service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'oci-containers&lt;/span&gt;
                    &lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-service-type&lt;/span&gt;
                    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                     &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
                      &lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to&lt;/p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;simple-service&lt;/span&gt; &lt;span class=&quot;syntax-symbol&quot;&gt;'oci-containers&lt;/span&gt;
                    &lt;span class=&quot;syntax-symbol&quot;&gt;oci-service-type&lt;/span&gt;
                    &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-extension&lt;/span&gt;
                     &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;containers&lt;/span&gt;
                      &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;list&lt;/span&gt;
                       &lt;span class=&quot;syntax-open&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;syntax-symbol&quot;&gt;oci-container-configuration&lt;/span&gt;
                        &lt;span class=&quot;syntax-symbol&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;syntax-close&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content></entry></feed>