How to archive and load archived container images using Podman

How to archive and load archived container images using Podman

Test Environment –

Fedora 32 installed
Podman installed

Podman provides two command line utilities (ie. save and load).

The ‘save’ utility helps in capturing an image and converting into a tar archival format and store locally. This tar archivial format encapsulates all the layers of the image. The ‘load’ utility helps in loading the tar archive format of the image available locally into the container system so that it can be further used to launch containers from the image that we just loaded using this utility.

Developer often work on preparing their images and publish them onto the Container Registry. But if you want to share it with your team members you can just share the archive format of the image by ssh or any similar tool. This will help the other team members to directly get the image and instantiate a container out of it which will not go downloading the base image and other layers of the image from the registry as in the case of pulling an image for the first time from the registry.

In this article we will look at how we can archive a container image in a tar format which will encapsulate the image layers consisting of file system and how we can load that archived image back into the container system and use it with Podman. If you are interested in watching the video. Here is the youtube video on the same step by step procedure.

Procedure –

Step1: Pull an image

Here in the first steps let try to pull the official httpd image from DockerHub registry. We will use this image to archive and load in further steps below. As you can see from the pull command it actually writes some set of blob’s which are called Binary link Objects referring to different layers of the httpd image.

Pull httpd image from DockerHub
[admin@fed32 test]$ podman pull
Trying to pull
Getting image source signatures
Copying blob 6ec7b7d162b2 done  
Copying blob 81d0a34533d4 done  
Copying blob da240d12a8a4 done  
Copying blob 130aad5bf43a done  
Copying blob 17e233bac21e done  
Copying config dd85cdbb99 done  
Writing manifest to image destination
Storing signatures

You can verify the pulled image by listing the images available on the system as shown below.

Verify the pulled httpd image
[admin@fed32 test]$ podman images
REPOSITORY                 TAG     IMAGE ID      CREATED        SIZE    latest  dd85cdbb9987  2 weeks ago    142 MB

Step2: Start the container from the image and validate the URL

You can launch a container from the httpd image as shown below to verify its working as expected

Launch the httpd instance and verify the url
[admin@fed32 ~]$ podman run -d -p 8888:80

URL - http://localhost:8888/

Once verified stop the container

Step3: Save the image as tar file

Save the image in tar format
[admin@fed32 test]$ podman save dd85cdbb9987 > dockerhttpd.tar
Copying blob 87c8a1d8f54f done  
Copying blob d6e97adfe450 done  
Copying blob 53c77568e9ed done  
Copying blob 5792ac1517fc done  
Copying blob bf4cb6a71436 done  
Copying config dd85cdbb99 done  
Writing manifest to image destination
Storing signatures
[admin@fed32 test]$ 

[admin@fed32 test]$ ls -ltr dockerhttpd.tar 
-rw-rw-r--. 1 admin admin 141524480 Dec 31 04:13 dockerhttpd.tar

Here in this step it actually encapsulates all the layers of the images as shown below.

Verify the tar format content
[admin@fed32 test]$ tar -tvf dockerhttpd.tar 
-r--r--r-- 0/0        72498176 1970-01-01 05:30 87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9.tar
-r--r--r-- 0/0            2560 1970-01-01 05:30 d6e97adfe4509ea7104b9bcc527088b7d962ebf9bbb736149e980028b13f8ca3.tar
-r--r--r-- 0/0         7475200 1970-01-01 05:30 53c77568e9edf02931a4c3e170ef6fdc375b7b9544c019b183261dd60214c456.tar
-r--r--r-- 0/0        61515264 1970-01-01 05:30 5792ac1517fcd8981736f25455bf0b765b104bf3927610893682f48e9de1c283.tar
-r--r--r-- 0/0            3584 1970-01-01 05:30 bf4cb6a71436c83b25336a90d943a7d6ab655b97a7ccbf44f5afb07fc538813f.tar
-r--r--r-- 0/0            8706 1970-01-01 05:30 dd85cdbb99877b73f0de2053f225af590ab188d79469eebdb23ec2d26d0d10e8.json
l--------- 0/0               0 1970-01-01 05:30 7e3e87b6c660de3387f47156f1a058d7c5db0a71f4464bacb0cde4c9f80bbd7f/layer.tar -> ../87c8a1d8f54f3aa4e05569e8919397b65056aa71cdf48b7f061432c98475eee9.tar

These layers are retrived from the local storage of the image when we initially pulled the image. You can find the location of the image layers storage from the podman info command as shown below. As i am running with non root user these image layers are stored under my home directory ‘/home/admin/.local/share/containers/storage’.

Check the image storage location with podman info
[admin@fed32 archive]$ podman info | grep -i storage
  configFile: /home/admin/.config/containers/storage.conf
  graphRoot: /home/admin/.local/share/containers/storage
  volumePath: /home/admin/.local/share/containers/storage/volumes

Now that we tar’ed the pulled image, lets remove the httpd image that we pulled from the dockehub in the first step.

Remove the DockerHub pulled image
[admin@fed32 test]$ podman rmi dd85cdbb9987

Step4: Load the container tar file as image

Here in this step we will try to load the tar archive image with tag loadedhttpd:latest. Once loaded in the list of images we should be able to see the new loaded image locally available for use.

Load the tar archived image and verify the image list
[admin@fed32 test]$ podman load < dockerhttpd.tar loadedhttpd

[admin@fed32 test]$ podman images
REPOSITORY                 TAG     IMAGE ID      CREATED        SIZE
localhost/loadedhttpd      latest  dd85cdbb9987  2 weeks ago    142 MB

Step5: Start the container from the new image

Lets use the new local image and start the httpd container and you can validate the url of the httpd instance

Start the container from loaded image and verify the url
[admin@fed32 test]$ podman run -d -p 8888:80 dd85cdbb9987

URL - URL - http://localhost:8888/

Hope you enjoyed reading this article. Thank you..