~ruther/guix-local

57386498b617ba11fe3e378359b62c3ae72f1114 — Giacomo Leidi 10 months ago cc07ecd
home: Add home-oci-service-type.

* gnu/home/service/containers.scm: New file;
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (OCI backed services): Document it.

Change-Id: I8ce5b301e8032d0a7b2a9ca46752738cdee1f030
Signed-off-by: Maxim Cournoyer <maxim@guixotic.coop>
3 files changed, 164 insertions(+), 0 deletions(-)

M doc/guix.texi
A gnu/home/services/containers.scm
M gnu/local.mk
M doc/guix.texi => doc/guix.texi +114 -0
@@ 53002,6 53002,120 @@ For details about @code{readymedia-configuration}, check out the
documentation of the system service (@pxref{Miscellaneous Services,
@code{readymedia-service-type}}).

@subsubheading OCI backed services

@cindex OCI-backed, for Home
The @code{(gnu home services containers)} module provides the following service:

@defvar home-oci-service-type
This is the type of the service that allows to manage your OCI containers with
the same consistent interface you use for your other Home Shepherd services.
@end defvar

This service is a direct mapping of the @code{oci-service-type} system
service (@pxref{Miscellaneous Services, OCI backed services}).  You can
use it like this:

@lisp
(use-modules (gnu services containers)
             (gnu home services containers))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))

@end lisp

You may specify a custom configuration by providing a
@code{oci-configuration} record, exactly like for
@code{oci-service-type}, but wrapping it in @code{for-home}:

@lisp
(use-modules (gnu services)
             (gnu services containers)
             (gnu home services containers))

(service home-oci-service-type
         (for-home
          (oci-configuration
           (runtime 'podman)
           (verbose? #t))))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))
@end lisp

@node Invoking guix home
@section Invoking @command{guix home}


A gnu/home/services/containers.scm => gnu/home/services/containers.scm +49 -0
@@ 0,0 1,49 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2025 Giacomo Leidi <goodoldpaul@autistici.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu home services containers)
  #:use-module (gnu home services)
  #:use-module (gnu home services shepherd)
  #:use-module (gnu services)
  #:use-module (gnu services configuration)
  #:use-module (gnu services containers)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:use-module (srfi srfi-1)
  #:export (home-oci-service-type))

(define home-oci-service-type
  (service-type
   (inherit (system->home-service-type oci-service-type))
   (extensions
    (list
     (service-extension home-profile-service-type
                        (lambda (config)
                          (let ((runtime-cli
                                 (oci-configuration-runtime-cli config))
                                (runtime
                                 (oci-configuration-runtime config)))
                            (oci-service-profile runtime runtime-cli))))
     (service-extension home-shepherd-service-type
                        oci-configuration->shepherd-services)))
   (extend
    (lambda (config extension)
      (for-home
       (oci-configuration
        (inherit (oci-configuration-extend config extension))))))
   (default-value (for-home (oci-configuration)))))

M gnu/local.mk => gnu/local.mk +1 -0
@@ 105,6 105,7 @@ GNU_SYSTEM_MODULES =				\
  %D%/home/services.scm			\
  %D%/home/services/admin.scm			\
  %D%/home/services/backup.scm			\
  %D%/home/services/containers.scm		\
  %D%/home/services/desktop.scm			\
  %D%/home/services/dict.scm			\
  %D%/home/services/dotfiles.scm		\