Chapter 4. Manage container images
Manage the container images on your system by using Podman and Skopeo. You can pull images from a registry, examine their contents, tag and publish them, move them between systems and registries, and remove images that you no longer need.
4.1. Choose between Podman, Skopeo, and Buildah for image tasks Copy linkLink copied to clipboard!
Podman, Skopeo, and Buildah each handle a different part of working with container images. Knowing which tool a task requires also tells you whether you must pull the image first.
Use the following tools for image tasks:
- Podman: manages images that are already in your local storage.
- Skopeo: works with images in a remote registry.
Buildah: builds container images.
The practical difference between Podman and Skopeo is where the image must be. Skopeo works directly against a remote registry, so you can inspect an image without downloading all of its layers, and you can copy an image between registries without pulling it. Podman works against your local storage, so you must pull an image before you can inspect, tag, save, or remove it.
| Task | Tool |
|---|---|
| Pull an image to local storage |
|
| List the images in local storage |
|
| Inspect an image in a remote registry, before you pull it |
|
| Inspect an image in local storage |
|
| Copy an image from one registry to another |
|
| Copy the layers of an image to a local directory |
|
| Add a name or a tag to an image in local storage |
|
| Push an image from local storage to a registry |
|
| Save an image to an archive, or load an image from an archive |
|
| Build an image |
|
| Remove an image from local storage |
|
4.2. Get container images onto your system Copy linkLink copied to clipboard!
Download container images from a registry to your local system by using the podman pull command. This makes the image available for creating and running containers. You can pull an image either by its fully qualified name or by a short-name alias.
Prerequisites
-
The
container-toolsmeta-package is installed.
Procedure
Optional: Log in to the registry. For example, to log in to
registry.redhat.io:$ podman login registry.redhat.ioUsername: <username> Password: <password> Login Succeeded!Pull an image by using its fully qualified name. For example, to pull the
registry.redhat.io/ubi10/ubiimage:$ podman pull registry.redhat.io/ubi10/ubiPull an image by its fully qualified name. While short names are convenient, there is increased risk of mistakenly getting the wrong container image. Which image is actually pulled is dependent on many factors, including if an image matching that name was pulled previously on the system. When you use short names, there is always an inherent risk of spoofing.
Optional: Pull an image by using a short-name alias.
If a matching alias is configured, Podman resolves the short name and pulls the image from the aliased registry:
$ podman pull fedoraResolved "fedora" as an alias (
/etc/containers/registries.conf.d/000-shortnames.conf).Trying to pull registry.fedoraproject.org/fedora:latest… ... Storing signatures ... The alias is found and the registry.fedoraproject.org/fedora image is securely pulled. The unqualified-search-registries list is not used to resolve the fedora image name.If no matching alias is found, you are prompted to choose one of the registries in the
unqualified-search-registrieslist:$ podman pull nginx? Please select an image: registry.access.redhat.com/nginx:latest registry.redhat.io/nginx:latest ▸ docker.io/library/nginx:latest ✔ docker.io/library/nginx:latest Trying to pull docker.io/library/nginx:latest… ... Storing signatures ...
- Once an image is pulled successfully by a short name, the system continues to pull that image by default and will not prompt you to select one.
Verification
List available images in local storage:
$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB registry.fedoraproject.org/fedora latest 28317703decd 12 days ago 184 MB docker.io/library/nginx latest 08b152afcfae 13 days ago 137 MBFor more information, see
podman-pull(1)man page on your system.
4.3. Find out what is inside an image Copy linkLink copied to clipboard!
Before you run a container, you can examine the image it is built from to understand what the image does and check what software is inside it. Use skopeo inspect to examine an image in a remote registry before you pull it, and podman inspect to examine an image that is already in your local storage.
To examine the image structure itself, copy its layers to a local directory, which lets you verify security compliance without deploying the container.
Prerequisites
-
The
container-toolsmeta-package is installed. - A pulled image is available on the local system.
Procedure
List all images in the local storage:
$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MBInspect an image in your local storage. For example, to inspect the
registry.redhat.io/ubi10/ubi image:$ podman inspect registry.redhat.io/ubi10/ubi… "Cmd": [ "/bin/bash" ], "Labels": { "architecture": "x86_64", "build-date": "2020-12-10T01:59:40.343735", "com.redhat.build-host": "cpt-1002.osbs.prod.upshift.rdu2.redhat.com", "com.redhat.component": "ubi10-container", "com.redhat.license_terms": "https://www.redhat.com/..., "description": "The Universal Base Image is ... } …The
podman inspectcommand displays information about containers and images identified by name or ID. TheCmdkey specifies a default command that will be executed in the container if there is not one specified in the run command line. You can override this command by specifying a command as an argument to thepodman runcommand.This
ubi10/ubicontainer runs the bash shell if no other argument is given when you start it withpodman run. If an Entrypoint key was set, its value can be used instead of theCmdvalue, and the value ofCmdis used as an argument to the Entrypoint command.Inspect an image in a remote registry, before you pull it. For example, to inspect the
registry.redhat.io/ubi10/ubi-initimage:$ skopeo inspect docker://registry.redhat.io/ubi10/ubi-init{ "Name": "registry.redhat.io/ubi10/ubi-init", "Digest": "sha256:c6d1e50ab...", "RepoTags": [ ... "latest" ], "Created": "2020-12-10T07:16:37.250312Z", "DockerVersion": "1.13.1", "Labels": { "architecture": "x86_64", "build-date": "2020-12-10T07:16:11.378348", "com.redhat.build-host": "cpt-1007.osbs.prod.upshift.rdu2.redhat.com", "com.redhat.component": "ubi10-init-container", "com.redhat.license_terms": "https://www.redhat.com/en/about/red-hat-end-user-license-agreements#UBI", "description": "The Universal Base Image Init is designed to run an init system as PID 1 for running multi-services inside a container ... } }Create the
/var/lib/images/nginxdirectory:$ mkdir -p /var/lib/images/nginxCopy the layers of the
docker://docker.io/nginx:latestimage to the newly created directory:$ skopeo copy docker://docker.io/nginx:latest dir:/var/lib/images/nginx
Verification
Display the content of the
/var/lib/images/nginxdirectory:$ ls /var/lib/images/nginx08b11a3d692c1a2e15ae840f2c15c18308dcb079aa5320e15d46b62015c0f6f3 ... 4fcb23e29ba19bf305d0d4b35412625fea51e82292ec7312f9be724cb6e31ffd manifest.json versionFor more information, see
podman-images(1)andskopeo-inspect(1)man pages on your system.
4.4. Tag and publish an image to a registry Copy linkLink copied to clipboard!
Assign additional names/tags to local images by using podman tag, and then share an image by pushing it to a registry with podman push. Tagging helps organize images and prepare them for pushing to specific registries, and pushing enables others to download and use your modified images.
Prerequisites
-
The
container-toolsmeta-package is installed. - A pulled image is available on the local system.
Procedure
Assign the
myubiname to theregistry.redhat.io/ubi10/ubiimage by using one of the following options:The image name:
$ podman tag registry.redhat.io/ubi10/ubi myubiThe image ID:
$ podman tag 3269c37eae33 myubiBoth commands give you the same result.
Add the 10 tag to the
registry.redhat.io/ubi10/ubiimage by using either:The image name:
$ podman tag registry.redhat.io/ubi10/ubi myubi:10The image ID:
$ podman tag 3269c37eae33 myubi:10Both commands give you the same result. If no version tag is specified after the
:, it defaults to thelatest.
- Optional: Add an additional name that includes the registry you want to push the image to: $ podman tag registry.redhat.io/ubi10/ubi registry.example.com:5000/ubi10/ubi
Push the
registry.example.com:5000/ubi10/ubiimage from your local storage to a registry: $ podman push registry.example.com:5000/ubi10/ubiImportantWhile there are few restrictions on how you use these images, there are some restrictions about how you can refer to them. For example, you cannot call those images Red Hat certified or Red Hat supported unless you certify it through the Red Hat Partner Connect Program (https://connect.redhat.com), either with Red Hat Container Certification or Red Hat OpenShift Operator Certification.
Verification
List all images:
$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB localhost/myubi latest 3269c37eae33 7 weeks ago 208 MB localhost/myubi 10 3269c37eae33 7 weeks ago 208 MBNotice that the default tag is the latest. You can see all the image names are assigned to the single image ID
3269c37eae33.After tagging the
registry.redhat.io/ubi10/ubiimage, you have three options to run the container:-
by ID (
3269c37eae33) -
by name (
localhost/myubi:latest) by name (
localhost/myubi:10)For more information, see
podman-tag(1)man page on your system.
-
by ID (
4.5. Copy an image from one registry to another Copy linkLink copied to clipboard!
You can use the skopeo copy command to copy a container image from one registry to another. For example, you can populate an internal repository with images from external registries, or sync image registries in two different locations.
Prerequisites
-
The
container-toolsmeta-package is installed.
Procedure
Copy the container image from
docker://quay.io to docker://registry.example.com:$ skopeo copy docker://quay.io/skopeo/stable:latest docker://registry.example.com/skopeo:latestRefer to
skopeo-copy(1)man page on your system for more information.
4.6. Save an image to an archive and loading it on another system Copy linkLink copied to clipboard!
Use the podman save command to save an image to a container archive. You can restore it later to another container environment or send it to someone else. Use the podman load command to load an image from the container image archive into the container storage.
You can use the --format option to specify the archive format. The default format is the docker-archive format. Other supported formats are:
-
oci-archive -
oci-dir(directory withocimanifest type) -
docker-dir
Prerequisites
-
The
container-toolsmeta-package is installed. - A pulled image is available on the local system.
Procedure
Save the
registry.redhat.io/rhel10/support-toolsimage as a tarball, in one of the following formats:In the default docker-archive format:
$ podman save -o mysupport-tools.tar registry.redhat.io/rhel10/support-tools:latestIn the oci-archive format, by using the
--formatoption:$ podman save -o mysupport-tools-oci.tar --format=oci-archive registry.redhat.io/rhel10/support-toolsThe
mysupport-tools.tarandmysupport-tools-oci.tararchives are stored in your current directory. The next steps are performed with the mysupport-tools.tar tarball.
Check the file type of
mysupport-tools.tar:$ file mysupport-tools.tar mysupport-tools.tar: POSIX tar archiveLoad the
registry.redhat.io/rhel10/support-tools:latestimage from themysupport-tools.tararchive:$ podman load -i mysupport-tools.tarLoaded image(s): registry.redhat.io/rhel10/support-tools:latestFor more information, see
podman-save(1)andpodman-load(1)man pages on your system.
4.7. Build multi-architecture images Copy linkLink copied to clipboard!
Build multi-architecture container images by using Podman on RHEL to ensure your applications run consistently across diverse hardware platforms. A single image manifest to support multiple architectures, without the requirement of unique builds for each environment.
Prerequisites
-
The
container-toolsmeta-package is installed.
Procedure
-
Create
Containerfilesfor each target architecture. Do one of the following:
Build images for each architecture. For example, this can be done in one command:
$ podman build --platform linux/arm64,linux/amd64 --manifest <registry>/<image>:<version> .-
The
--platform linux/arm64,linux/amd64option specifies the target platforms for which the container image is being built. -
The
--manifest <registry>/<image>option creates a manifest list with the specified name, that is<registry>/<image>, and adds the newly-built images to them.
-
The
Create the images separately and then add them to a manifest:
Create image:
$ podman build --platform linux/amd64 -t <registry>/<image>:<version> .$ podman build --platform linux/arm64 -t <registry>/<image>:<version> .Initialize an empty manifest list:
$ podman manifest create <registry>/<image>:<version>Add the platform images to the manifest list:
$ podman manifest add <registry>/<image>:<version> <registry>/<image>:<version>-amd64$ podman manifest add <registry>/<image>:<version> <registry>/<image>:<version>-arm64
Optional: Remove items from the manifest list by using the podman manifest remove <manifest_list> <digest_ID> command, where <digest_ID> is the SHA-256 checksum of the container image. For example:
$ podman manifest remove <registry>/<image> sha256:cb8a924afdf….
Push the manifest list to the registry:
$ podman manifest push <registry>/<image>:<version>
Verification
Display the manifest list:
$ podman manifest inspect <registry>/<image>Refer to the
podman-build(1)andpodman-manifest(1)man page on your system for more information.
4.8. Reclaim disk space used by images Copy linkLink copied to clipboard!
Delete unused container images from local storage by using the podman rmi command. Removing old images frees up disk space on your system.
Before you can remove an image, you must stop all containers running from that image by using the podman stop command. You can stop a container by its ID or name.
Prerequisites
-
The
container-toolsmeta-package is installed. - A pulled image is available on the local system.
Procedure
List all images on your local system:
$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZE registry.redhat.io/rhel10/support-tools latest 4b32d14201de 7 weeks ago 228 MB registry.redhat.io/ubi10/ubi latest 3269c37eae33 7 weeks ago 208 MB localhost/myubi X.Y 3269c37eae33 7 weeks ago 208 MBList all containers:
$ podman ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ccd6001166e registry.redhat.io/rhel10/support-tools:latest usr/bin/bash 6 seconds ago Up 5 seconds ago my-support-toolsStop the my-support-tools container:
$ podman stop my-support-tools7ccd6001166e9720c47fbeb077e0afd0bb635e74a1b0ede3fd34d09eaf5a52e9Remove stopped containers that reference the image. For each image using the image to be removed, remove it with the command:
$ podman rm <container name|container id>If you do not remove the containers, you can still remove the image by forcing the removal. See next step.
Do one of the following:
Remove the registry.redhat.io/rhel10/support-tools image:
$ podman rmi registry.redhat.io/rhel10/support-toolsIf there are still containers referencing the image, even if not running, it will generate an error. You can force the removal (as well as all containers linked to the image) with:
$ podman rmi -f registry.redhat.io/rhel10/support-toolsTo remove multiple images:
$ podman rmi registry.redhat.io/rhel10/support-tools \ registry.redhat.io/ubi10/ubiTo remove all images from your system:
$ podman rmi -aTo remove images that have multiple names (tags) associated with them, add the -f option to remove them:
$ podman rmi -f 1de7d7b3f531 1de7d7b3f531...
Verification
List all images to verify that container images were removed:
$ podman imagesFor more information, see
podman-rmi(1)man page on your system.