66 "os"
77 "path/filepath"
88 "strings"
9+ "time"
910
1011 "chainguard.dev/apko/pkg/apk/fs"
1112 "github.com/Snakdy/container-build-engine/pkg/builder"
@@ -48,7 +49,8 @@ const (
4849 flagCacheDir = "cache-dir"
4950 flagPlatform = "platform"
5051
51- flagSkipCACerts = "skip-ca-certificates"
52+ flagSkipCACerts = "skip-ca-certificates"
53+ flagSkipPackageRecording = "skip-package-recording"
5254)
5355
5456const (
@@ -70,6 +72,7 @@ func init() {
7072 buildCmd .Flags ().String (flagPlatform , "linux/amd64" , "build platform" )
7173
7274 buildCmd .Flags ().Bool (flagSkipCACerts , false , "skip running update-ca-certificates" )
75+ buildCmd .Flags ().Bool (flagSkipPackageRecording , true , "skip package recording" )
7376
7477 _ = buildCmd .MarkFlagRequired (flagConfig )
7578 _ = buildCmd .MarkFlagFilename (flagConfig , ".yaml" , ".yml" )
@@ -142,19 +145,56 @@ func build(cmd *cobra.Command, _ []string) error {
142145 _ = os .Chdir (wd )
143146 log .Info ("updating working directory" , "dir" , wd )
144147
145- rootfs := fs .NewMemFS ()
148+ // figure out what the uid should be
149+ uid := cfg .Spec .User .Uid
150+ if uid <= 0 && forceUid > 0 && forceUid != defaultUid {
151+ uid = forceUid
152+ } else if uid <= 0 {
153+ uid = defaultUid
154+ }
155+
156+ log .Info ("preparing to build image" , "username" , username , "uid" , uid , "dirfs" , cfg .Spec .DirFS )
157+ var filesystem fs.FullFS
158+ if cfg .Spec .DirFS {
159+ tmpFs , err := os .MkdirTemp ("" , "container-build-engine-fs-*" )
160+ if err != nil {
161+ log .Error (err , "failed to setup tmpfs" )
162+ return err
163+ }
164+ filesystem = vfs .NewVFS (tmpFs )
165+ } else {
166+ filesystem = fs .NewMemFS ()
167+ }
146168 log .V (3 ).Info ("prepared root filesystem" )
147169
170+ baseImage := airutil .ExpandEnv (lockFile .Packages ["" ].Resolved )
171+ switch baseImage {
172+ case containers .MagicImageScratch :
173+ case "" :
174+ log .Info ("using scratch base as nothing was provided" )
175+ baseImage = containers .MagicImageScratch
176+ default :
177+ baseImage = airutil .ExpandEnv (cfg .Spec .From )
178+ }
179+
180+ // pull the base image
181+ pullStart := time .Now ()
182+ baseImg , err := containers .Get (cmd .Context (), baseImage )
183+ if err != nil {
184+ return err
185+ }
186+ log .Info ("pulled base image" , "duration" , time .Since (pullStart ))
187+
148188 dl , err := downloader .NewDownloader (cacheDir )
149189 if err != nil {
150190 return err
151191 }
152192
153- alpineKeeper , err := alpine .NewPackageKeeper (cmd .Context (), repoURLs (cfg .Spec .Repositories [strings .ToLower (string (aybv1 .PackageAlpine ))]), rootfs )
193+ alpineKeeper , err := alpine .NewPackageKeeper (cmd .Context (), repoURLs (cfg .Spec .Repositories [strings .ToLower (string (aybv1 .PackageAlpine ))]), filesystem , baseImg )
154194 if err != nil {
155195 return err
156196 }
157- debianKeeper , err := debian .NewPackageKeeper (cmd .Context (), repoURLs (cfg .Spec .Repositories [strings .ToLower (string (aybv1 .PackageDebian ))]))
197+ debianKeeper , err := debian .NewPackageKeeper (cmd .Context (), repoURLs (cfg .Spec .Repositories [strings .ToLower (string (aybv1 .PackageDebian ))]), filesystem , baseImg )
158198 if err != nil {
159199 return err
160200 }
@@ -197,21 +237,6 @@ func build(cmd *cobra.Command, _ []string) error {
197237 pkgDeps = append (pkgDeps , id )
198238 }
199239
200- baseImage := airutil .ExpandEnv (lockFile .Packages ["" ].Resolved )
201- switch baseImage {
202- case containers .MagicImageScratch :
203- case "" :
204- log .Info ("using scratch base as nothing was provided" )
205- baseImage = containers .MagicImageScratch
206- default :
207- baseImage = airutil .ExpandEnv (cfg .Spec .From )
208- }
209-
210- // pull the base image
211- baseImg , err := containers .Get (cmd .Context (), baseImage )
212- if err != nil {
213- return err
214- }
215240 imgCfg , err := baseImg .ConfigFile ()
216241 if err != nil {
217242 return err
@@ -300,7 +325,7 @@ func build(cmd *cobra.Command, _ []string) error {
300325
301326 // update ca certificates
302327 if ! skipCaCerts {
303- if err := cacertificates .UpdateCertificates (cmd .Context (), rootfs ); err != nil {
328+ if err := cacertificates .UpdateCertificates (cmd .Context (), filesystem ); err != nil {
304329 return err
305330 }
306331 }
@@ -310,28 +335,7 @@ func build(cmd *cobra.Command, _ []string) error {
310335 entrypoint = []string {"/bin/sh" }
311336 }
312337
313- // figure out what the uid should be
314- uid := cfg .Spec .User .Uid
315- if uid <= 0 && forceUid > 0 && forceUid != defaultUid {
316- uid = forceUid
317- } else if uid <= 0 {
318- uid = defaultUid
319- }
320-
321338 // package everything up as our final container image
322- log .Info ("preparing to build image" , "username" , username , "uid" , uid , "dirfs" , cfg .Spec .DirFS )
323- var filesystem fs.FullFS
324- if cfg .Spec .DirFS {
325- tmpFs , err := os .MkdirTemp ("" , "container-build-engine-fs-*" )
326- if err != nil {
327- log .Error (err , "failed to setup tmpfs" )
328- return err
329- }
330- filesystem = vfs .NewVFS (tmpFs )
331- } else {
332- filesystem = fs .NewMemFS ()
333- }
334-
335339 imageBuilder , err := builder .NewBuilder (cmd .Context (), baseImage , pipelineStatements , builder.Options {
336340 Username : username ,
337341 Uid : uid ,
0 commit comments