guix: pack: Add '--entry-point-argument' option.

* guix/scripts/pack.scm:
(entry-point-argument-spec-option-parser): New procedure.
(docker-image, %default-options, %docker-format-options,
show-docker-format-options/detailed, %options, show-docker-format-options,
guix-pack): Handle '--entry-point-argument' option.
* doc/guix.texi: (Invoking guix pack): Document this

Signed-off-by: Oleg Pykhalov <go.wigust@gmail.com>
Change-Id: I1124feff6af39dcc63c85fd6cc7ad50f398489dc
This commit is contained in:
Graham James Addis 2023-07-12 09:17:13 +01:00 committed by Oleg Pykhalov
parent 7a7c8920ae
commit 7d5168a2af
No known key found for this signature in database
GPG key ID: 167F8EA5001AFA9C
2 changed files with 54 additions and 10 deletions

View file

@ -122,6 +122,7 @@ Copyright @copyright{} 2023 Felix Lechner@*
Copyright @copyright{} 2023 Foundation Devices, Inc.@*
Copyright @copyright{} 2023 Thomas Ieong@*
Copyright @copyright{} 2023 Saku Laesvuori@*
Copyright @copyright{} 2023 Graham James Addis@*
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@ -7406,7 +7407,7 @@ execution engines listed above by setting the
@env{GUIX_EXECUTION_ENGINE} environment variable accordingly.
@end quotation
@cindex entry point, for Docker images
@cindex entry point, for Docker and Singularity images
@item --entry-point=@var{command}
Use @var{command} as the @dfn{entry point} of the resulting pack, if the pack
format supports it---currently @code{docker} and @code{squashfs} (Singularity)
@ -7429,6 +7430,17 @@ docker load -i pack.tar.gz
docker run @var{image-id}
@end example
@cindex entry point arguments, for docker images
@item --entry-point-argument=@var{command}
@itemx -A @var{command}
Use @var{command} as an argument to @dfn{entry point} of the resulting pack.
This option is only valid in conjunction with @code{--entry-point} and can
appear multiple times on the command line.
@example
guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
@end example
@item --expression=@var{expr}
@itemx -e @var{expr}
Consider the package @var{expr} evaluates to.

View file

@ -8,6 +8,7 @@
;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2020 Eric Bavier <bavier@posteo.net>
;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
;;; Copyright © 2023 Graham James Addis <graham@addis.org.uk>
;;;
;;; This file is part of GNU Guix.
;;;
@ -202,6 +203,16 @@ (define (symlink-spec-option-parser opt name arg result)
(leave (G_ "~a: invalid symlink specification~%")
arg))))
(define (entry-point-argument-spec-option-parser opt name arg result)
"A SRFI-37 opion parser for the --entry-point-argument option. The spec
takes multiple occurances. The entries are used in the exec form for the
docker entry-point. The values are used as parameters in conjunction with
the --entry-point option which is used as the first value in the exec form."
(let ((entry-point-argument (assoc-ref result 'entry-point-argument)))
(alist-cons 'entry-point-argument
(append entry-point-argument (list arg))
(alist-delete 'entry-point-argument result eq?))))
(define (set-utf8-locale profile)
"Configure the environment to use the \"en_US.utf8\" locale provided by the
GLIBC-UT8-LOCALES package."
@ -562,10 +573,22 @@ (define directives
`((directory "/tmp" ,(getuid) ,(getgid) #o1777)
,@(append-map symlink->directives '#$symlinks)))
(define (form-entry-point prefix entry-point entry-point-argument)
;; Construct entry-point parameter for build-docker-image. The
;; first entry is constructed by prefixing the entry-point with
;; the supplied index subsequent entries are taken from the
;; --entry-point-argument options.
(and=> entry-point
(lambda (entry-point)
(cons* (string-append prefix "/" entry-point)
entry-point-argument))))
(setenv "PATH" #+(file-append archiver "/bin"))
(let-keywords '#$extra-options #f
((image-tag #f))
((image-tag #f)
(entry-point-argument #f))
(build-docker-image #$output
(map store-info-item
(call-with-input-file "profile"
@ -578,11 +601,10 @@ (define directives
#:database #+database
#:system (or #$target %host-type)
#:environment environment
#:entry-point
#$(and entry-point
#~(list
(string-append #$profile "/"
#$entry-point)))
#:entry-point (form-entry-point
#$profile
#$entry-point
entry-point-argument)
#:extra-files directives
#:compressor
#+(compressor-command compressor)
@ -1264,6 +1286,7 @@ (define %default-options
(debug . 0)
(verbosity . 1)
(symlinks . ())
(entry-point-argument . ())
(compressor . ,(first %compressors))))
(define %formats
@ -1299,7 +1322,9 @@ (define (required-option symbol)
rest))))
(define %docker-format-options
(list (required-option 'image-tag)))
(list (required-option 'image-tag)
(option '(#\A "entry-point-argument") #t #f
entry-point-argument-spec-option-parser)))
(define (show-docker-format-options)
(display (G_ "
@ -1308,7 +1333,12 @@ (define (show-docker-format-options)
(define (show-docker-format-options/detailed)
(display (G_ "
--image-tag=NAME
Use the given NAME for the Docker image repository"))
Use the given NAME for the Docker image repository
-A, --entry-point-argument=COMMAND/PARAMETER
Value(s) to use for the Docker EntryPoint arguments.
Multiple instances are accepted. This is only valid
in conjunction with the --entry-point option"))
(newline)
(exit 0))
@ -1619,7 +1649,9 @@ (define (process-file-arg opts name)
(extra-options (match pack-format
('docker
(list #:image-tag
(assoc-ref opts 'image-tag)))
(assoc-ref opts 'image-tag)
#:entry-point-argument
(assoc-ref opts 'entry-point-argument)))
('deb
(list #:control-file
(process-file-arg opts 'control-file)