@@ -63,6 +63,31 @@ func padString(str string, size int) string {
6363 }
6464}
6565
66+ // OciExportRootFs pulls an image from a registry
67+ func OciPullImage (imageName string ) error {
68+ pt , err := prometheus .NewPrometheus (
69+ "/var/lib/abroot/storage" ,
70+ "overlay" ,
71+ settings .Cnf .MaxParallelDownloads ,
72+ )
73+ if err != nil {
74+ PrintVerboseErr ("OciPullImage" , 0 , err )
75+ return err
76+ }
77+
78+ if strings .HasPrefix (imageName , "localhost/" ) {
79+ return nil
80+ }
81+
82+ err = pullImageWithProgressbar (pt , "remoteimage" , imageName )
83+ if err != nil {
84+ PrintVerboseErr ("OciPullImage" , 1 , err )
85+ return err
86+ }
87+
88+ return nil
89+ }
90+
6691// OciExportRootFs generates a rootfs from an image recipe file
6792func OciExportRootFs (buildImageName string , imageRecipe * ImageRecipe , transDir string , dest string ) error {
6893 PrintVerboseInfo ("OciExportRootFs" , "running..." )
@@ -111,32 +136,16 @@ func OciExportRootFs(buildImageName string, imageRecipe *ImageRecipe, transDir s
111136 return err
112137 }
113138
114- pulledImage := false
115- // pull image
116- if ! strings .HasPrefix (imageRecipe .From , "localhost/" ) {
117- err = pullImageWithProgressbar (pt , buildImageName , imageRecipe )
118- if err != nil {
119- PrintVerboseErr ("OciExportRootFs" , 6.1 , err )
120- return err
121- }
122- pulledImage = true
123- }
124-
125139 // build image
126140 imageBuild , err := pt .BuildContainerFile (imageRecipePath , buildImageName )
127141 if err != nil {
128142 PrintVerboseErr ("OciExportRootFs" , 7 , err )
129143 return err
130144 }
131145
132- if pulledImage {
133- // This is safe because BuildContainerFile layers on top of the base image
134- // So this won't delete the actual layers, only the image reference
135- _ , err = pt .Store .DeleteImage (imageRecipe .From , true )
136- if err != nil {
137- PrintVerboseWarn ("OciExportRootFs" , 7.5 , "could not delete downloaded image" , err )
138- }
139- }
146+ // This is safe because BuildContainerFile layers on top of the base image
147+ // So this won't delete the actual layers, only the image reference
148+ _ , _ = pt .Store .DeleteImage (imageRecipe .From , true )
140149
141150 // mount image
142151 mountDir , err := pt .MountImage (imageBuild .TopLayer )
@@ -214,7 +223,7 @@ func checkImageSize(imageDir string, filesystemMount string) error {
214223// and reports the download progress using pterm progressbars. Each blob has
215224// its own bar, similar to how docker and podman report downloads in their
216225// respective CLIs
217- func pullImageWithProgressbar (pt * prometheus.Prometheus , name string , image * ImageRecipe ) error {
226+ func pullImageWithProgressbar (pt * prometheus.Prometheus , name string , imageName string ) error {
218227 PrintVerboseInfo ("pullImageWithProgressbar" , "running..." )
219228
220229 progressCh := make (chan types.ProgressProperties )
@@ -225,7 +234,7 @@ func pullImageWithProgressbar(pt *prometheus.Prometheus, name string, image *Ima
225234 defer close (manifestCh )
226235 defer close (errorCh )
227236
228- err := pt .PullImageAsync (image . From , name , progressCh , manifestCh , errorCh )
237+ err := pt .PullImageAsync (imageName , name , progressCh , manifestCh , errorCh )
229238 if err != nil {
230239 PrintVerboseErr ("pullImageWithProgressbar" , 0 , err )
231240 return err
0 commit comments