mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
pack: Docker backend now honors '--localstatedir'.
* guix/docker.scm (build-docker-image): Add #:database parameter. Create /var/guix/db, /var/guix/profiles, etc. when DATABASE is true. * guix/scripts/pack.scm (docker-image): Export. Remove #:deduplicate? parameter. Define 'database' and pass it to 'docker-image'. * tests/pack.scm (test-assertm): Recompile the derivation of %BOOTSTRAP-GUILE. ("docker-image + localstatedir"): New test.
This commit is contained in:
parent
c5ce2db569
commit
f5a2fb1bfb
3 changed files with 74 additions and 4 deletions
|
@ -26,6 +26,7 @@ (define-module (guix docker)
|
|||
delete-file-recursively
|
||||
with-directory-excursion
|
||||
invoke))
|
||||
#:use-module (gnu build install)
|
||||
#:use-module (json) ;guile-json
|
||||
#:use-module (srfi srfi-19)
|
||||
#:use-module (srfi srfi-26)
|
||||
|
@ -108,11 +109,15 @@ (define* (build-docker-image image paths prefix
|
|||
(symlinks '())
|
||||
(transformations '())
|
||||
(system (utsname:machine (uname)))
|
||||
database
|
||||
compressor
|
||||
(creation-time (current-time time-utc)))
|
||||
"Write to IMAGE a Docker image archive containing the given PATHS. PREFIX
|
||||
must be a store path that is a prefix of any store paths in PATHS.
|
||||
|
||||
When DATABASE is true, copy it to /var/guix/db in the image and create
|
||||
/var/guix/gcroots and friends.
|
||||
|
||||
SYMLINKS must be a list of (SOURCE -> TARGET) tuples describing symlinks to be
|
||||
created in the image, where each TARGET is relative to PREFIX.
|
||||
TRANSFORMATIONS must be a list of (OLD -> NEW) tuples describing how to
|
||||
|
@ -188,10 +193,15 @@ (define transformation-options
|
|||
source))))
|
||||
symlinks)
|
||||
|
||||
(when database
|
||||
;; Initialize /var/guix, assuming PREFIX points to a profile.
|
||||
(install-database-and-gc-roots "." database prefix))
|
||||
|
||||
(apply invoke "tar" "-cf" "layer.tar"
|
||||
`(,@transformation-options
|
||||
,@%tar-determinism-options
|
||||
,@paths
|
||||
,@(if database '("var") '())
|
||||
,@(map symlink-source symlinks)))
|
||||
;; It is possible for "/" to show up in the archive, especially when
|
||||
;; applying transformations. For example, the transformation
|
||||
|
@ -203,7 +213,11 @@ (define transformation-options
|
|||
(system* "tar" "--delete" "/" "-f" "layer.tar")
|
||||
(for-each delete-file-recursively
|
||||
(map (compose topmost-component symlink-source)
|
||||
symlinks)))
|
||||
symlinks))
|
||||
|
||||
;; Delete /var/guix.
|
||||
(when database
|
||||
(delete-file-recursively "var")))
|
||||
|
||||
(with-output-to-file "config.json"
|
||||
(lambda ()
|
||||
|
|
|
@ -52,6 +52,8 @@ (define-module (guix scripts pack)
|
|||
#:export (compressor?
|
||||
lookup-compressor
|
||||
self-contained-tarball
|
||||
docker-image
|
||||
|
||||
guix-pack))
|
||||
|
||||
;; Type of a compression tool.
|
||||
|
@ -360,7 +362,6 @@ (define build
|
|||
|
||||
(define* (docker-image name profile
|
||||
#:key target
|
||||
deduplicate?
|
||||
(compressor (first %compressors))
|
||||
localstatedir?
|
||||
(symlinks '())
|
||||
|
@ -370,6 +371,11 @@ (define* (docker-image name profile
|
|||
with COMPRESSOR. It can be passed to 'docker load'. If TARGET is true, it
|
||||
must a be a GNU triplet and it is used to derive the architecture metadata in
|
||||
the image."
|
||||
(define database
|
||||
(and localstatedir?
|
||||
(file-append (store-database (list profile))
|
||||
"/db/db.sqlite")))
|
||||
|
||||
(define defmod 'define-module) ;trick Geiser
|
||||
|
||||
(define build
|
||||
|
@ -388,6 +394,7 @@ (define build
|
|||
(call-with-input-file "profile"
|
||||
read-reference-graph))
|
||||
#$profile
|
||||
#:database #+database
|
||||
#:system (or #$target (utsname:machine (uname)))
|
||||
#:symlinks '#$symlinks
|
||||
#:compressor '#$(compressor-command compressor)
|
||||
|
|
|
@ -22,6 +22,7 @@ (define-module (test-pack)
|
|||
#:use-module (guix store)
|
||||
#:use-module (guix derivations)
|
||||
#:use-module (guix profiles)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix monads)
|
||||
#:use-module (guix grafts)
|
||||
#:use-module (guix tests)
|
||||
|
@ -37,8 +38,9 @@ (define %store
|
|||
|
||||
(define-syntax-rule (test-assertm name store exp)
|
||||
(test-assert name
|
||||
(run-with-store store exp
|
||||
#:guile-for-build (%guile-for-build))))
|
||||
(let ((guile (package-derivation store %bootstrap-guile)))
|
||||
(run-with-store store exp
|
||||
#:guile-for-build guile))))
|
||||
|
||||
(define %gzip-compressor
|
||||
;; Compressor that uses the bootstrap 'gzip'.
|
||||
|
@ -79,6 +81,53 @@ (define %tar-bootstrap %bootstrap-coreutils&co)
|
|||
(readlink "bin/Guile"))))))))
|
||||
(built-derivations (list check))))
|
||||
|
||||
;; The following test needs guile-sqlite3, libgcrypt, etc. as a consequence of
|
||||
;; commit c45477d2a1a651485feede20fe0f3d15aec48b39 and related changes. Thus,
|
||||
;; run it on the user's store, if it's available, on the grounds that these
|
||||
;; dependencies may be already there, or we can get substitutes or build them
|
||||
;; quite inexpensively; see <https://bugs.gnu.org/32184>.
|
||||
|
||||
(with-external-store store
|
||||
(unless store (test-skip 1))
|
||||
(test-assertm "docker-image + localstatedir" store
|
||||
(mlet* %store-monad
|
||||
((guile (set-guile-for-build (default-guile)))
|
||||
(profile (profile-derivation (packages->manifest
|
||||
(list %bootstrap-guile))
|
||||
#:hooks '()
|
||||
#:locales? #f))
|
||||
(tarball (docker-image "docker-pack" profile
|
||||
#:symlinks '(("/bin/Guile" -> "bin/guile"))
|
||||
#:localstatedir? #t))
|
||||
(check (gexp->derivation
|
||||
"check-tarball"
|
||||
(with-imported-modules '((guix build utils))
|
||||
#~(begin
|
||||
(use-modules (guix build utils)
|
||||
(ice-9 match))
|
||||
|
||||
(define bin
|
||||
(string-append "." #$profile "/bin"))
|
||||
|
||||
(setenv "PATH" (string-append #$%tar-bootstrap "/bin"))
|
||||
(mkdir "base")
|
||||
(with-directory-excursion "base"
|
||||
(invoke "tar" "xvf" #$tarball))
|
||||
|
||||
(match (find-files "base" "layer.tar")
|
||||
((layer)
|
||||
(invoke "tar" "xvf" layer)))
|
||||
|
||||
(when
|
||||
(and (file-exists? (string-append bin "/guile"))
|
||||
(file-exists? "var/guix/db/db.sqlite")
|
||||
(string=? (string-append #$%bootstrap-guile "/bin")
|
||||
(pk 'binlink (readlink bin)))
|
||||
(string=? (string-append #$profile "/bin/guile")
|
||||
(pk 'guilelink (readlink "bin/Guile"))))
|
||||
(mkdir #$output)))))))
|
||||
(built-derivations (list check)))))
|
||||
|
||||
(test-end)
|
||||
|
||||
;; Local Variables:
|
||||
|
|
Loading…
Reference in a new issue