diff options
-rw-r--r-- | doc/guix.texi | 17 | ||||
-rw-r--r-- | guix/scripts/pack.scm | 21 |
2 files changed, 36 insertions, 2 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index 3f646cd2ca..25efba118f 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -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 diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm index 61d18e2609..bbacc93bc0 100644 --- a/guix/scripts/pack.scm +++ b/guix/scripts/pack.scm @@ -334,6 +334,16 @@ added to the pack." (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 @@ added to the pack." "s" "777" "0" "0" (relative-file-name (dirname source) target))))))) - '#$symlinks) + '#$symlinks*) "-p" "/.singularity.d d 555 0 0" @@ -1049,9 +1059,18 @@ Create a bundle of PACKAGE.\n")) (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 |