pack: Clarify the /bin/sh requirement for Singularity.

* guix/scripts/pack.scm (squashfs-image)[symlinks*]: New variable.
[build]: Use it instead of SYMLINKS.
(guix-pack): Emit a warning and a hint when "bash" and "bash-minimal"
are missing and PACK-FORMAT is 'squashfs.
* doc/guix.texi (Invoking guix pack): Document the /bin/sh requirement
for Singularity.
This commit is contained in:
Ludovic Courtès 2019-12-10 15:54:37 +01:00 committed by Ludovic Courtès
parent fc81316384
commit dc995fcd5a
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 36 additions and 2 deletions

View file

@ -5053,7 +5053,7 @@ Yet another option is to produce a SquashFS image with the following
command:
@example
guix pack -f squashfs guile emacs geiser
guix pack -f squashfs bash guile emacs geiser
@end example
@noindent
@ -5088,6 +5088,21 @@ package names passed on the command line or in the manifest file.
This produces a SquashFS image containing all the specified binaries and
symlinks, as well as empty mount points for virtual file systems like
procfs.
@quotation Note
Singularity @emph{requires} you to provide @file{/bin/sh} in the image.
For that reason, @command{guix pack -f squashfs} always implies @code{-S
/bin=bin}. Thus, your @command{guix pack} invocation must always start
with something like:
@example
guix pack -f squashfs bash @dots{}
@end example
If you forget the @code{bash} (or similar) package, @command{singularity
run} and @command{singularity exec} will fail with an unhelpful ``no
such file or directory'' message.
@end quotation
@end table
@cindex relocatable binaries

View file

@ -334,6 +334,16 @@ (define database
(define environment
(singularity-environment-file profile))
(define symlinks*
;; Singularity requires /bin (specifically /bin/sh), so ensure that
;; symlink is created.
(if (find (match-lambda
(("/bin" . _) #t)
(_ #f))
symlinks)
symlinks
`(("/bin" -> "bin") ,@symlinks)))
(define build
(with-imported-modules (source-module-closure
'((guix build utils)
@ -407,7 +417,7 @@ (define entry-point #$entry-point)
"s" "777" "0" "0"
(relative-file-name (dirname source)
target)))))))
'#$symlinks)
'#$symlinks*)
"-p" "/.singularity.d d 555 0 0"
@ -1049,9 +1059,18 @@ (define properties
(entry-point (assoc-ref opts 'entry-point))
(profile-name (assoc-ref opts 'profile-name))
(gc-root (assoc-ref opts 'gc-root)))
(define (lookup-package package)
(manifest-lookup manifest (manifest-pattern (name package))))
(when (null? (manifest-entries manifest))
(warning (G_ "no packages specified; building an empty pack~%")))
(when (and (eq? pack-format 'squashfs)
(not (any lookup-package '("bash" "bash-minimal"))))
(warning (G_ "Singularity requires you to provide a shell~%"))
(display-hint (G_ "Add @code{bash} or @code{bash-minimal} \
to your package list.")))
(run-with-store store
(mlet* %store-monad ((profile (profile-derivation
manifest