1
0
mirror of https://git.savannah.gnu.org/git/guix.git synced 2026-04-06 21:20:33 +02:00

gnu: Add --pid-file option to "guix system container" scripts.

* gnu/system/linux-container.scm (container-script): Accept pid-file command
line option to write out the container's process ID.
* doc/guix.texi (Invoking guix system): Document new option.

Change-Id: I93e8a99b39c1dd831f116104bf92c723d96c9965
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Carlo Zancanaro
2025-09-23 15:34:55 +10:00
committed by Ludovic Courtès
parent ca7de58605
commit 0f96ceb58f
2 changed files with 26 additions and 2 deletions

View File

@@ -47633,8 +47633,13 @@ The @option{--share} and @option{--expose} options can also be passed to
the generated script to bind-mount additional directories into the
container.
The generated script also supports the @option{--pid-file} option to
write the container process ID to a file. This can be used, along with
@command{guix container exec} to execute scripts within the container
(@pxref{Invoking guix container}).
@quotation Note
This option requires Linux-libre 3.19 or newer.
The @code{container} action requires Linux-libre 3.19 or newer.
@end quotation
@end table

View File

@@ -8,6 +8,7 @@
;;; Copyright © 2023 Pierre Langlois <pierre.langlois@gmx.com>
;;; Copyright © 2024 Leo Nikkilä <hello@lnikki.la>
;;; Copyright © 2024 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2025 Carlo Zancanaro <carlo@zancanaro.id.au>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -247,6 +248,9 @@ Run the container with the given options."))
(display (G_ "
--expose=SPEC expose host file system directory as read-only
according to SPEC"))
(display (G_ "
--pid-file=FILE write the process ID of the container's PID 1
process to FILE"))
(newline)
(display (G_ "
-h, --help display this help and exit"))
@@ -267,6 +271,11 @@ Run the container with the given options."))
(lambda (opt name arg result)
(alist-cons 'file-system-mapping
(specification->file-system-mapping arg #f)
result)))
(option '("pid-file") #t #f
(lambda (opt name arg result)
(alist-cons 'pid-file
arg
result)))))
(define (parse-options args options)
@@ -290,6 +299,10 @@ Run the container with the given options."))
(newline (guix-warning-port)))
(let* ((opts (parse-options (cdr (command-line)) %options))
(pid-files (filter-map (match-lambda
(('pid-file . filename) filename)
(_ #f))
opts))
(mappings (filter-map (match-lambda
(('file-system-mapping . mapping) mapping)
(_ #f))
@@ -318,7 +331,13 @@ Run the container with the given options."))
(delq 'net %namespaces)
%namespaces)
#:writable-root? #t
#:process-spawned-hook explain)))))
#:process-spawned-hook (lambda (pid)
;; Write out the PID to the requested files
(for-each (lambda (filename)
(call-with-output-file filename
(lambda (port) (write pid port))))
pid-files)
(explain pid)))))))
(gexp->script "run-container" script)))