Chapter 3. Mirroring in disconnected environments 3.1. About disconnected installation mirroring You can use a mirror registry to ensure that your clusters only use container images that satisfy your organizational controls on external content. Before you install a cluster on infrastructure that you provision in a restricted network, you must mirror the required container images into that environment. To mirror container images, you must have a registry for mirroring. 3.1.1. Creating a mirror registry If you already have a container image registry, such as Red Hat Quay, you can use it as your mirror registry. If you do not already have a registry, you can create a mirror registry using the mirror registry for Red Hat OpenShift . 3.1.2. Mirroring images for a disconnected installation You can use one of the following procedures to mirror your OpenShift Container Platform image repository to your mirror registry: Mirroring images for a disconnected installation by using the oc adm command Mirroring images for a disconnected installation by using the oc-mirror plugin v2 3.2. Creating a mirror registry with mirror registry for Red Hat OpenShift The mirror registry for Red Hat OpenShift is a small and streamlined container registry that you can use as a target for mirroring the required container images of OpenShift Container Platform for disconnected installations. If you already have a container image registry, such as Red Hat Quay, you can skip this section and go straight to Mirroring the OpenShift Container Platform image repository . 3.2.1. Prerequisites An OpenShift Container Platform subscription. Red Hat Enterprise Linux (RHEL) 8 and 9 with Podman 3.4.2 or later and OpenSSL installed. Fully qualified domain name for the Red Hat Quay service, which must resolve through a DNS server. Key-based SSH connectivity on the target host. SSH keys are automatically generated for local installs. For remote hosts, you must generate your own SSH keys. 2 or more vCPUs. 8 GB of RAM. About 12 GB for OpenShift Container Platform 4.18 release images, or about 358 GB for OpenShift Container Platform 4.18 release images and OpenShift Container Platform 4.18 Red Hat Operator images. Up to 1 TB per stream or more is suggested. Important These requirements are based on local testing results with only release images and Operator images. Storage requirements can vary based on your organization's needs. You might require more space, for example, when you mirror multiple z-streams. You can use standard Red Hat Quay functionality or the proper API callout to remove unnecessary images and free up space. 3.2.2. Mirror registry for Red Hat OpenShift introduction For disconnected deployments of OpenShift Container Platform, a container registry is required to carry out the installation of the clusters. To run a production-grade registry service on such a cluster, you must create a separate registry deployment to install the first cluster. The mirror registry for Red Hat OpenShift addresses this need and is included in every OpenShift subscription. It is available for download on the OpenShift console Downloads page. The mirror registry for Red Hat OpenShift allows users to install a small-scale version of Red Hat Quay and its required components using the mirror-registry command line interface (CLI) tool. The mirror registry for Red Hat OpenShift is deployed automatically with preconfigured local storage and a local database. It also includes auto-generated user credentials and access permissions with a single set of inputs and no additional configuration choices to get started. The mirror registry for Red Hat OpenShift provides a pre-determined network configuration and reports deployed component credentials and access URLs upon success. A limited set of optional configuration inputs like fully qualified domain name (FQDN) services, superuser name and password, and custom TLS certificates are also provided. This provides users with a container registry so that they can easily create an offline mirror of all OpenShift Container Platform release content when running OpenShift Container Platform in restricted network environments. Use of the mirror registry for Red Hat OpenShift is optional if another container registry is already available in the install environment. 3.2.2.1. Mirror registry for Red Hat OpenShift limitations The following limitations apply to the mirror registry for Red Hat OpenShift : The mirror registry for Red Hat OpenShift is not a highly-available registry and only local file system storage is supported. It is not intended to replace Red Hat Quay or the internal image registry for OpenShift Container Platform. The mirror registry for Red Hat OpenShift is not intended to be a substitute for a production deployment of Red Hat Quay. The mirror registry for Red Hat OpenShift is only supported for hosting images that are required to install a disconnected OpenShift Container Platform cluster, such as Release images or Red Hat Operator images. It uses local storage on your Red Hat Enterprise Linux (RHEL) machine, and storage supported by RHEL is supported by the mirror registry for Red Hat OpenShift . Note Because the mirror registry for Red Hat OpenShift uses local storage, you should remain aware of the storage usage consumed when mirroring images and use Red Hat Quay's garbage collection feature to mitigate potential issues. For more information about this feature, see "Red Hat Quay garbage collection". Support for Red Hat product images that are pushed to the mirror registry for Red Hat OpenShift for bootstrapping purposes are covered by valid subscriptions for each respective product. A list of exceptions to further enable the bootstrap experience can be found on the Self-managed Red Hat OpenShift sizing and subscription guide . Content built by customers should not be hosted by the mirror registry for Red Hat OpenShift . Using the mirror registry for Red Hat OpenShift with more than one cluster is discouraged because multiple clusters can create a single point of failure when updating your cluster fleet. It is advised to leverage the mirror registry for Red Hat OpenShift to install a cluster that can host a production-grade, highly-available registry such as Red Hat Quay, which can serve OpenShift Container Platform content to other clusters. 3.2.3. Mirroring on a local host with mirror registry for Red Hat OpenShift This procedure explains how to install the mirror registry for Red Hat OpenShift on a local host using the mirror-registry installer tool. By doing so, users can create a local host registry running on port 443 for the purpose of storing a mirror of OpenShift Container Platform images. Note Installing the mirror registry for Red Hat OpenShift using the mirror-registry CLI tool makes several changes to your machine. After installation, a USDHOME/quay-install directory is created, which has installation files, local storage, and the configuration bundle. Trusted SSH keys are generated in case the deployment target is the local host, and systemd files on the host machine are set up to ensure that container runtimes are persistent. Additionally, an initial user named init is created with an automatically generated password. All access credentials are printed at the end of the install routine. Procedure Download the mirror-registry.tar.gz package for the latest version of the mirror registry for Red Hat OpenShift found on the OpenShift console Downloads page. Install the mirror registry for Red Hat OpenShift on your local host with your current user account by using the mirror-registry tool. For a full list of available flags, see "mirror registry for Red Hat OpenShift flags". USD ./mirror-registry install \ --quayHostname <host_example_com> \ --quayRoot <example_directory_name> Use the user name and password generated during installation to log into the registry by running the following command: USD podman login -u init \ -p <password> \ <host_example_com>:8443> \ --tls-verify=false 1 1 You can avoid running --tls-verify=false by configuring your system to trust the generated rootCA certificates. See "Using SSL to protect connections to Red Hat Quay" and "Configuring the system to trust the certificate authority" for more information. Note You can also log in by accessing the UI at https://<host.example.com>:8443 after installation. You can mirror OpenShift Container Platform images after logging in. Depending on your needs, see either the "Mirroring the OpenShift Container Platform image repository" or the "Mirroring Operator catalogs for use with disconnected clusters" sections of this document. Note If there are issues with images stored by the mirror registry for Red Hat OpenShift due to storage layer problems, you can remirror the OpenShift Container Platform images, or reinstall mirror registry on more stable storage. 3.2.4. Updating mirror registry for Red Hat OpenShift from a local host This procedure explains how to update the mirror registry for Red Hat OpenShift from a local host using the upgrade command. Updating to the latest version ensures new features, bug fixes, and security vulnerability fixes. Important When upgrading from version 1 to version 2, be aware of the following constraints: The worker count is set to 1 because multiple writes are not allowed in SQLite. You must not use the mirror registry for Red Hat OpenShift user interface (UP). Do not access the sqlite-storage Podman volume during the upgrade. There is intermittent downtime of your mirror registry because it is restarted during the upgrade process. PostgreSQL data is backed up under the /USDHOME/quay-instal/quay-postgres-backup/ directory for recovery. Prerequisites You have installed the mirror registry for Red Hat OpenShift on a local host. Procedure If you are upgrading the mirror registry for Red Hat OpenShift from 1.3 2.y, and your installation directory is the default at /etc/quay-install , you can enter the following command: USD sudo ./mirror-registry upgrade -v Note mirror registry for Red Hat OpenShift migrates Podman volumes for Quay storage, Postgres data, and /etc/quay-install data to the new USDHOME/quay-install location. This allows you to use mirror registry for Red Hat OpenShift without the --quayRoot flag during future upgrades. Users who upgrade mirror registry for Red Hat OpenShift with the ./mirror-registry upgrade -v flag must include the same credentials used when creating their mirror registry. For example, if you installed the mirror registry for Red Hat OpenShift with --quayHostname <host_example_com> and --quayRoot <example_directory_name> , you must include that string to properly upgrade the mirror registry. If you are upgrading the mirror registry for Red Hat OpenShift from 1.3 2.y and you used a custom quay configuration and storage directory in your 1.y deployment, you must pass in the --quayRoot and --quayStorage flags. For example: USD sudo ./mirror-registry upgrade --quayHostname <host_example_com> --quayRoot <example_directory_name> --quayStorage <example_directory_name>/quay-storage -v If you are upgrading the mirror registry for Red Hat OpenShift from 1.3 2.y and want to specify a custom SQLite storage path, you must pass in the --sqliteStorage flag, for example: USD sudo ./mirror-registry upgrade --sqliteStorage <example_directory_name>/sqlite-storage -v 3.2.5. Mirroring on a remote host with mirror registry for Red Hat OpenShift This procedure explains how to install the mirror registry for Red Hat OpenShift on a remote host using the mirror-registry tool. By doing so, users can create a registry to hold a mirror of OpenShift Container Platform images. Note Installing the mirror registry for Red Hat OpenShift using the mirror-registry CLI tool makes several changes to your machine. After installation, a USDHOME/quay-install directory is created, which has installation files, local storage, and the configuration bundle. Trusted SSH keys are generated in case the deployment target is the local host, and systemd files on the host machine are set up to ensure that container runtimes are persistent. Additionally, an initial user named init is created with an automatically generated password. All access credentials are printed at the end of the install routine. Procedure Download the mirror-registry.tar.gz package for the latest version of the mirror registry for Red Hat OpenShift found on the OpenShift console Downloads page. Install the mirror registry for Red Hat OpenShift on your local host with your current user account by using the mirror-registry tool. For a full list of available flags, see "mirror registry for Red Hat OpenShift flags". USD ./mirror-registry install -v \ --targetHostname <host_example_com> \ --targetUsername <example_user> \ -k ~/.ssh/my_ssh_key \ --quayHostname <host_example_com> \ --quayRoot <example_directory_name> Use the user name and password generated during installation to log into the mirror registry by running the following command: USD podman login -u init \ -p <password> \ <host_example_com>:8443> \ --tls-verify=false 1 1 You can avoid running --tls-verify=false by configuring your system to trust the generated rootCA certificates. See "Using SSL to protect connections to Red Hat Quay" and "Configuring the system to trust the certificate authority" for more information. Note You can also log in by accessing the UI at https://<host.example.com>:8443 after installation. You can mirror OpenShift Container Platform images after logging in. Depending on your needs, see either the "Mirroring the OpenShift Container Platform image repository" or the "Mirroring Operator catalogs for use with disconnected clusters" sections of this document. Note If there are issues with images stored by the mirror registry for Red Hat OpenShift due to storage layer problems, you can remirror the OpenShift Container Platform images, or reinstall mirror registry on more stable storage. 3.2.6. Updating mirror registry for Red Hat OpenShift from a remote host This procedure explains how to update the mirror registry for Red Hat OpenShift from a remote host using the upgrade command. Updating to the latest version ensures bug fixes and security vulnerability fixes. Important When upgrading from version 1 to version 2, be aware of the following constraints: The worker count is set to 1 because multiple writes are not allowed in SQLite. You must not use the mirror registry for Red Hat OpenShift user interface (UP). Do not access the sqlite-storage Podman volume during the upgrade. There is intermittent downtime of your mirror registry because it is restarted during the upgrade process. PostgreSQL data is backed up under the /USDHOME/quay-instal/quay-postgres-backup/ directory for recovery. Prerequisites You have installed the mirror registry for Red Hat OpenShift on a remote host. Procedure To upgrade the mirror registry for Red Hat OpenShift from a remote host, enter the following command: USD ./mirror-registry upgrade -v --targetHostname <remote_host_url> --targetUsername <user_name> -k ~/.ssh/my_ssh_key Note Users who upgrade the mirror registry for Red Hat OpenShift with the ./mirror-registry upgrade -v flag must include the same credentials used when creating their mirror registry. For example, if you installed the mirror registry for Red Hat OpenShift with --quayHostname <host_example_com> and --quayRoot <example_directory_name> , you must include that string to properly upgrade the mirror registry. If you are upgrading the mirror registry for Red Hat OpenShift from 1.3 2.y and want to specify a custom SQLite storage path, you must pass in the --sqliteStorage flag, for example: USD ./mirror-registry upgrade -v --targetHostname <remote_host_url> --targetUsername <user_name> -k ~/.ssh/my_ssh_key --sqliteStorage <example_directory_name>/quay-storage 3.2.7. Replacing mirror registry for Red Hat OpenShift SSL/TLS certificates In some cases, you might want to update your SSL/TLS certificates for the mirror registry for Red Hat OpenShift . This is useful in the following scenarios: If you are replacing the current mirror registry for Red Hat OpenShift certificate. If you are using the same certificate as the mirror registry for Red Hat OpenShift installation. If you are periodically updating the mirror registry for Red Hat OpenShift certificate. Use the following procedure to replace mirror registry for Red Hat OpenShift SSL/TLS certificates. Prerequisites You have downloaded the ./mirror-registry binary from the OpenShift console Downloads page. Procedure Enter the following command to install the mirror registry for Red Hat OpenShift : USD ./mirror-registry install \ --quayHostname <host_example_com> \ --quayRoot <example_directory_name> This installs the mirror registry for Red Hat OpenShift to the USDHOME/quay-install directory. Prepare a new certificate authority (CA) bundle and generate new ssl.key and ssl.crt key files. For more information, see Using SSL/TLS to protect connections to Red Hat Quay . Assign /USDHOME/quay-install an environment variable, for example, QUAY , by entering the following command: USD export QUAY=/USDHOME/quay-install Copy the new ssl.crt file to the /USDHOME/quay-install directory by entering the following command: USD cp ~/ssl.crt USDQUAY/quay-config Copy the new ssl.key file to the /USDHOME/quay-install directory by entering the following command: USD cp ~/ssl.key USDQUAY/quay-config Restart the quay-app application pod by entering the following command: USD systemctl --user restart quay-app 3.2.8. Uninstalling the mirror registry for Red Hat OpenShift You can uninstall the mirror registry for Red Hat OpenShift from your local host by running the following command: USD ./mirror-registry uninstall -v \ --quayRoot <example_directory_name> Note Deleting the mirror registry for Red Hat OpenShift will prompt the user before deletion. You can use --autoApprove to skip this prompt. Users who install the mirror registry for Red Hat OpenShift with the --quayRoot flag must include the --quayRoot flag when uninstalling. For example, if you installed the mirror registry for Red Hat OpenShift with --quayRoot example_directory_name , you must include that string to properly uninstall the mirror registry. 3.2.9. Mirror registry for Red Hat OpenShift flags The following flags are available for the mirror registry for Red Hat OpenShift : Flags Description --autoApprove A boolean value that disables interactive prompts. If set to true , the quayRoot directory is automatically deleted when uninstalling the mirror registry. Defaults to false if left unspecified. --initPassword The password of the init user created during Quay installation. Must be at least eight characters and contain no whitespace. --initUser string Shows the username of the initial user. Defaults to init if left unspecified. --no-color , -c Allows users to disable color sequences and propagate that to Ansible when running install, uninstall, and upgrade commands. --quayHostname The fully-qualified domain name of the mirror registry that clients will use to contact the registry. Equivalent to SERVER_HOSTNAME in the Quay config.yaml . Must resolve by DNS. Defaults to <targetHostname>:8443 if left unspecified. [1] --quayStorage The folder where Quay persistent storage data is saved. Defaults to the quay-storage Podman volume. Root privileges are required to uninstall. --quayRoot , -r The directory where container image layer and configuration data is saved, including rootCA.key , rootCA.pem , and rootCA.srl certificates. Defaults to USDHOME/quay-install if left unspecified. --sqliteStorage The folder where SQLite database data is saved. Defaults to sqlite-storage Podman volume if not specified. Root is required to uninstall. --ssh-key , -k The path of your SSH identity key. Defaults to ~/.ssh/quay_installer if left unspecified. --sslCert The path to the SSL/TLS public key / certificate. Defaults to {quayRoot}/quay-config and is auto-generated if left unspecified. --sslCheckSkip Skips the check for the certificate hostname against the SERVER_HOSTNAME in the config.yaml file. [2] --sslKey The path to the SSL/TLS private key used for HTTPS communication. Defaults to {quayRoot}/quay-config and is auto-generated if left unspecified. --targetHostname , -H The hostname of the target you want to install Quay to. Defaults to USDHOST , for example, a local host, if left unspecified. --targetUsername , -u The user on the target host which will be used for SSH. Defaults to USDUSER , for example, the current user if left unspecified. --verbose , -v Shows debug logs and Ansible playbook outputs. --version Shows the version for the mirror registry for Red Hat OpenShift . --quayHostname must be modified if the public DNS name of your system is different from the local hostname. Additionally, the --quayHostname flag does not support installation with an IP address. Installation with a hostname is required. --sslCheckSkip is used in cases when the mirror registry is set behind a proxy and the exposed hostname is different from the internal Quay hostname. It can also be used when users do not want the certificates to be validated against the provided Quay hostname during installation. 3.2.10. Mirror registry for Red Hat OpenShift release notes The mirror registry for Red Hat OpenShift is a small and streamlined container registry that you can use as a target for mirroring the required container images of OpenShift Container Platform for disconnected installations. These release notes track the development of the mirror registry for Red Hat OpenShift in OpenShift Container Platform. 3.2.10.1. Mirror registry for Red Hat OpenShift 2.0 release notes The following sections provide details for each 2.0 release of the mirror registry for Red Hat OpenShift. 3.2.10.1.1. Mirror registry for Red Hat OpenShift 2.0.5 Issued: 13 January 2025 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.5. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2025:0298 - mirror registry for Red Hat OpenShift 2.0.5 3.2.10.1.2. Mirror registry for Red Hat OpenShift 2.0.4 Issued: 06 January 2025 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.4. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2025:0033 - mirror registry for Red Hat OpenShift 2.0.4 3.2.10.1.3. Mirror registry for Red Hat OpenShift 2.0.3 Issued: 25 November 2024 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.3. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2024:10181 - mirror registry for Red Hat OpenShift 2.0.3 3.2.10.1.4. Mirror registry for Red Hat OpenShift 2.0.2 Issued: 31 October 2024 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.2. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2024:8370 - mirror registry for Red Hat OpenShift 2.0.2 3.2.10.1.5. Mirror registry for Red Hat OpenShift 2.0.1 Issued: 26 September 2024 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.1. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2024:7070 - mirror registry for Red Hat OpenShift 2.0.1 3.2.10.1.6. Mirror registry for Red Hat OpenShift 2.0.0 Issued: 03 September 2024 Mirror registry for Red Hat OpenShift is now available with Red Hat Quay 3.12.0. The following advisory is available for the mirror registry for Red Hat OpenShift : RHBA-2024:5277 - mirror registry for Red Hat OpenShift 2.0.0 3.2.10.1.6.1. New features With the release of mirror registry for Red Hat OpenShift , the internal database has been upgraded from PostgreSQL to SQLite. As a result, data is now stored on the sqlite-storage Podman volume by default, and the overall tarball size is reduced by 300 MB. New installations use SQLite by default. Before upgrading to version 2.0, see "Updating mirror registry for Red Hat OpenShift from a local host" or "Updating mirror registry for Red Hat OpenShift from a remote host" depending on your environment. A new feature flag, --sqliteStorage has been added. With this flag, you can manually set the location where SQLite database data is saved. Mirror registry for Red Hat OpenShift is now available on IBM Power and IBM Z architectures ( s390x and ppc64le ). 3.2.10.2. Mirror registry for Red Hat OpenShift 1.3 release notes To view the mirror registry for Red Hat OpenShift 1.3 release notes, see Mirror registry for Red Hat OpenShift 1.3 release notes . 3.2.10.3. Mirror registry for Red Hat OpenShift 1.2 release notes To view the mirror registry for Red Hat OpenShift 1.2 release notes, see Mirror registry for Red Hat OpenShift 1.2 release notes . 3.2.10.4. Mirror registry for Red Hat OpenShift 1.1 release notes To view the mirror registry for Red Hat OpenShift 1.1 release notes, see Mirror registry for Red Hat OpenShift 1.1 release notes . 3.2.11. Troubleshooting mirror registry for Red Hat OpenShift To assist in troubleshooting mirror registry for Red Hat OpenShift , you can gather logs of systemd services installed by the mirror registry. The following services are installed: quay-app.service quay-postgres.service quay-redis.service quay-pod.service Prerequisites You have installed mirror registry for Red Hat OpenShift . Procedure If you installed mirror registry for Red Hat OpenShift with root privileges, you can get the status information of its systemd services by entering the following command: USD sudo systemctl status <service> If you installed mirror registry for Red Hat OpenShift as a standard user, you can get the status information of its systemd services by entering the following command: USD systemctl --user status <service> 3.2.12. Additional resources Red Hat Quay garbage collection Using SSL to protect connections to Red Hat Quay Configuring the system to trust the certificate authority Mirroring the OpenShift Container Platform image repository Mirroring Operator catalogs for use with disconnected clusters 3.3. Mirroring images for a disconnected installation by using the oc-mirror plugin v2 You can run your cluster in a disconnected environment if you install the cluster from a mirrored set of OpenShift Container Platform container images in a private registry. This registry must be running whenever your cluster is running. You can use oc-mirror plugin v2 to mirror images to a mirror registry in your fully or partially disconnected environments. To download the required images from the official Red Hat registries, you must run oc-mirror plugin v2 from a system with internet connectivity. 3.3.1. About oc-mirror plugin v2 The oc-mirror OpenShift CLI ( oc ) plugin is a single tool that mirrors all required OpenShift Container Platform content and other images to your mirror registry. To use the new version of oc-mirror, add the --v2 flag to the oc-mirror plugin v2 command line. oc-mirror plugin v2 has the following features: Provides a centralized method to mirror OpenShift Container Platform releases, Operators, helm charts, and other images. Verifies that the complete image set specified in the image set configuration file is mirrored to the mirrored registry, regardless of whether the images were previously mirrored or not. Uses a cache system instead of metadata, which prevents the need to start the mirroring process over in the case of a failure for a single step of the process. Maintains minimal archive sizes by incorporating only new images into the archive. Generates mirroring archives with content selected by mirroring date. Can generate ImageDigestMirrorSet (IDMS) and ImageTagMirrorSet (ITMS) resources, which cover the full image set, instead of an ImageContentSourcePolicy (ICSP) resource, which only covered incremental changes to the image set for each mirroring operation with v1. Does not perform automatic pruning. v2 now uses a Delete feature, which grants users more control over deleting images. Introduces support for registries.conf files. This change facilitates mirroring to multiple enclaves while using the same cache. 3.3.1.1. High level workflow The following steps outline the high-level workflow on how to use the oc-mirror plugin v2 to mirror images to a mirror registry: Create an image set configuration file. Mirror the image set to the target mirror registry by using one of the following workflows: Mirror an image set directly to the target mirror registry (mirror to mirror). Mirror an image set to disk (mirror to disk), transfer the tar file to the target environment, then mirror the image set to the target mirror registry (disk to mirror). Configure your cluster to use the resources generated by the oc-mirror plugin v2. Repeat these steps to update your target mirror registry as necessary. 3.3.1.2. oc-mirror plugin v2 compatibility and support The oc-mirror plugin v2 is supported for OpenShift Container Platform. Note On aarch64 , ppc64le , and s390x architectures the oc-mirror plugin v2 is supported only for OpenShift Container Platform 4.14 and later. Use the latest available version of the oc-mirror plugin v2 regardless of which versions of OpenShift Container Platform you need to mirror. 3.3.2. Prerequisites You must have a container image registry that supports Docker V2-2 in the location that hosts the OpenShift Container Platform cluster, such as Red Hat Quay. Note If you use Red Hat Quay, use version 3.6 or later with the oc-mirror plugin. See Deploying the Red Hat Quay Operator on OpenShift Container Platform (Red Hat Quay documentation) . If you need additional assistance selecting and installing a registry, contact your sales representative or Red Hat Support. If you do not have an existing solution for a container image registry, OpenShift Container Platform subscribers receive a mirror registry for Red Hat OpenShift. This mirror registry is included with your subscription and serves as a small-scale container registry. You can use this registry to mirror the necessary container images of OpenShift Container Platform for disconnected installations. Every machine in the provisioned clusters must have access to the mirror registry. If the registry is unreachable, tasks like installation, updating, or routine operations such as workload relocation, might fail. Mirror registries must be operated in a highly available manner, ensuring their availability aligns with the production availability of your OpenShift Container Platform clusters. 3.3.3. Preparing your mirror hosts To use the oc-mirror plugin v2 for image mirroring, you must install the plugin and create a file with credentials for container images, enabling you to mirror from Red Hat to your mirror. 3.3.3.1. Installing the oc-mirror OpenShift CLI plugin Install the oc-mirror OpenShift CLI plugin to manage image sets in disconnected environments. Prerequisites You have installed the OpenShift CLI ( oc ). If you are mirroring image sets in a fully disconnected environment, ensure the following: You have installed the oc-mirror plugin on the host that has internet access. The host in the disconnected environment has access to the target mirror registry. You have set the umask parameter to 0022 on the operating system that uses oc-mirror. You have installed the correct binary for the RHEL version that you are using. Procedure Download the oc-mirror CLI plugin: Navigate to the Downloads page of the Red Hat Hybrid Cloud Console. In the OpenShift disconnected installation tools section, select the OS type and Architecture type of the OpenShift Client (oc) mirror plugin from the dropdown menus. Click Download to save the file. Extract the archive by running the following command: USD tar xvzf oc-mirror.tar.gz If necessary, update the plugin file to be executable by running the following command: USD chmod +x oc-mirror Note Do not rename the oc-mirror file. Install the oc-mirror CLI plugin by placing the file in your PATH , for example /usr/local/bin , by running the following command: USD sudo mv oc-mirror /usr/local/bin/. Verification Verify that the oc-mirror plugin v2 is successfully installed by running the following command: USD oc mirror --v2 --help 3.3.3.2. Configuring credentials that allow images to be mirrored Create a container image registry credentials file that enables you to mirror images from Red Hat to your mirror. Warning Do not use this image registry credentials file as the pull secret when you install a cluster. If you provide this file when you install cluster, all of the machines in the cluster will have write access to your mirror registry. Prerequisites You configured a mirror registry to use in your disconnected environment. You identified an image repository location on your mirror registry to mirror images into. You provisioned a mirror registry account that allows images to be uploaded to that image repository. You have write access to the mirror registry. Procedure Complete the following steps on the installation host: Download your registry.redhat.io pull secret from Red Hat OpenShift Cluster Manager . Make a copy of your pull secret in JSON format by running the following command: USD cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1 1 Specify the path to the folder to store the pull secret in and a name for the JSON file that you create. Example pull secret { "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } If the USDXDG_RUNTIME_DIR/containers directory does not exist, create one by entering the following command: USD mkdir -p USDXDG_RUNTIME_DIR/containers Save the pull secret file as USDXDG_RUNTIME_DIR/containers/auth.json . Generate the base64-encoded user name and password or token for your mirror registry by running the following command: USD echo -n '<user_name>:<password>' | base64 -w0 1 1 For <user_name> and <password> , specify the user name and password that you configured for your registry. Example output BGVtbYk3ZHAtqXs= Edit the JSON file and add a section that describes your registry to it: "auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } }, 1 Specify the registry domain name, and optionally the port, that your mirror registry uses to serve content. For example, registry.example.com or registry.example.com:8443 2 Specify the base64-encoded user name and password for the mirror registry. Example modified pull secret { "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } 3.3.4. Mirroring an image set to a mirror registry Mirroring an image set to a mirror registry ensures that the required images are available in a secure and controlled environment, facilitating smoother deployments, updates, and maintenance tasks. 3.3.4.1. Creating the image set configuration Before you can use the oc-mirror plugin v2 to mirror images, you must create an image set configuration file. This image set configuration file defines which OpenShift Container Platform releases, Operators, and other images to mirror, along with other configuration settings for the oc-mirror plugin v2. Prerequisites You have created a container image registry credentials file. For instructions, see Configuring credentials that allow images to be mirrored . Procedure Create an ImageSetConfiguration YAML file and modify it to include your required images. Example ImageSetConfiguration YAML file kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: channels: - name: stable-4.18 1 minVersion: 4.18.2 maxVersion: 4.18.2 graph: true 2 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 3 packages: 4 - name: aws-load-balancer-operator - name: 3scale-operator - name: node-observability-operator additionalImages: 5 - name: registry.redhat.io/ubi8/ubi:latest - name: registry.redhat.io/ubi9/ubi@sha256:20f695d2a91352d4eaa25107535126727b5945bff38ed36a3e59590f495046f0 1 Set the channel to retrieve OpenShift Container Platform images from. 2 Add graph: true to build and push the graph-data image to the mirror registry. The graph-data image is required to create OpenShift Update Service (OSUS). The graph: true field also generates the UpdateService custom resource manifest. The oc command-line interface (CLI) can use the UpdateService custom resource manifest to create OSUS. For more information, see About the OpenShift Update Service . 3 Set the Operator catalog to retrieve the OpenShift Container Platform images from. 4 Specify only certain Operator packages to include in the image set. Remove this field to retrieve all packages in the catalog. 5 Specify any additional images to include in image set. Additional resources About the OpenShift Update Service 3.3.4.2. Mirroring an image set in a partially disconnected environment You can mirror image sets to a registry using the oc-mirror plugin v2 in environments with restricted internet access. Prerequisites You have access to the internet and the mirror registry in the environment where you are running the oc-mirror plugin v2. Procedure Mirror the images from the specified image set configuration to a specified registry by running the following command: USD oc mirror -c <image_set_configuration> --workspace file://<file_path> docker://<mirror_registry_url> --v2 1 where: <image_set_configuration> Specifies the name of the image set configuration file. <file_path> Specifies the directory where cluster resources will be generated in. <mirror_registry_url> Specifies the URL or address of the mirror registry where the images are stored and from which they need to be deleted. Verification Navigate to the working-dir/cluster-resources directory that was generated in the <file_path> directory. Verify that the YAML files are present for the ImageDigestMirrorSet , ImageTagMirrorSet , and CatalogSource resources. steps Configure your cluster to use the resources generated by oc-mirror plugin v2. 3.3.4.3. Mirroring an image set in a fully disconnected environment You can mirror image sets in a fully disconnected environment where the OpenShift Container Platform cluster cannot access the public internet. The following high-level workflow describes the mirroring process: Mirror to disk : Mirror the image set to an archive. Disk transfer : Manually transfer the archive to the network of the disconnected mirror registry. Disk to mirror : Mirror the image set from the archive to the target disconnected registry. 3.3.4.3.1. Mirroring from mirror to disk You can use the oc-mirror plugin v2 to generate an image set and save the content to disk. Afterwards, you can transfer the generated image set to the disconnected environment and mirror it to the target registry. oc-mirror plugin v2 retrieves the container images from the source specified in the image set configuration file and packs them into a tar archive in a local directory. Procedure Mirror the images from the specified image set configuration to the disk by running the following command: USD oc mirror -c <image_set_configuration> file://<file_path> --v2 where: <image_set_configuration> Specifies the name of the image set configuration file. <file_path> Specifies the directory where the archives containing the image sets will be generated in. Verification Navigate to the <file_path> directory that was generated. Verify that the archive files have been generated. steps Mirroring from disk to mirror 3.3.4.3.2. Mirroring from disk to mirror You can use the oc-mirror plugin v2 to mirror image sets from a disk to a target mirror registry. The oc-mirror plugin v2 retrieves container images from a local disk and transfers them to the specified mirror registry. Procedure Transfer the disk containing mirrored image sets to the environment that contains the target mirror registry. Process the image set file on the disk and mirror the contents to a target mirror registry by running the following command: USD oc mirror -c <image_set_configuration> --from file://<file_path> docker://<mirror_registry_url> --v2 where: <image_set_configuration> Specifies the name of the image set configuration file. <file_path> Specifies the directory on the disk containing the archives. This folder will also contain cluster resources generated for you apply to the cluster, for example the ImageDigestMirrorSet (IDMS) or ImageTagMirrorSet (ITMS) resources. <mirror_registry_url> Specifies the URL or address of the mirror registry where the images are stored. Verification Navigate to the cluster-resources directory within the working-dir directory that was generated in the <file_path> directory. Verify that the YAML files are present for the ImageDigestMirrorSet , ImageTagMirrorSet , and CatalogSource resources. steps Configure your cluster to use the resources generated by oc-mirror plugin v2. 3.3.5. About custom resources generated by oc-mirror plugin v2 The oc-mirror plugin v2 automatically generates the following custom resources: ImageDigestMirrorSet (IDMS) Handles registry mirror rules when using image digest pull specifications. Generated if at least one image of the image set is mirrored by digest. ImageTagMirrorSet (ITMS) Handles registry mirror rules when using image tag pull specifications. Generated if at least one image from the image set is mirrored by tag. CatalogSource Retrieves information about the available Operators in the mirror registry. Used by Operator Lifecycle Manager (OLM) Classic. ClusterCatalog Retrieves information about the available cluster extensions (which includes Operators) in the mirror registry. Used by OLM v1. UpdateService Provides update graph data to the disconnected environment. Used by the OpenShift Update Service. Additional resources ImageDigestMirrorSet ImageTagMirrorSet About catalogs in OLM v1 3.3.5.1. Configuring your cluster to use the resources generated by oc-mirror plugin v2 After you have mirrored your image set to the mirror registry, you must apply the generated ImageDigestMirrorSet (IDMS), ImageTagMirrorSet (ITMS), CatalogSource , and UpdateService resources to the cluster. Important In oc-mirror plugin v2, the IDMS and ITMS files cover the entire image set, unlike the ImageContentSourcePolicy (ICSP) files in oc-mirror plugin v1. Therefore, the IDMS and ITMS files contain all images of the set even if you only add new images during incremental mirroring. Prerequisites You have access to the cluster as a user with the cluster-admin role. Procedure Log in to the OpenShift CLI as a user with the cluster-admin role. Apply the YAML files from the results directory to the cluster by running the following command: USD oc apply -f <path_to_oc_mirror_workspace>/working-dir/cluster-resources Verification Verify that the ImageDigestMirrorSet resources are successfully installed by running the following command: USD oc get imagedigestmirrorset Verify that the ImageTagMirrorSet resources are successfully installed by running the following command: USD oc get imagetagmirrorset Verify that the CatalogSource resources are successfully installed by running the following command: USD oc get catalogsource -n openshift-marketplace Verify that the ClusterCatalog resources are successfully installed by running the following command: USD oc get clustercatalog After your cluster is configured to use the resources generated by oc-mirror plugin v2, see Steps for information about tasks that you can perform using your mirrored images. Additional resources Disconnected environment support in OLM v1 3.3.6. Deletion of images from your disconnected environment If you have previously deployed images using the oc-mirror plugin v2, you can delete these images to free up space in your mirror registry. oc-mirror plugin v2 does not automatically prune images that are not included in the ImageSetConfiguration file. This prevents accidentally deleting necessary or deployed images when making changes to the ImageSetConfig.yaml file. You must create a DeleteImageSetConfiguration file to specify which images to delete. In the following example, the DeleteImageSetConfiguration file removes the following images: All release images for OpenShift Container Platform 4.13.3. The aws-load-balancer-operator v0.0.1 bundle and all its related images. The additional images for ubi and ubi-minimal , referenced by their corresponding digests. Example DeleteImageSetConfiguration file apiVersion: mirror.openshift.io/v2alpha1 kind: DeleteImageSetConfiguration delete: platform: channels: - name: stable-4.13 minVersion: 4.13.3 maxVersion: 4.13.3 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12 packages: - name: aws-load-balancer-operator minVersion: 0.0.1 maxVersion: 0.0.1 additionalImages: - name: registry.redhat.io/ubi8/ubi@sha256:bce7e9f69fb7d4533447232478fd825811c760288f87a35699f9c8f030f2c1a6 - name: registry.redhat.io/ubi8/ubi-minimal@sha256:8bedbe742f140108897fb3532068e8316900d9814f399d676ac78b46e740e34e Important Consider using the mirror-to-disk and disk-to-mirror workflows to reduce deletion issues. oc-mirror plugin v2 deletes only the manifests of the images, which does not reduce the storage occupied in the registry. To free up storage space from unnecessary images, such as those with deleted manifests, you must enable the garbage collector on your container registry. With the garbage collector enabled, the registry will delete the image blobs that no longer have references to any manifests, reducing the storage previously occupied by the deleted blobs. The process for enabling the garbage collector differs depending on your container registry. For more information, see "Resolving storage cleanup issues in the distribution registry". Important To skip deleting the Operator catalog image while you are deleting Operator images, you must list the specific Operators under the Operator catalog image in the DeleteImageSetConfiguration file. This ensures that only the specified Operators are deleted, not the catalog image. If only the Operator catalog image is specified, all Operators within that catalog, as well as the catalog image itself, will be deleted. oc-mirror plugin v2 does not delete Operator catalog images automatically because other Operators may still be deployed and depend on these images. If you are certain that no Operators from a catalog remain in the registry or cluster, you can explicitly add the catalog image to additionalImages in DeleteImageSetConfiguration to remove it. Garbage collection behavior depends on the registry. Some registries do not automatically remove deleted images, requiring a system administrator to manually trigger garbage collection to free up space. Additional resources Resolving storage cleanup issues in the distribution registry 3.3.6.1. Resolving storage cleanup issues in the distribution registry A known issue in the distribution registry prevents the garbage collector from freeing up storage as expected. This issue does not occur when you use Red Hat Quay. Procedure Choose the appropriate method to work around the known issue in the distribution registry: To restart the container registry, run the following command: USD podman restart <registry_container> To disable caching in the registry configuration, perform the following steps: To disable the blobdescriptor cache, modify the /etc/docker/registry/config.yml file: version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: "" filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 To apply the changes, restart the container registry by running the following command: USD podman restart <registry_container> 3.3.6.2. Deleting images from a disconnected environment To delete images from a disconnected environment using the oc-mirror plugin v2, follow the procedure. Prerequisites You have enabled garbage collection in your environment to delete images that no longer reference manifests. Procedure Create a delete-image-set-config.yaml file and include the following content: DeleteImageSetConfiguration file apiVersion: mirror.openshift.io/v2alpha1 kind: DeleteImageSetConfiguration delete: platform: channels: - name: <channel_name> 1 minVersion: <channel_min_version> 2 maxVersion: <channel_max_version> 3 operators: - catalog: <operator_catalog_name> 4 packages: - name: <operator_name> 5 minVersion: <operator_max_version> 6 maxVersion: <operator_min_version> 7 additionalImages: - name: <additional_images> 1 1 Specify the name of the OpenShift Container Platform channel to delete, for example stable-4.15 . 2 3 Specify a version range of the images to delete within the channel, for example 4.15.0 for the minimum version and 4.15.1 for the maximum version. To delete only one version's images, use that version number for both the minVersion and maxVersion fields. 4 Specify an Operator catalog image containing the Operators to delete, for example registry.redhat.io/redhat/redhat-operator-index:v4.14 . The Operator catalog image will not get deleted. Its presence in the registry might be necessary for other Operators still remaining on the cluster. 5 Specify a specific Operator to delete, for example aws-load-balancer-operator . 6 7 Specify a version range of the images to delete for the Operator, for example 0.0.1 for the minimum version and 0.0.2 for the maximum version. Create a delete-images.yaml file by running the following command: USD oc mirror delete --config delete-image-set-config.yaml --workspace file://<previously_mirrored_work_folder> --v2 --generate docker://<remote_registry> where: <previously_mirrored_work_folder> Specifies the directory where images were previously mirrored to or stored during the mirroring process. <remote_registry> Specifies the URL or address of the remote container registry from which images will be deleted. Important When deleting images, specify the correct workspace directory. Modify or delete the cache directory only when starting mirroring from scratch, such as setting up a new cluster. Incorrect changes to the cache directory might disrupt further mirroring operations. Go to the <previously_mirrored_work_folder>/delete directory that was created. Verify that the delete-images.yaml file has been generated. Manually ensure that each image listed in the file is no longer needed by the cluster and can be safely removed from the registry. After you generate the delete-images YAML file, delete the images from the remote registry by running the following command: USD oc mirror delete --v2 --delete-yaml-file <previously_mirrored_work_folder>/working-dir/delete/delete-images.yaml docker://<remote_registry> where: <previously_mirrored_work_folder> Specifies the directory where images were previously mirrored or stored during the mirroring process. <remote_registry> Specifies the URL or address of the remote container registry from which images will be deleted. Important When using the mirror-to-mirror method to mirror images, images are not cached locally, so you cannot delete images from a local cache. 3.3.7. Verifying your selected images for mirroring You can use oc-mirror plugin v2 to perform a test run (dry run) that does not actually mirror any images. This enables you to review the list of images that would be mirrored. You can also use a dry run to catch any errors with your image set configuration early. When running a dry run on a mirror-to-disk workflow, the oc-mirror plugin v2 checks if all the images within the image set are available in its cache. Any missing images are listed in the missing.txt file. When a dry run is performed before mirroring, both missing.txt and mapping.txt files contain the same list of images. 3.3.7.1. Performing a dry run for oc-mirror plugin v2 Verify your image set configuration by performing a dry run without mirroring any images. This ensures your setup is correct and prevents unintended changes. Procedure To perform a test run, run the oc mirror command and append the --dry-run argument to the command: USD oc mirror -c <image_set_config_yaml> file://<oc_mirror_workspace_path> --dry-run --v2 where: <image_set_config_yaml> Specifies the image set configuration file that you created. <oc_mirror_workspace_path> Insert the address of the workspace path. <mirror_registry_url> Insert the URL or address of the remote container registry from which images will be mirrored or deleted. Example output [INFO] : :wave: Hello, welcome to oc-mirror [INFO] : :gear: setting up the environment for you... [INFO] : :twisted_rightwards_arrows: workflow mode: mirrorToDisk [INFO] : :sleuth_or_spy: going to discover the necessary images... [INFO] : :mag: collecting release images... [INFO] : :mag: collecting operator images... [INFO] : :mag: collecting additional images... [WARN] : :warning: 54/54 images necessary for mirroring are not available in the cache. [WARN] : List of missing images in : CLID-19/working-dir/dry-run/missing.txt. please re-run the mirror to disk process [INFO] : :page_facing_up: list of all images for mirroring in : CLID-19/working-dir/dry-run/mapping.txt [INFO] : mirror time : 9.641091076s [INFO] : :wave: Goodbye, thank you for using oc-mirror Verification Navigate to the workspace directory that was generated: USD cd <oc_mirror_workspace_path> Review the mapping.txt and missing.txt files that were generated. These files contain a list of all images that would be mirrored. 3.3.7.2. Troubleshooting oc-mirror plugin v2 errors oc-mirror plugin v2 now logs all image mirroring errors in a separate file, making it easier to track and diagnose failures. Important When errors occur while mirroring release or release component images, they are critical. This stops the mirroring process immediately. Errors with mirroring Operators, Operator-related images, or additional images do not stop the mirroring process. Mirroring continues, and oc-mirror plugin v2 saves a file under the working-dir/logs directory describing which Operator failed to mirror. When an image fails to mirror, and that image is mirrored as part of one or more Operator bundles, oc-mirror plugin v2 notifies the user which Operators are incomplete, providing clarity on the Operator bundles affected by the error. Procedure Check for server-related issues: Example error [ERROR] : [Worker] error mirroring image localhost:55000/openshift/graph-image:latest error: copying image 1/4 from manifest list: trying to reuse blob sha256:edab65b863aead24e3ed77cea194b6562143049a9307cd48f86b542db9eecb6e at destination: pinging container registry localhost:5000: Get "https://localhost:5000/v2/": http: server gave HTTP response to HTTPS client Open the mirroring_error_date_time.log file in the working-dir/logs folder located in the oc-mirror plugin v2 output directory. Look for error messages that typically indicate server-side issues, such as HTTP 500 errors, expired tokens, or timeouts. Retry the mirroring process or contact support if the issue persists. Check for incomplete mirroring of Operators: Example error error mirroring image docker://registry.redhat.io/3scale-amp2/zync-rhel9@sha256:8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d (Operator bundles: [3scale-operator.v0.11.12] - Operators: [3scale-operator]) error: initializing source docker://localhost:55000/3scale-amp2/zync-rhel9:8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d: reading manifest 8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d in localhost:55000/3scale-amp2/zync-rhel9: manifest unknown error mirroring image docker://registry.redhat.io/3scale-amp2/3scale-rhel7-operator-metadata@sha256:de0a70d1263a6a596d28bf376158056631afd0b6159865008a7263a8e9bf0c7d error: skipping operator bundle docker://registry.redhat.io/3scale-amp2/3scale-rhel7-operator-metadata@sha256:de0a70d1263a6a596d28bf376158056631afd0b6159865008a7263a8e9bf0c7d because one of its related images failed to mirror error mirroring image docker://registry.redhat.io/3scale-amp2/system-rhel7@sha256:fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e (Operator bundles: [3scale-operator.v0.11.12] - Operators: [3scale-operator]) error: initializing source docker://localhost:55000/3scale-amp2/system-rhel7:fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e: reading manifest fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e in localhost:55000/3scale-amp2/system-rhel7: manifest unknown Check for warnings in the console or log file indicating which Operators are incomplete. If an Operator is flagged as incomplete, the image related to that Operator likely failed to mirror. Manually mirror the missing image or retry the mirroring process. Check for errors related to generated cluster resources. Even if some images fail to mirror, oc-mirror v2 will still generate cluster resources such as IDMS.yaml and ITMS.yaml files for the successfully mirrored images. Check the output directory for the generated files. If these files are missing for specific images, ensure that no critical errors occurred for those images during the mirroring process. By following these steps, you can better diagnose issues and ensure smoother mirroring. 3.3.8. Benefits of enclave support Enclave support restricts internal access to a specific part of a network. Unlike a demilitarized zone (DMZ) network, which allows inbound and outbound traffic access through firewall boundaries, enclaves do not cross firewall boundaries. The new enclave support functionality is for scenarios where mirroring is needed for multiple enclaves that are secured behind at least one intermediate disconnected network. Enclave support has the following benefits: You can mirror content for multiple enclaves and centralize it in a single internal registry. Because some customers want to run security checks on the mirrored content, with this setup they can run these checks all at once. The content is then vetted before being mirrored to downstream enclaves. You can mirror content directly from the centralized internal registry to enclaves without restarting the mirroring process from the internet for each enclave. You can minimize data transfer between network stages, so to ensure that a blob or image is transferred only once from one stage to another. 3.3.8.1. Enclave mirroring workflow The image outlines the flow for using the oc-mirror plugin in different environments, including environments with and without an internet connection. Environment with Internet Connection : The user executes oc-mirror plugin v2 to mirror content from an online registry to a local disk directory. The mirrored content is saved to the disk for transfer to offline environments. Disconnected Enterprise Environment (No Internet) : Flow 1: The user runs oc-mirror plugin v2 to load the mirrored content from the disk directory, which was transferred from the online environment, into the enterprise-registry.in registry. Flow 2: After updating the registries.conf file, the user executes the oc-mirror plugin v2 to mirror content from the enterprise-registry.in registry to an enclave environment. The content is saved to a disk directory for transfer to the enclave. Enclave Environment (No Internet) : The user runs oc-mirror plugin v2 to load content from the disk directory into the enclave-registry.in registry. The image visually represents the data flow across these environments and emphasizes the use of oc-mirror to handle disconnected and enclave environments without an internet connection. 3.3.8.2. Mirroring to an enclave When you mirror to an enclave, you must first transfer the necessary images from one or more enclaves into the enterprise central registry. The central registry is situated within a secure network, specifically a disconnected environment, and is not directly linked to the public internet. But the user must execute oc mirror in an environment with access to the public internet. Procedure Before running oc-mirror plugin v2 in the disconnected environment, create a registries.conf file. The TOML format of the file is described in this specification: Note It is recommended to store the file under USDHOME/.config/containers/registries.conf or /etc/containers/registries.conf . Example registries.conf [[registry]] location="registry.redhat.io" [[registry.mirror]] location="<enterprise-registry.in>" [[registry]] location="quay.io" [[registry.mirror]] location="<enterprise-registry.in>" Generate a mirror archive. To collect all the OpenShift Container Platform content into an archive on the disk under <file_path>/enterprise-content , run the following command: USD oc mirror --v2 -c isc.yaml file://<file_path>/enterprise-content Example of isc.yaml apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: architectures: - "amd64" channels: - name: stable-4.15 minVersion: 4.15.0 maxVersion: 4.15.3 After the archive is generated, it is transferred to the disconnected environment. The transport mechanism is not part of oc-mirror plugin v2. The enterprise network administrators determine the transfer strategy. In some cases, the transfer is done manually, in that the disk is physically unplugged from one location, and plugged to another computer in the disconnected environment. In other cases, the Secure File Transfer Protocol (SFTP) or other protocols are used. After the transfer of the archive is done, you can execute oc-mirror plugin v2 again in order to mirror the relevant archive contents to the registry ( entrerpise_registry.in in the example) as demonstrated in the following example: USD oc mirror --v2 -c isc.yaml --from file://<disconnected_environment_file_path>/enterprise-content docker://<enterprise_registry.in>/ Where: --from points to the folder containing the archive. It starts with the file:// . docker:// is the destination of the mirroring is the final argument. Because it is a docker registry. -c ( --config ) is a mandatory argument. It enables oc-mirror plugin v2 to eventually mirror only sub-parts of the archive to the registry. One archive might contain several OpenShift Container Platform releases, but the disconnected environment or an enclave might mirror only a few. Prepare the imageSetConfig YAML file, which describes the content to mirror to the enclave: Example isc-enclave.yaml apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: architectures: - "amd64" channels: - name: stable-4.15 minVersion: 4.15.2 maxVersion: 4.15.2 You must run oc-mirror plugin v2 on a machine with access to the disconnected registry. In the example, the disconnected environment, enterprise-registry.in , is accessible. Update the graph URL If you are using graph:true , oc-mirror plugin v2 attempts to reach the cincinnati API endpoint. Because this environment is disconnected, be sure to export the environment variable UPDATE_URL_OVERRIDE to refer to the URL for the OpenShift Update Service (OSUS): USD export UPDATE_URL_OVERRIDE=https://<osus.enterprise.in>/graph For more information on setting up OSUS on an OpenShift cluster, see "Updating a cluster in a disconnected environment using the OpenShift Update Service". Note When updating between OpenShift Container Platform Extended Update Support (EUS) versions, you must also include images for an intermediate minor version between the current and target versions. The oc-mirror plugin v2 might not always detect this requirement automatically, so check the Red Hat OpenShift Container Platform Update Graph page to confirm any required intermediate versions. Use the Update Graph page to find the intermediate minor versions suggested by the application, and include any of these versions in the ImageSetConfiguration file when using the oc-mirror plugin v2. Generate a mirror archive from the enterprise registry for the enclave. To prepare an archive for the enclave1 , the user executes oc-mirror plugin v2 in the enterprise disconnected environment by using the imageSetConfiguration specific for that enclave. This ensures that only images needed by that enclave are mirrored: USD oc mirror --v2 -c isc-enclave.yaml file:///disk-enc1/ This action collects all the OpenShift Container Platform content into an archive and generates an archive on disk. After the archive is generated, it will be transferred to the enclave1 network. The transport mechanism is not the responsibility of oc-mirror plugin v2. Mirror contents to the enclave registry After the transfer of the archive is done, the user can execute oc-mirror plugin v2 again in order to mirror the relevant archive contents to the registry. USD oc mirror --v2 -c isc-enclave.yaml --from file://local-disk docker://registry.enc1.in The administrators of the OpenShift Container Platform cluster in enclave1 are now ready to install or upgrade that cluster. 3.3.9. oc-mirror plugin v2 support proxy setting The oc-mirror plugin v2 can operate in a proxy-configured environment. The plugin can use system proxy settings to retrieve images for OpenShift Container Platform, Operator catalog, and the additionalImages registry. Additional resources Updating a cluster in a disconnected environment using the OpenShift Update Service Resolving storage cleanup issues in the distribution registry 3.3.10. How filtering works in the operator catalog oc-mirror plugin v2 selects the list of bundles for mirroring by processing the information in imageSetConfig . When oc-mirror plugin v2 selects bundles for mirroring, it does not infer Group Version Kind (GVK) or bundle dependencies, omitting them from the mirroring set. Instead, it strictly adheres to the user instructions. You must explicitly specify any required dependent packages and their versions. Table 3.1. Use the following table to see what bundle versions are included in different scenarios ImageSetConfig operator filtering Expected bundle versions Scenario 1 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 For each package in the catalog, one bundle, corresponding to the head version for each channel of that package. Scenario 2 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true All bundles of all channels of the specified catalog. Scenario 3 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 packages: - name: compliance-operator One bundle, corresponding to the head version for each channel of that package. Scenario 4 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true - packages: - name: elasticsearch-operator All bundles of all channels for the packages specified. Scenario 5 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator minVersion: 5.6.0 All bundles in all channels, from the minVersion , up to the channel head for that package. Scenario 6 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator maxVersion: 6.0.0 All bundles in all channels that are lower than the maxVersion for that package. Scenario 7 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator minVersion: 5.6.0 maxVersion: 6.0.0 All bundles in all channels, between the minVersion and maxVersion for that package. The head of the channel is not included, even if multiple channels are included in the filtering. Scenario 8 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable The head bundle for the selected channel of that package. You must use the defaultChannel field in case the filtered channels are not the default. Scenario 9 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true - packages: - name: elasticsearch-operator channels: - name: 'stable-v0' All bundles for the packages and channels specified. The defaultChannel should be used in case the filtered channels are not the default. Scenario 10 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable - name: stable-5.5 The head bundle for each selected channel of that package. Scenario 11 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 Within the selected channel of that package, all versions starting with the minVersion up to the channel head. You must use the defaultChannel field in case the filtered channels are not the default. Scenario 12 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable maxVersion: 6.0.0 Within the selected channel of that package, all versions up to maxVersion . Head of channel is not included, even if multiple channels are included in the filtering. You might see errors if this filtering leads to a channel with multiple heads. You must use the defaultChannel field in case the filtered channels are not the default. Scenario 13 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0 Within the selected channel of that package, all versions between the minVersion and maxVersion . The head of channel is not included, even if multiple channels are included in the filtering. You might see errors if this filtering leads to a channel with multiple heads. You must use the defaultChannel field in case the filtered channels are not the default. Scenario 14 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0 Do not use this scenario. filtering by channel and by package with a minVersion or maxVersion is not allowed. Scenario 15 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0 Do not use this scenario. You cannot filter using full:true and the minVersion or maxVersion . Scenario 16 mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 full: true packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0 Do not use this scenario. You cannot filter using full:true and the minVersion or maxVersion . 3.3.11. ImageSet configuration parameters for oc-mirror plugin v2 The oc-mirror plugin v2 requires an image set configuration file that defines what images to mirror. The following table lists the available parameters for the ImageSetConfiguration resource. Note Using the minVersion and maxVersion properties to filter for a specific Operator version range can result in a multiple channel heads error. The error message states that there are multiple channel heads . This is because when the filter is applied, the update graph of the Operator is truncated. OLM requires that every Operator channel contains versions that form an update graph with exactly one end point, that is, the latest version of the Operator. When the filter range is applied, that graph can turn into two or more separate graphs or a graph that has more than one end point. To avoid this error, do not filter out the latest version of an Operator. If you still run into the error, depending on the Operator, either the maxVersion property must be increased or the minVersion property must be decreased. Because every Operator graph can be different, you might need to adjust these values until the error resolves. Table 3.2. ImageSetConfiguration parameters Parameter Description Values apiVersion The API version of the ImageSetConfiguration content. String Example: mirror.openshift.io/v2alpha1 archiveSize The maximum size, in GiB, of each archive file within the image set. Integer Example: 4 kubeVirtContainer When set to true , includes images from the HyperShift KubeVirt CoreOS container. Boolean Example ImageSetConfiguration file: apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: channels: - name: stable-4.16 minVersion: 4.16.0 maxVersion: 4.16.0 kubeVirtContainer: true mirror The configuration of the image set. Object mirror.additionalImages The additional images configuration of the image set. Array of objects Example: additionalImages: - name: registry.redhat.io/ubi8/ubi:latest mirror.additionalImages.name The tag or digest of the image to mirror. String Example: registry.redhat.io/ubi8/ubi:latest mirror.blockedImages The full tag, digest, or pattern of images to block from mirroring. Array of strings Example: docker.io/library/alpine mirror.helm The helm configuration of the image set. The oc-mirror plugin does not support helm charts with manually modified values.yaml files. Object mirror.helm.local The local helm charts to mirror. Array of objects. For example: local: - name: podinfo path: /test/podinfo-5.0.0.tar.gz mirror.helm.local.name The name of the local helm chart to mirror. String. For example: podinfo . mirror.helm.local.path The path of the local helm chart to mirror. String. For example: /test/podinfo-5.0.0.tar.gz . mirror.helm.repositories The remote helm repositories to mirror from. Array of objects. For example: repositories: - name: podinfo url: https://example.github.io/podinfo charts: - name: podinfo version: 5.0.0 imagePaths: - "{.spec.template.spec.custom[*].image}" mirror.helm.repositories.name The name of the helm repository to mirror from. String. For example: podinfo . mirror.helm.repositories.url The URL of the helm repository to mirror from. String. For example: https://example.github.io/podinfo . mirror.helm.repositories.charts The remote helm charts to mirror. Array of objects. mirror.helm.repositories.charts.name The name of the helm chart to mirror. String. For example: podinfo . mirror.helm.repositories.charts.imagePaths The custom path of a container image inside of the helm chart. + Note oc-mirror detects and mirrors container images from the helm chart by searching well-known paths. You can also specify custom paths using this field. Array of string. For example: "- {.spec.template.spec.custom[*].image}" . mirror.operators The Operators configuration of the image set. Array of objects Example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:4.18 packages: - name: elasticsearch-operator minVersion: '2.4.0' mirror.operators.catalog The Operator catalog to include in the image set. String Example: registry.redhat.io/redhat/redhat-operator-index:v4.15 mirror.operators.full When true , downloads the full catalog, Operator package, or Operator channel. Boolean The default value is false . mirror.operators.packages The Operator packages configuration. Array of objects Example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:4.18 packages: - name: elasticsearch-operator minVersion: '5.2.3-31' mirror.operators.packages.name The Operator package name to include in the image set. String Example: elasticsearch-operator mirror.operators.packages.channels Operator package channel configuration Object mirror.operators.packages.channels.name The Operator channel name, unique within a package, to include in the image set. String Eample: fast or stable-v4.15 mirror.operators.packages.channels.maxVersion The highest version of the Operator mirror across all channels in which it exists. String Example: 5.2.3-31 mirror.operators.packages.channels.minVersion The lowest version of the Operator to mirror across all channels in which it exists String Example: 5.2.3-31 mirror.operators.packages.maxVersion The highest version of the Operator to mirror across all channels in which it exists. String Example: 5.2.3-31 mirror.operators.packages.minVersion The lowest version of the Operator to mirror across all channels in which it exists. String Example: 5.2.3-31 mirror.operators.targetCatalog An alternative name and optional namespace hierarchy to mirror the referenced catalog as String Example: my-namespace/my-operator-catalog mirror.operators.targetCatalogSourceTemplate Path on disk for a template to use to complete catalogSource custom resource generated by oc-mirror plugin v2. String Example: /tmp/catalog-source_template.yaml Example of a template file: apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: discarded namespace: openshift-marketplace spec: image: discarded sourceType: grpc updateStrategy: registryPoll: interval: 30m0s mirror.operators.targetTag An alternative tag to append to the targetName or targetCatalog . String Example: v1 mirror.platform The platform configuration of the image set. Object mirror.platform.architectures The architecture of the platform release payload to mirror. Array of strings Example: architectures: - amd64 - arm64 - multi - ppc64le - s390x The default value is amd64 . The value multi ensures that the mirroring is supported for all available architectures, eliminating the need to specify individual architectures mirror.platform.channels The platform channel configuration of the image set. Array of objects Example: channels: - name: stable-4.12 - name: stable-4.18 mirror.platform.channels.full When true , sets the minVersion to the first release in the channel and the maxVersion to the last release in the channel. Boolean The default value is false mirror.platform.channels.name Name of the release channel String Example: stable-4.15 mirror.platform.channels.minVersion The minimum version of the referenced platform to be mirrored. String Example: 4.12.6 mirror.platform.channels.maxVersion The highest version of the referenced platform to be mirrored. String Example: 4.15.1 mirror.platform.channels.shortestPath Toggles shortest path mirroring or full range mirroring. Boolean The default value is false mirror.platform.channels.type Type of the platform to be mirrored String Example: ocp or okd . The default is ocp . mirror.platform.graph Indicates whether the OSUS graph is added to the image set and subsequently published to the mirror. Boolean The default value is false 3.3.11.1. Delete ImageSet Configuration parameters To use the oc-mirror plugin v2, you must have delete image set configuration file that defines which images to delete from the mirror registry. The following table lists the available parameters for the DeleteImageSetConfiguration resource. Table 3.3. DeleteImageSetConfiguration parameters Parameter Description Values apiVersion The API version for the DeleteImageSetConfiguration content. String Example: mirror.openshift.io/v2alpha1 delete The configuration of the image set to delete. Object delete.additionalImages The additional images configuration of the delete image set. Array of objects Example: additionalImages: - name: registry.redhat.io/ubi8/ubi:latest delete.additionalImages.name The tag or digest of the image to delete. String Example: registry.redhat.io/ubi8/ubi:latest delete.operators The Operators configuration of the delete image set. Array of objects Example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:{product-version} packages: - name: elasticsearch-operator minVersion: '2.4.0' delete.operators.catalog The Operator catalog to include in the delete image set. String Example: registry.redhat.io/redhat/redhat-operator-index:v4.15 delete.operators.full When true, deletes the full catalog, Operator package, or Operator channel. Boolean The default value is false delete.operators.packages Operator packages configuration Array of objects Example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:{product-version} packages: - name: elasticsearch-operator minVersion: '5.2.3-31' delete.operators.packages.name The Operator package name to include in the delete image set. String Example: elasticsearch-operator delete.operators.packages.channels Operator package channel configuration Object delete.operators.packages.channels.name The Operator channel name, unique within a package, to include in the delete image set. String Example: fast or stable-v4.15 delete.operators.packages.channels.maxVersion The highest version of the Operator to delete within the selected channel. String Example: 5.2.3-31 delete.operators.packages.channels.minVersion The lowest version of the Operator to delete within the selection in which it exists. String Example: 5.2.3-31 delete.operators.packages.maxVersion The highest version of the Operator to delete across all channels in which it exists. String Example: 5.2.3-31 delete.operators.packages.minVersion The lowest version of the Operator to delete across all channels in which it exists. String Example: 5.2.3-31 delete.platform The platform configuration of the image set Object delete.platform.architectures The architecture of the platform release payload to delete. Array of strings Example: architectures: - amd64 - arm64 - multi - ppc64le - s390x The default value is amd64 delete.platform.channels The platform channel configuration of the image set. Array of objects Example: channels: - name: stable-4.12 - name: stable-4.18 delete.platform.channels.full When true , sets the minVersion to the first release in the channel and the maxVersion to the last release in the channel. Boolean The default value is false delete.platform.channels.name Name of the release channel String Example: stable-4.15 delete.platform.channels.minVersion The minimum version of the referenced platform to be deleted. String Example: 4.12.6 delete.platform.channels.maxVersion The highest version of the referenced platform to be deleted. String Example: 4.15.1 delete.platform.channels.shortestPath Toggles between deleting the shortest path and deleting the full range. Boolean The default value is false delete.platform.channels.type Type of the platform to be deleted String Example: ocp or okd The default is ocp delete.platform.graph Determines whether the OSUS graph is deleted as well on the mirror registry as well. Boolean The default value is false 3.3.12. Command reference for oc-mirror plugin v2 The following tables describe the oc mirror subcommands and flags for oc-mirror plugin v2: Table 3.4. Subcommands and flags for the oc-mirror plugin v2 Subcommand Description help Show help about any subcommand version Output the oc-mirror version delete Deletes images in remote registry and local cache. Table 3.5. oc mirror flags Flag Description --authfile Displays the string path of the authentication file. Default is USD{XDG_RUNTIME_DIR}/containers/auth.json . -c , --config <string> Specifies the path to an image set configuration file. --cache-dir <string> oc-mirror cache directory location. The default value is USDHOME . --dest-tls-verify Requires HTTPS and verifies certificates when accessing the container registry or daemon. The default value is true . --dry-run Prints actions without mirroring images. --from <string> Specifies the path to an image set archive that was generated by executing oc-mirror plugin v2 to load a target registry. -h , --help Displays help --image-timeout duration Timeout for mirroring an image. The default is 10m0s. Valid time units are ns , us or ms , ms , s , m , and h . --log-level <string> Displays string log levels. Supported values include info, debug, trace, error. The default value is info . -p , --port Determines the HTTP port used by oc-mirror plugin v2 local storage instance. The default value is 55000 . --parallel-images <unit> Specifies the number of images mirrored in parallel. The default value is 8 . --parallel-layers <unit> Specifies the number of image layers mirrored in parallel. The default value is 10 . --max-nested-paths <int> Specifies the maximum number of nested paths for destination registries that limit nested paths. The default value is 0 . --secure-policy The default value is false . If you set a non-default value, the command enables signature verification, which is the secure policy for signature verification. --since Includes all new content since a specified date (format: yyyy-mm-dd ). When not provided, new content since mirroring is mirrored. --src-tls-verify Requires HTTPS and verifies certificates when accessing the container registry or daemon. --strict-archive The default value is false . If you set a value, the command generates archives that are strictly less than the archiveSize that was set in the imageSetConfig custom resource (CR). Mirroring exist in error if a file being archived exceeds archiveSize (GB). -v , --version Displays the version for oc-mirror plugin v2. --workspace Determines string oc-mirror plugin v2 workspace where resources and internal artifacts are generated. --retry-delay duration Delay between 2 retries. The default value is 1s . --retry-times <int> The number of times to retry. The default value is 2 . --rootless-storage-path <string> Overrides the default container rootless storage path (usually in etc/containers/storage.conf ). 3.3.12.1. Command reference for deleting images The following tables describe the oc mirror subcommands and flags for deleting images: Table 3.6. Subcommands and flags for the deleting images Subcommand Description --authfile <string> Path of the authentication file. The default value is USD{XDG_RUNTIME_DIR}/containers/auth.json . --cache-dir <string> oc-mirror cache directory location. The default is USDHOME . -c <string> , --config <string> Path to the delete imageset configuration file. --delete-id <string> Used to differentiate between versions for files created by the delete functionality. --delete-v1-images Used during the migration, along with --generate , in order to target images previously mirrored with oc-mirror plugin v1. --delete-yaml-file <string> If set, uses the generated or updated yaml file to delete contents. --dest-tls-verify Require HTTPS and verify certificates when talking to the container registry or daemon. TThe default value is true . --force-cache-delete Used to force delete the local cache manifests and blobs. --generate Used to generate the delete yaml for the list of manifests and blobs, used when deleting from local cache and remote registry. -h , --help Displays help. --log-level <string> Log level one of info , debug , trace , and error . The default value is info . --parallel-images <unit> Indicates the number of images deleted in parallel. The default value is 8 . --parallel-layers <unit> Indicates the number of image layers mirrored in parallel. The default value is 10 . -p <unit> , --port <unit> HTTP port used by oc-mirror's local storage instance. The default value is 55000 . --retry-delay Duration delay between 2 retries. The default value is 1s . --retry-times <int> The number of times to retry. The default value is 2 . --src-tls-verify Require HTTPS and verify certificates when talking to the container registry or daemon. The default value is true . --workspace <string> oc-mirror workspace where resources and internal artifacts are generated. Additional resources Configuring your cluster to use the resources generated by oc-mirror 3.3.13. steps After you mirror images to your disconnected environment using oc-mirror plugin v2, you can perform any of the following actions: Installing a cluster in a disconnected environment Using Operator Lifecycle Manager in disconnected environments Updating a cluster in a disconnected environment using the OpenShift Update Service 3.4. Migrating from oc-mirror plugin v1 to v2 The oc-mirror v2 plugin introduces major changes to image mirroring workflows. This guide provides step-by-step instructions for migration while ensuring compatibility with oc-mirror plugin v2. Important You must manually update the configurations by modifying the API version and removing deprecated fields. For more information, see "Changes from oc-mirror plugin v1 to v2". 3.4.1. Changes from oc-mirror plugin v1 to v2 Before migrating from oc-mirror plugin v1 to v2, see the following differences between oc-mirror plugin v1 and v2: Explicit version selection: Users must explicitly specify --v2 when using oc-mirror . If no version is specified, v1 is executed by default. This behavior is expected to change in future releases, where --v2 will be the default. Updated commands: Commands for mirroring workflows have changed to align with oc-mirror plugin v2's new workflow. For mirror-to-disk, run the following command: USD oc-mirror --config isc.yaml file://<directory_name> --v2 For disk-to-mirror, run the following command: USD oc-mirror --config isc.yaml --from file://<directory_name> docker://<remote_registry> --v2 For mirror-to-mirror, run the following command: USD oc-mirror --config isc.yaml --workspace file://<directory_name> docker://<remote_registry> --v2 Note --workspace is now required for mirror-to-mirror operation. API version update: The ImageSetConfiguration API version changes from v1alpha2 (v1) to v2alpha1 (v2). You must manually update the configuration files before migration. Configuration changes: storageConfig must be removed in oc-mirror plugin v2. Incremental mirroring is now handled automatically through the working directory or local cache. Changes in results directory: All custom resources to be applied to the disconnected cluster are generated in the <workspace_path>/working-dir/cluster-resources directory after the migration. Outputs in oc-mirror plugin v2 are not stored in the same location as oc-mirror plugin v1. You must check the cluster-resources folder under the working directory for the following resources: ImageDigestMirrorSet (IDMS) ImageTagMirrorSet (ITMS) CatalogSource ClusterCatalog UpdateService Workspace and directory naming: Follow the new oc-mirror v2 convention to prevent any potential data inconsistencies when transitioning between versions. The oc-mirror plugin v1 oc-mirror-workspace directory is no longer needed. Use a new directory for oc-mirror plugin v2 to avoid conflicts. Replacing ImageContentSourcePolicy (ICSP) resources with IDMS/ITMS: Important Deleting all ImageContentSourcePolicy (ICSP) resources might remove configurations unrelated to oc-mirror. To avoid unintended deletions, identify ICSP resources generated by oc-mirror before removing them. If you are unsure, check with your cluster administrator. For more information, see "Mirroring images for a disconnected installation by using the oc-mirror plugin v2". In oc-mirror plugin v2, the ICSP resource is replaced by ImageDigestMirrorSet (IDMS) and ImageTagMirrorSet (ITMS) resources. 3.4.2. Migrating to oc-mirror plugin v2 To migrate from oc-mirror plugin v1 to v2, you must manually update the ImageSetConfiguration file, modify mirroring commands, and clean up v1 artifacts. Follow these steps to complete the migration. Procedure Modify the API version and remove deprecated fields in your ImageSetConfiguration . Example ImageSetConfiguration file with oc-mirror plugin v1 configuration kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 mirror: platform: channels: - name: stable-4.17 graph: true helm: repositories: - name: sbo url: https://redhat-developer.github.io/service-binding-operator-helm-chart/ additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: quay.io/openshifttest/hello-openshift@sha256:example_hash operators: - catalog: oci:///test/redhat-operator-index packages: - name: aws-load-balancer-operator storageConfig: # REMOVE this field in v2 local: path: /var/lib/oc-mirror Example ImageSetConfiguration file with oc-mirror plugin v2 configuration kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: channels: - name: stable-4.17 graph: true helm: repositories: - name: sbo url: https://redhat-developer.github.io/service-binding-operator-helm-chart/ additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: quay.io/openshifttest/hello-openshift@sha256:example_hash operators: - catalog: oci:///test/redhat-operator-index packages: - name: aws-load-balancer-operator Check the cluster-resources directory inside the working directory for IDMS, ITMS, CatalogSource , and ClusterCatalog resources by running the following command: USD ls <v2_workspace>/working-dir/cluster-resources/ Once the migration is complete, verify that mirrored images and catalogs are available: Ensure that no errors or warnings occurred during mirroring. Ensure that no error file was generated ( working-dir/logs/mirroring_errors_YYYYMMdd_HHmmss.txt ). Verify that mirrored images and catalogs are available using the following the commands: USD oc get catalogsource -n openshift-marketplace USD oc get imagedigestmirrorset,imagetagmirrorset For more information, refer to "Mirroring images for a disconnected installation using oc-mirror plugin v2". Optional: Remove images mirrored using oc-mirror plugin v1: Mirror the images using oc-mirror plugin v1. Update the API version in the ImageSetConfiguration file from v1alpha2 (v1) to v2alpha1 (v2), then run the following command: USD oc-mirror -c isc.yaml file://some-dir --v2 Note storageConfig is not a valid field in the ImageSetConfiguration and DeleteImageSetConfiguration files. Remove this field when updating to oc-mirror plugin v2. Generate a delete manifest and delete v1 images by running the following command: USD oc-mirror delete --config=delete-isc.yaml --generate --delete-v1-images --workspace file://some-dir docker://registry.example:5000 --v2 Important oc-mirror plugin v2 does not automatically prune the destination registry, unlike oc-mirror plugin v1. To clean up images that are no longer needed, use the delete functionality in v2 with the --delete-v1-images command flag. Once all images mirrored with oc-mirror plugin v1 are removed, you no longer need to use this flag. If you need to delete images mirrored with oc-mirror plugin v2, do not set --delete-v1-images . For more information about deleting images, see "Deletion of images from your disconnected environment". Delete images based on the generated manifest by running the following command: USD oc-mirror delete --delete-yaml-file some-dir/working-dir/delete/delete-images.yaml docker://registry.example:5000 --v2 3.4.3. Additional resources Mirroring an image set in a partially disconnected environment Mirroring an image set in a fully disconnected environment For details regarding configuration changes, see Changes from oc-mirror plugin v1 to v2 . For more information about deleting images, see Deletion of images from your disconnected environment . 3.5. Mirroring images for a disconnected installation using the oc-mirror plugin Running your cluster in a restricted network without direct internet connectivity is possible by installing the cluster from a mirrored set of OpenShift Container Platform container images in a private registry. This registry must be running at all times as long as the cluster is running. See the Prerequisites section for more information. You can use the oc-mirror OpenShift CLI ( oc ) plugin to mirror images to a mirror registry in your fully or partially disconnected environments. You must run oc-mirror from a system with internet connectivity in order to download the required images from the official Red Hat registries. Important The oc-mirror plugin v1 is now deprecated. Transition to the oc-mirror plugin v2 for continued support and improvements. 3.5.1. About the oc-mirror plugin You can use the oc-mirror OpenShift CLI ( oc ) plugin to mirror all required OpenShift Container Platform content and other images to your mirror registry by using a single tool. It provides the following features: Provides a centralized method to mirror OpenShift Container Platform releases, Operators, helm charts, and other images. Maintains update paths for OpenShift Container Platform and Operators. Uses a declarative image set configuration file to include only the OpenShift Container Platform releases, Operators, and images that your cluster needs. Performs incremental mirroring, which reduces the size of future image sets. Prunes images from the target mirror registry that were excluded from the image set configuration since the execution. Optionally generates supporting artifacts for OpenShift Update Service (OSUS) usage. When using the oc-mirror plugin, you specify which content to mirror in an image set configuration file. In this YAML file, you can fine-tune the configuration to only include the OpenShift Container Platform releases and Operators that your cluster needs. This reduces the amount of data that you need to download and transfer. The oc-mirror plugin can also mirror arbitrary helm charts and additional container images to assist users in seamlessly synchronizing their workloads onto mirror registries. The first time you run the oc-mirror plugin, it populates your mirror registry with the required content to perform your disconnected cluster installation or update. In order for your disconnected cluster to continue receiving updates, you must keep your mirror registry updated. To update your mirror registry, you run the oc-mirror plugin using the same configuration as the first time you ran it. The oc-mirror plugin references the metadata from the storage backend and only downloads what has been released since the last time you ran the tool. This provides update paths for OpenShift Container Platform and Operators and performs dependency resolution as required. 3.5.1.1. High level workflow The following steps outline the high-level workflow on how to use the oc-mirror plugin to mirror images to a mirror registry: Create an image set configuration file. Mirror the image set to the target mirror registry by using one of the following methods: Mirror an image set directly to the target mirror registry. Mirror an image set to disk, transfer the image set to the target environment, then upload the image set to the target mirror registry. Configure your cluster to use the resources generated by the oc-mirror plugin. Repeat these steps to update your target mirror registry as necessary. Important When using the oc-mirror CLI plugin to populate a mirror registry, any further updates to the target mirror registry must be made by using the oc-mirror plugin. 3.5.2. oc-mirror plugin compatibility and support The oc-mirror plugin supports mirroring OpenShift Container Platform payload images and Operator catalogs for OpenShift Container Platform versions 4.12 and later. Note On aarch64 , ppc64le , and s390x architectures the oc-mirror plugin is only supported for OpenShift Container Platform versions 4.14 and later. Use the latest available version of the oc-mirror plugin regardless of which versions of OpenShift Container Platform you need to mirror. Additional resources For information on updating oc-mirror, see Viewing the image pull source . 3.5.3. About the mirror registry You can mirror the images that are required for OpenShift Container Platform installation and subsequent product updates to a container mirror registry that supports Docker v2-2 , such as Red Hat Quay. If you do not have access to a large-scale container registry, you can use the mirror registry for Red Hat OpenShift , which is a small-scale container registry included with OpenShift Container Platform subscriptions. Regardless of your chosen registry, the procedure to mirror content from Red Hat hosted sites on the internet to an isolated image registry is the same. After you mirror the content, you configure each cluster to retrieve this content from your mirror registry. Important The OpenShift image registry cannot be used as the target registry because it does not support pushing without a tag, which is required during the mirroring process. If choosing a container registry that is not the mirror registry for Red Hat OpenShift , it must be reachable by every machine in the clusters that you provision. If the registry is unreachable, installation, updating, or normal operations such as workload relocation might fail. For that reason, you must run mirror registries in a highly available way, and the mirror registries must at least match the production availability of your OpenShift Container Platform clusters. When you populate your mirror registry with OpenShift Container Platform images, you can follow two scenarios. If you have a host that can access both the internet and your mirror registry, but not your cluster nodes, you can directly mirror the content from that machine. This process is referred to as connected mirroring . If you have no such host, you must mirror the images to a file system and then bring that host or removable media into your restricted environment. This process is referred to as disconnected mirroring . For mirrored registries, to view the source of pulled images, you must review the Trying to access log entry in the CRI-O logs. Other methods to view the image pull source, such as using the crictl images command on a node, show the non-mirrored image name, even though the image is pulled from the mirrored location. Note Red Hat does not test third party registries with OpenShift Container Platform. Additional resources For information about viewing the CRI-O logs to view the image source, see Viewing the image pull source . 3.5.4. Prerequisites You must have a container image registry that supports Docker v2-2 in the location that will host the OpenShift Container Platform cluster, such as Red Hat Quay. Note If you use Red Hat Quay, you must use version 3.6 or later with the oc-mirror plugin. If you have an entitlement to Red Hat Quay, see the documentation on deploying Red Hat Quay for proof-of-concept purposes or by using the Red Hat Quay Operator . If you need additional assistance selecting and installing a registry, contact your sales representative or Red Hat Support. If you do not already have an existing solution for a container image registry, subscribers of OpenShift Container Platform are provided a mirror registry for Red Hat OpenShift . The mirror registry for Red Hat OpenShift is included with your subscription and is a small-scale container registry that can be used to mirror the required container images of OpenShift Container Platform in disconnected installations. 3.5.5. Preparing your mirror hosts Before you can use the oc-mirror plugin to mirror images, you must install the plugin and create a container image registry credentials file to allow the mirroring from Red Hat to your mirror. 3.5.5.1. Installing the oc-mirror OpenShift CLI plugin Install the oc-mirror OpenShift CLI plugin to manage image sets in disconnected environments. Prerequisites You have installed the OpenShift CLI ( oc ). If you are mirroring image sets in a fully disconnected environment, ensure the following: You have installed the oc-mirror plugin on the host that has internet access. The host in the disconnected environment has access to the target mirror registry. You have set the umask parameter to 0022 on the operating system that uses oc-mirror. You have installed the correct binary for the RHEL version that you are using. Procedure Download the oc-mirror CLI plugin: Navigate to the Downloads page of the Red Hat Hybrid Cloud Console. In the OpenShift disconnected installation tools section, select the OS type and Architecture type of the OpenShift Client (oc) mirror plugin from the dropdown menus. Click Download to save the file. Extract the archive by running the following command: USD tar xvzf oc-mirror.tar.gz If necessary, update the plugin file to be executable by running the following command: USD chmod +x oc-mirror Note Do not rename the oc-mirror file. Install the oc-mirror CLI plugin by placing the file in your PATH , for example /usr/local/bin , by running the following command: USD sudo mv oc-mirror /usr/local/bin/. Verification Verify that the oc-mirror plugin v1 is successfully installed by running the following command: USD oc mirror help Additional resources Installing and using CLI plugins 3.5.5.2. Configuring credentials that allow images to be mirrored Create a container image registry credentials file that enables you to mirror images from Red Hat to your mirror. Warning Do not use this image registry credentials file as the pull secret when you install a cluster. If you provide this file when you install cluster, all of the machines in the cluster will have write access to your mirror registry. Prerequisites You configured a mirror registry to use in your disconnected environment. You identified an image repository location on your mirror registry to mirror images into. You provisioned a mirror registry account that allows images to be uploaded to that image repository. You have write access to the mirror registry. Procedure Complete the following steps on the installation host: Download your registry.redhat.io pull secret from Red Hat OpenShift Cluster Manager . Make a copy of your pull secret in JSON format by running the following command: USD cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1 1 Specify the path to the folder to store the pull secret in and a name for the JSON file that you create. Example pull secret { "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } Save the file as either ~/.docker/config.json or USDXDG_RUNTIME_DIR/containers/auth.json : If the .docker or USDXDG_RUNTIME_DIR/containers directories do not exist, create one by entering the following command: USD mkdir -p <directory_name> Where <directory_name> is either ~/.docker or USDXDG_RUNTIME_DIR/containers . Copy the pull secret to the appropriate directory by entering the following command: USD cp <path>/<pull_secret_file_in_json> <directory_name>/<auth_file> Where <directory_name> is either ~/.docker or USDXDG_RUNTIME_DIR/containers , and <auth_file> is either config.json or auth.json . Generate the base64-encoded user name and password or token for your mirror registry by running the following command: USD echo -n '<user_name>:<password>' | base64 -w0 1 1 For <user_name> and <password> , specify the user name and password that you configured for your registry. Example output BGVtbYk3ZHAtqXs= Edit the JSON file and add a section that describes your registry to it: "auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } }, 1 Specify the registry domain name, and optionally the port, that your mirror registry uses to serve content. For example, registry.example.com or registry.example.com:8443 2 Specify the base64-encoded user name and password for the mirror registry. Example modified pull secret { "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } 3.5.6. Creating the image set configuration Before you can use the oc-mirror plugin to mirror image sets, you must create an image set configuration file. This image set configuration file defines which OpenShift Container Platform releases, Operators, and other images to mirror, along with other configuration settings for the oc-mirror plugin. You must specify a storage backend in the image set configuration file. This storage backend can be a local directory or a registry that supports Docker v2-2 . The oc-mirror plugin stores metadata in this storage backend during image set creation. Important Do not delete or modify the metadata that is generated by the oc-mirror plugin. You must use the same storage backend every time you run the oc-mirror plugin for the same mirror registry. Prerequisites You have created a container image registry credentials file. For instructions, see "Configuring credentials that allow images to be mirrored". Procedure Use the oc mirror init command to create a template for the image set configuration and save it to a file called imageset-config.yaml : USD oc mirror init --registry <storage_backend> > imageset-config.yaml 1 1 Specifies the location of your storage backend, such as example.com/mirror/oc-mirror-metadata . Edit the file and adjust the settings as necessary: kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 archiveSize: 4 1 storageConfig: 2 registry: imageURL: example.com/mirror/oc-mirror-metadata 3 skipTLS: false mirror: platform: channels: - name: stable-4.18 4 type: ocp graph: true 5 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 6 packages: - name: serverless-operator 7 channels: - name: stable 8 additionalImages: - name: registry.redhat.io/ubi9/ubi:latest 9 helm: {} 1 Add archiveSize to set the maximum size, in GiB, of each file within the image set. 2 Set the back-end location to save the image set metadata to. This location can be a registry or local directory. It is required to specify storageConfig values. 3 Set the registry URL for the storage backend. 4 Set the channel to retrieve the OpenShift Container Platform images from. 5 Add graph: true to build and push the graph-data image to the mirror registry. The graph-data image is required to create OpenShift Update Service (OSUS). The graph: true field also generates the UpdateService custom resource manifest. The oc command-line interface (CLI) can use the UpdateService custom resource manifest to create OSUS. For more information, see About the OpenShift Update Service . 6 Set the Operator catalog to retrieve the OpenShift Container Platform images from. 7 Specify only certain Operator packages to include in the image set. Remove this field to retrieve all packages in the catalog. 8 Specify only certain channels of the Operator packages to include in the image set. You must always include the default channel for the Operator package even if you do not use the bundles in that channel. You can find the default channel by running the following command: oc mirror list operators --catalog=<catalog_name> --package=<package_name> . 9 Specify any additional images to include in image set. Note The graph: true field also mirrors the ubi-micro image along with other mirrored images. When upgrading OpenShift Container Platform Extended Update Support (EUS) versions, an intermediate version might be required between the current and target versions. For example, if the current version is 4.14 and target version is 4.16 , you might need to include a version such as 4.15.8 in the ImageSetConfiguration when using the oc-mirror plugin v1. The oc-mirror plugin v1 might not always detect this automatically, so check the Cincinnati graph web page to confirm any required intermediate versions and add them manually to your configuration. See "Image set configuration parameters" for the full list of parameters and "Image set configuration examples" for various mirroring use cases. Save the updated file. This image set configuration file is required by the oc mirror command when mirroring content. Additional resources Image set configuration parameters Image set configuration examples Using the OpenShift Update Service in a disconnected environment 3.5.7. Mirroring an image set to a mirror registry You can use the oc-mirror CLI plugin to mirror images to a mirror registry in a partially disconnected environment or in a fully disconnected environment . These procedures assume that you already have your mirror registry set up. 3.5.7.1. Mirroring an image set in a partially disconnected environment In a partially disconnected environment, you can mirror an image set directly to the target mirror registry. 3.5.7.1.1. Mirroring from mirror to mirror You can use the oc-mirror plugin to mirror an image set directly to a target mirror registry that is accessible during image set creation. You are required to specify a storage backend in the image set configuration file. This storage backend can be a local directory or a Docker v2 registry. The oc-mirror plugin stores metadata in this storage backend during image set creation. Important Do not delete or modify the metadata that is generated by the oc-mirror plugin. You must use the same storage backend every time you run the oc-mirror plugin for the same mirror registry. Prerequisites You have access to the internet to get the necessary container images. You have installed the OpenShift CLI ( oc ). You have installed the oc-mirror CLI plugin. You have created the image set configuration file. Procedure Run the oc mirror command to mirror the images from the specified image set configuration to a specified registry: USD oc mirror --config=./<imageset-config.yaml> \ 1 docker://registry.example:5000 2 1 Specify the image set configuration file that you created. For example, imageset-config.yaml . 2 Specify the registry to mirror the image set file to. The registry must start with docker:// . If you specify a top-level namespace for the mirror registry, you must also use this same namespace on subsequent executions. Verification Navigate into the oc-mirror-workspace/ directory that was generated. Navigate into the results directory, for example, results-1639608409/ . Verify that YAML files are present for the ImageContentSourcePolicy and CatalogSource resources. Note The repositoryDigestMirrors section of the ImageContentSourcePolicy YAML file is used for the install-config.yaml file during installation. steps Configure your cluster to use the resources generated by oc-mirror. Troubleshooting Unable to retrieve source image . 3.5.7.2. Mirroring an image set in a fully disconnected environment To mirror an image set in a fully disconnected environment, you must first mirror the image set to disk , then mirror the image set file on disk to a mirror . 3.5.7.2.1. Mirroring from mirror to disk You can use the oc-mirror plugin to generate an image set and save the contents to disk. The generated image set can then be transferred to the disconnected environment and mirrored to the target registry. Important Depending on the configuration specified in the image set configuration file, using oc-mirror to mirror images might download several hundreds of gigabytes of data to disk. The initial image set download when you populate the mirror registry is often the largest. Because you only download the images that changed since the last time you ran the command, when you run the oc-mirror plugin again, the generated image set is often smaller. You are required to specify a storage backend in the image set configuration file. This storage backend can be a local directory or a docker v2 registry. The oc-mirror plugin stores metadata in this storage backend during image set creation. Important Do not delete or modify the metadata that is generated by the oc-mirror plugin. You must use the same storage backend every time you run the oc-mirror plugin for the same mirror registry. Prerequisites You have access to the internet to obtain the necessary container images. You have installed the OpenShift CLI ( oc ). You have installed the oc-mirror CLI plugin. You have created the image set configuration file. Procedure Run the oc mirror command to mirror the images from the specified image set configuration to disk: USD oc mirror --config=./imageset-config.yaml \ 1 file://<path_to_output_directory> 2 1 Pass in the image set configuration file that was created. This procedure assumes that it is named imageset-config.yaml . 2 Specify the target directory where you want to output the image set file. The target directory path must start with file:// . Verification Navigate to your output directory: USD cd <path_to_output_directory> Verify that an image set .tar file was created: USD ls Example output mirror_seq1_000000.tar steps Transfer the image set .tar file to the disconnected environment. Troubleshooting Unable to retrieve source image . 3.5.7.2.2. Mirroring from disk to mirror You can use the oc-mirror plugin to mirror the contents of a generated image set to the target mirror registry. Prerequisites You have installed the OpenShift CLI ( oc ) in the disconnected environment. You have installed the oc-mirror CLI plugin in the disconnected environment. You have generated the image set file by using the oc mirror command. You have transferred the image set file to the disconnected environment. Procedure Run the oc mirror command to process the image set file on disk and mirror the contents to a target mirror registry: USD oc mirror --from=./mirror_seq1_000000.tar \ 1 docker://registry.example:5000 2 1 Pass in the image set .tar file to mirror, named mirror_seq1_000000.tar in this example. If an archiveSize value was specified in the image set configuration file, the image set might be broken up into multiple .tar files. In this situation, you can pass in a directory that contains the image set .tar files. 2 Specify the registry to mirror the image set file to. The registry must start with docker:// . If you specify a top-level namespace for the mirror registry, you must also use this same namespace on subsequent executions. This command updates the mirror registry with the image set and generates the ImageContentSourcePolicy and CatalogSource resources. Verification Navigate into the oc-mirror-workspace/ directory that was generated. Navigate into the results directory, for example, results-1639608409/ . Verify that YAML files are present for the ImageContentSourcePolicy and CatalogSource resources. steps Configure your cluster to use the resources generated by oc-mirror. Troubleshooting Unable to retrieve source image . 3.5.8. Configuring your cluster to use the resources generated by oc-mirror After you have mirrored your image set to the mirror registry, you must apply the generated ImageContentSourcePolicy , CatalogSource , and release image signature resources into the cluster. The ImageContentSourcePolicy resource associates the mirror registry with the source registry and redirects image pull requests from the online registries to the mirror registry. The CatalogSource resource is used by Operator Lifecycle Manager (OLM) Classic to retrieve information about the available Operators in the mirror registry. The release image signatures are used to verify the mirrored release images. Note OLM v1 uses the ClusterCatalog resource to retrieve information about the available cluster extensions in the mirror registry. The oc-mirror plugin v1 does not generate ClusterCatalog resources automatically; you must manually create them. For more information on creating and applying ClusterCatalog resources, see "Adding a catalog to a cluster" in "Extensions". Prerequisites You have mirrored the image set to the registry mirror in the disconnected environment. You have access to the cluster as a user with the cluster-admin role. Procedure Log in to OpenShift CLI ( oc ) as a user with the cluster-admin role. Apply the YAML files from the results directory to the cluster by running the following command: USD oc apply -f ./oc-mirror-workspace/results-1639608409/ If you mirrored release images, apply the release image signatures to the cluster by running the following command: USD oc apply -f ./oc-mirror-workspace/results-1639608409/release-signatures/ Note If you are mirroring Operators instead of clusters, you do not need to run USD oc apply -f ./oc-mirror-workspace/results-1639608409/release-signatures/ . Running that command will return an error, as there are no release image signatures to apply. Verification Verify that the ImageContentSourcePolicy resources were successfully installed by running the following command: USD oc get imagecontentsourcepolicy Verify that the CatalogSource resources were successfully installed by running the following command: USD oc get catalogsource -n openshift-marketplace Additional resources Adding a catalog to a cluster in "Extensions" 3.5.9. Updating your mirror registry content You can update your mirror registry content by updating the image set configuration file and mirroring the image set to the mirror registry. The time that you run the oc-mirror plugin, an image set is generated that only contains new and updated images since the execution. While updating the mirror registry, you must take into account the following considerations: Images are pruned from the target mirror registry if they are no longer included in the latest image set that was generated and mirrored. Therefore, ensure that you are updating images for the same combination of the following key components so that only a differential image set is created and mirrored: Image set configuration Destination registry Storage configuration The images can be pruned in case of disk to mirror or mirror to mirror workflow. The generated image sets must be pushed to the target mirror registry in sequence. You can derive the sequence number from the file name of the generated image set archive file. Do not delete or modify the metadata image that is generated by the oc-mirror plugin. If you specified a top-level namespace for the mirror registry during the initial image set creation, then you must use this same namespace every time you run the oc-mirror plugin for the same mirror registry. For more information about the workflow to update the mirror registry content, see the "High level workflow" section. 3.5.9.1. Mirror registry update examples This section covers the use cases for updating the mirror registry from disk to mirror. Example ImageSetConfiguration file that was previously used for mirroring apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable Mirroring a specific OpenShift Container Platform version by pruning the existing images Updated ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.13 1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable 1 Replacing by stable-4.13 prunes all the images of stable-4.12 . Updating to the latest version of an Operator by pruning the existing images Updated ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable 1 1 Using the same channel without specifying a version prunes the existing images and updates with the latest version of images. Mirroring a new Operator by pruning the existing Operator Updated ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: <new_operator_name> 1 channels: - name: stable 1 Replacing rhacs-operator with new_operator_name prunes the Red Hat Advanced Cluster Security for Kubernetes Operator. Pruning all the OpenShift Container Platform images Updated ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: Additional resources Image set configuration examples Mirroring an image set in a partially disconnected environment Mirroring an image set in a fully disconnected environment Configuring your cluster to use the resources generated by oc-mirror 3.5.10. Performing a dry run You can use oc-mirror to perform a dry run, without actually mirroring any images. This allows you to review the list of images that would be mirrored, as well as any images that would be pruned from the mirror registry. A dry run also allows you to catch any errors with your image set configuration early or use the generated list of images with other tools to carry out the mirroring operation. Prerequisites You have access to the internet to obtain the necessary container images. You have installed the OpenShift CLI ( oc ). You have installed the oc-mirror CLI plugin. You have created the image set configuration file. Procedure Run the oc mirror command with the --dry-run flag to perform a dry run: USD oc mirror --config=./imageset-config.yaml \ 1 docker://registry.example:5000 \ 2 --dry-run 3 1 Pass in the image set configuration file that was created. This procedure assumes that it is named imageset-config.yaml . 2 Specify the mirror registry. Nothing is mirrored to this registry as long as you use the --dry-run flag. 3 Use the --dry-run flag to generate the dry run artifacts and not an actual image set file. Example output Checking push permissions for registry.example:5000 Creating directory: oc-mirror-workspace/src/publish Creating directory: oc-mirror-workspace/src/v2 Creating directory: oc-mirror-workspace/src/charts Creating directory: oc-mirror-workspace/src/release-signatures No metadata detected, creating new workspace wrote mirroring manifests to oc-mirror-workspace/operators.1658342351/manifests-redhat-operator-index ... info: Planning completed in 31.48s info: Dry run complete Writing image mapping to oc-mirror-workspace/mapping.txt Navigate into the workspace directory that was generated: USD cd oc-mirror-workspace/ Review the mapping.txt file that was generated. This file contains a list of all images that would be mirrored. Review the pruning-plan.json file that was generated. This file contains a list of all images that would be pruned from the mirror registry when the image set is published. Note The pruning-plan.json file is only generated if your oc-mirror command points to your mirror registry and there are images to be pruned. 3.5.11. Including local OCI Operator catalogs While mirroring OpenShift Container Platform releases, Operator catalogs, and additional images from a registry to a partially disconnected cluster, you can include Operator catalog images from a local file-based catalog on disk. The local catalog must be in the Open Container Initiative (OCI) format. The local catalog and its contents are mirrored to your target mirror registry based on the filtering information in the image set configuration file. Important When mirroring local OCI catalogs, any OpenShift Container Platform releases or additional images that you want to mirror along with the local OCI-formatted catalog must be pulled from a registry. You cannot mirror OCI catalogs along with an oc-mirror image set file on disk. One example use case for using the OCI feature is if you have a CI/CD system building an OCI catalog to a location on disk, and you want to mirror that OCI catalog along with an OpenShift Container Platform release to your mirror registry. Note If you used the Technology Preview OCI local catalogs feature for the oc-mirror plugin for OpenShift Container Platform 4.12, you can no longer use the OCI local catalogs feature of the oc-mirror plugin to copy a catalog locally and convert it to OCI format as a first step to mirroring to a fully disconnected cluster. Prerequisites You have access to the internet to obtain the necessary container images. You have installed the OpenShift CLI ( oc ). You have installed the oc-mirror CLI plugin. Procedure Create the image set configuration file and adjust the settings as necessary. The following example image set configuration mirrors an OCI catalog on disk along with an OpenShift Container Platform release and a UBI image from registry.redhat.io . kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: local: path: /home/user/metadata 1 mirror: platform: channels: - name: stable-4.18 2 type: ocp graph: false operators: - catalog: oci:///home/user/oc-mirror/my-oci-catalog 3 targetCatalog: my-namespace/redhat-operator-index 4 packages: - name: aws-load-balancer-operator - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 5 packages: - name: rhacs-operator additionalImages: - name: registry.redhat.io/ubi9/ubi:latest 6 1 Set the back-end location to save the image set metadata to. This location can be a registry or local directory. It is required to specify storageConfig values. 2 Optionally, include an OpenShift Container Platform release to mirror from registry.redhat.io . 3 Specify the absolute path to the location of the OCI catalog on disk. The path must start with oci:// when using the OCI feature. 4 Optionally, specify an alternative namespace and name to mirror the catalog as. 5 Optionally, specify additional Operator catalogs to pull from a registry. 6 Optionally, specify additional images to pull from a registry. Run the oc mirror command to mirror the OCI catalog to a target mirror registry: USD oc mirror --config=./imageset-config.yaml \ 1 docker://registry.example:5000 2 1 Pass in the image set configuration file. This procedure assumes that it is named imageset-config.yaml . 2 Specify the registry to mirror the content to. The registry must start with docker:// . If you specify a top-level namespace for the mirror registry, you must also use this same namespace on subsequent executions. Optionally, you can specify other flags to adjust the behavior of the OCI feature: --oci-insecure-signature-policy Do not push signatures to the target mirror registry. --oci-registries-config Specify the path to a TOML-formatted registries.conf file. You can use this to mirror from a different registry, such as a pre-production location for testing, without having to change the image set configuration file. This flag only affects local OCI catalogs, not any other mirrored content. Example registries.conf file [[registry]] location = "registry.redhat.io:5000" insecure = false blocked = false mirror-by-digest-only = true prefix = "" [[registry.mirror]] location = "preprod-registry.example.com" insecure = false steps Configure your cluster to use the resources generated by oc-mirror. Additional resources Configuring your cluster to use the resources generated by oc-mirror 3.5.12. Image set configuration parameters The oc-mirror plugin requires an image set configuration file that defines what images to mirror. The following table lists the available parameters for the ImageSetConfiguration resource. Table 3.7. ImageSetConfiguration parameters Parameter Description Values apiVersion The API version for the ImageSetConfiguration content. String. For example: mirror.openshift.io/v1alpha2 . archiveSize The maximum size, in GiB, of each archive file within the image set. Integer. For example: 4 mirror The configuration of the image set. Object mirror.additionalImages The additional images configuration of the image set. Array of objects. For example: additionalImages: - name: registry.redhat.io/ubi8/ubi:latest mirror.additionalImages.name The tag or digest of the image to mirror. String. For example: registry.redhat.io/ubi8/ubi:latest mirror.blockedImages The full tag, digest, or pattern of images to block from mirroring. Array of strings. For example: docker.io/library/alpine mirror.helm The helm configuration of the image set. Note that the oc-mirror plugin supports only helm charts that do not require user input when rendered. Object mirror.helm.local The local helm charts to mirror. Array of objects. For example: local: - name: podinfo path: /test/podinfo-5.0.0.tar.gz mirror.helm.local.name The name of the local helm chart to mirror. String. For example: podinfo . mirror.helm.local.path The path of the local helm chart to mirror. String. For example: /test/podinfo-5.0.0.tar.gz . mirror.helm.repositories The remote helm repositories to mirror from. Array of objects. For example: repositories: - name: podinfo url: https://example.github.io/podinfo charts: - name: podinfo version: 5.0.0 mirror.helm.repositories.name The name of the helm repository to mirror from. String. For example: podinfo . mirror.helm.repositories.url The URL of the helm repository to mirror from. String. For example: https://example.github.io/podinfo . mirror.helm.repositories.charts The remote helm charts to mirror. Array of objects. mirror.helm.repositories.charts.name The name of the helm chart to mirror. String. For example: podinfo . mirror.helm.repositories.charts.version The version of the named helm chart to mirror. String. For example: 5.0.0 . mirror.operators The Operators configuration of the image set. Array of objects. For example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator minVersion: '2.4.0' mirror.operators.catalog The Operator catalog to include in the image set. String. For example: registry.redhat.io/redhat/redhat-operator-index:v4.18 . mirror.operators.full When true , downloads the full catalog, Operator package, or Operator channel. Boolean. The default value is false . mirror.operators.packages The Operator packages configuration. Array of objects. For example: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator minVersion: '5.2.3-31' mirror.operators.packages.name The Operator package name to include in the image set String. For example: elasticsearch-operator . mirror.operators.packages.channels The Operator package channel configuration. Object mirror.operators.packages.channels.name The Operator channel name, unique within a package, to include in the image set. String. For example: fast or stable-v4.18 . mirror.operators.packages.channels.maxVersion The highest version of the Operator mirror across all channels in which it exists. See the following note for further information. String. For example: 5.2.3-31 mirror.operators.packages.channels.minBundle The name of the minimum bundle to include, plus all bundles in the update graph to the channel head. Set this field only if the named bundle has no semantic version metadata. String. For example: bundleName mirror.operators.packages.channels.minVersion The lowest version of the Operator to mirror across all channels in which it exists. See the following note for further information. String. For example: 5.2.3-31 mirror.operators.packages.maxVersion The highest version of the Operator to mirror across all channels in which it exists. See the following note for further information. String. For example: 5.2.3-31 . mirror.operators.packages.minVersion The lowest version of the Operator to mirror across all channels in which it exists. See the following note for further information. String. For example: 5.2.3-31 . mirror.operators.skipDependencies If true , dependencies of bundles are not included. Boolean. The default value is false . mirror.operators.targetCatalog An alternative name and optional namespace hierarchy to mirror the referenced catalog as. String. For example: my-namespace/my-operator-catalog mirror.operators.targetName An alternative name to mirror the referenced catalog as. The targetName parameter is deprecated. Use the targetCatalog parameter instead. String. For example: my-operator-catalog mirror.operators.targetTag An alternative tag to append to the targetName or targetCatalog . String. For example: v1 mirror.platform The platform configuration of the image set. Object mirror.platform.architectures The architecture of the platform release payload to mirror. Array of strings. For example: architectures: - amd64 - arm64 - multi - ppc64le - s390x The default value is amd64 . The value multi ensures that the mirroring is supported for all available architectures, eliminating the need to specify individual architectures. mirror.platform.channels The platform channel configuration of the image set. Array of objects. For example: channels: - name: stable-4.10 - name: stable-4.18 mirror.platform.channels.full When true , sets the minVersion to the first release in the channel and the maxVersion to the last release in the channel. Boolean. The default value is false . mirror.platform.channels.name The name of the release channel. String. For example: stable-4.18 mirror.platform.channels.minVersion The minimum version of the referenced platform to be mirrored. String. For example: 4.12.6 mirror.platform.channels.maxVersion The highest version of the referenced platform to be mirrored. String. For example: 4.18.1 mirror.platform.channels.shortestPath Toggles shortest path mirroring or full range mirroring. Boolean. The default value is false . mirror.platform.channels.type The type of the platform to be mirrored. String. For example: ocp or okd . The default is ocp . mirror.platform.graph Indicates whether the OSUS graph is added to the image set and subsequently published to the mirror. Boolean. The default value is false . storageConfig The back-end configuration of the image set. Object storageConfig.local The local back-end configuration of the image set. Object storageConfig.local.path The path of the directory to contain the image set metadata. String. For example: ./path/to/dir/ . storageConfig.registry The registry back-end configuration of the image set. Object storageConfig.registry.imageURL The back-end registry URI. Can optionally include a namespace reference in the URI. String. For example: quay.io/myuser/imageset:metadata . storageConfig.registry.skipTLS Optionally skip TLS verification of the referenced back-end registry. Boolean. The default value is false . Note Using the minVersion and maxVersion properties to filter for a specific Operator version range can result in a multiple channel heads error. The error message states that there are multiple channel heads . This is because when the filter is applied, the update graph of the Operator is truncated. Operator Lifecycle Manager requires that every Operator channel contains versions that form an update graph with exactly one end point, that is, the latest version of the Operator. When the filter range is applied, that graph can turn into two or more separate graphs or a graph that has more than one end point. To avoid this error, do not filter out the latest version of an Operator. If you still run into the error, depending on the Operator, either the maxVersion property must be increased or the minVersion property must be decreased. Because every Operator graph can be different, you might need to adjust these values until the error resolves. 3.5.13. Image set configuration examples The following ImageSetConfiguration file examples show the configuration for various mirroring use cases. Use case: Including the shortest OpenShift Container Platform update path The following ImageSetConfiguration file uses a local storage backend and includes all OpenShift Container Platform versions along the shortest update path from the minimum version of 4.11.37 to the maximum version of 4.12.15 . Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.11.37 maxVersion: 4.12.15 shortestPath: true Use case: Including all versions of OpenShift Container Platform from a minimum to the latest version for multi-architecture releases The following ImageSetConfiguration file uses a registry storage backend and includes all OpenShift Container Platform versions starting at a minimum version of 4.13.4 to the latest version in the channel. On every invocation of oc-mirror with this image set configuration, the latest release of the stable-4.13 channel is evaluated, so running oc-mirror at regular intervals ensures that you automatically receive the latest releases of OpenShift Container Platform images. By setting the value of platform.architectures to multi , you can ensure that the mirroring is supported for multi-architecture releases. Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: platform: architectures: - "multi" channels: - name: stable-4.13 minVersion: 4.13.4 maxVersion: 4.13.6 Use case: Including Operator versions from a minimum to the latest The following ImageSetConfiguration file uses a local storage backend and includes only the Red Hat Advanced Cluster Security for Kubernetes Operator, versions starting at 4.0.1 and later in the stable channel. Note When you specify a minimum or maximum version range, you might not receive all Operator versions in that range. By default, oc-mirror excludes any versions that are skipped or replaced by a newer version in the Operator Lifecycle Manager (OLM) specification. Operator versions that are skipped might be affected by a CVE or contain bugs. Use a newer version instead. For more information on skipped and replaced versions, see Creating an update graph with OLM . To receive all Operator versions in a specified range, you can set the mirror.operators.full field to true . Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: rhacs-operator channels: - name: stable minVersion: 4.0.1 Note To specify a maximum version instead of the latest, set the mirror.operators.packages.channels.maxVersion field. Use case: Including the Nutanix CSI Operator The following ImageSetConfiguration file uses a local storage backend and includes the Nutanix CSI Operator, the OpenShift Update Service (OSUS) graph image, and an additional Red Hat Universal Base Image (UBI). Example ImageSetConfiguration file kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: registry: imageURL: mylocalregistry/ocp-mirror/openshift4 skipTLS: false mirror: platform: channels: - name: stable-4.11 type: ocp graph: true operators: - catalog: registry.redhat.io/redhat/certified-operator-index:v4.18 packages: - name: nutanixcsioperator channels: - name: stable additionalImages: - name: registry.redhat.io/ubi9/ubi:latest Use case: Including the default Operator channel The following ImageSetConfiguration file includes the stable-5.7 and stable channels for the OpenShift Elasticsearch Operator. Even if only the packages from the stable-5.7 channel are needed, the stable channel must also be included in the ImageSetConfiguration file, because it is the default channel for the Operator. You must always include the default channel for the Operator package even if you do not use the bundles in that channel. Tip You can find the default channel by running the following command: oc mirror list operators --catalog=<catalog_name> --package=<package_name> . Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator channels: - name: stable-5.7 - name: stable Use case: Including an entire catalog (all versions) The following ImageSetConfiguration file sets the mirror.operators.full field to true to include all versions for an entire Operator catalog. Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 full: true Use case: Including an entire catalog (channel heads only) The following ImageSetConfiguration file includes the channel heads for an entire Operator catalog. By default, for each Operator in the catalog, oc-mirror includes the latest Operator version (channel head) from the default channel. If you want to mirror all Operator versions, and not just the channel heads, you must set the mirror.operators.full field to true . This example also uses the targetCatalog field to specify an alternative namespace and name to mirror the catalog as. Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 targetCatalog: my-namespace/my-operator-catalog Use case: Including arbitrary images and helm charts The following ImageSetConfiguration file uses a registry storage backend and includes helm charts and an additional Red Hat Universal Base Image (UBI). Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration archiveSize: 4 storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: platform: architectures: - "s390x" channels: - name: stable-4.18 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 helm: repositories: - name: redhat-helm-charts url: https://raw.githubusercontent.com/redhat-developer/redhat-helm-charts/master charts: - name: ibm-mongodb-enterprise-helm version: 0.2.0 additionalImages: - name: registry.redhat.io/ubi9/ubi:latest Use case: Including the upgrade path for EUS releases The following ImageSetConfiguration file includes the eus-<version> channel, where the maxVersion value is at least two minor versions higher than the minVersion value. For example, in this ImageSetConfiguration file, the minVersion is set to 4.12.28 , while the maxVersion for the eus-4.14 channel is 4.14.16 . Example ImageSetConfiguration file kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: graph: true # Required for the OSUS Operator architectures: - amd64 channels: - name: stable-4.12 minVersion: '4.12.28' maxVersion: '4.12.28' shortestPath: true type: ocp - name: eus-4.14 minVersion: '4.12.28' maxVersion: '4.14.16' shortestPath: true type: ocp Use case: Including the multi-arch OpenShift Container Platform images and catalog for multicluster engine Operator The following ImageSetConfiguration file includes multicluster engine for Kubernetes Operator and all OpenShift Container Platform versions starting at a minimum version of 4.18.0 in the channel. Example ImageSetConfiguration file apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: agent.agent.example.com:5000/openshift/release/metadata:latest/openshift/release/metadata:latest mirror: platform: architectures: - "multi" channels: - name: stable-4.18 minVersion: 4.18.0 maxVersion: 4.18.1 type: ocp operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: multicluster-engine 3.5.14. Command reference for oc-mirror The following tables describe the oc mirror subcommands and flags: Table 3.8. oc mirror subcommands Subcommand Description completion Generate the autocompletion script for the specified shell. describe Output the contents of an image set. help Show help about any subcommand. init Output an initial image set configuration template. list List available platform and Operator content and their version. version Output the oc-mirror version. Table 3.9. oc mirror flags Flag Description -c , --config <string> Specify the path to an image set configuration file. --continue-on-error If any non image-pull related error occurs, continue and attempt to mirror as much as possible. --dest-skip-tls Disable TLS validation for the target registry. --dest-use-http Use plain HTTP for the target registry. --dry-run Print actions without mirroring images. Generates mapping.txt and pruning-plan.json files. --from <string> Specify the path to an image set archive that was generated by an execution of oc-mirror to load into a target registry. -h , --help Show the help. --ignore-history Ignore past mirrors when downloading images and packing layers. Disables incremental mirroring and might download more data. --manifests-only Generate manifests for ImageContentSourcePolicy objects to configure a cluster to use the mirror registry, but do not actually mirror any images. To use this flag, you must pass in an image set archive with the --from flag. --max-nested-paths <int> Specify the maximum number of nested paths for destination registries that limit nested paths. The default is 0 . --max-per-registry <int> Specify the number of concurrent requests allowed per registry. The default is 6 . --oci-insecure-signature-policy Do not push signatures when mirroring local OCI catalogs (with --include-local-oci-catalogs ). --oci-registries-config Provide a registries configuration file to specify an alternative registry location to copy from when mirroring local OCI catalogs (with --include-local-oci-catalogs ). --skip-cleanup Skip removal of artifact directories. --skip-image-pin Do not replace image tags with digest pins in Operator catalogs. --skip-metadata-check Skip metadata when publishing an image set. This is only recommended when the image set was created with --ignore-history . --skip-missing If an image is not found, skip it instead of reporting an error and aborting execution. Does not apply to custom images explicitly specified in the image set configuration. --skip-pruning Disable automatic pruning of images from the target mirror registry. --skip-verification Skip digest verification. --source-skip-tls Disable TLS validation for the source registry. --source-use-http Use plain HTTP for the source registry. -v , --verbose <int> Specify the number for the log level verbosity. Valid values are 0 - 9 . The default is 0 . 3.5.15. Additional resources About cluster updates in a disconnected environment 3.6. Mirroring images for a disconnected installation by using the oc adm command You can ensure your clusters only use container images that satisfy your organizational controls on external content. Before you install a cluster on infrastructure that you provision in a restricted network, you must mirror the required container images into that environment. By using the oc adm command, you can mirror release and catalog images in OpenShift. To mirror container images, you must have a registry for mirroring. Important You must have access to the internet to obtain the necessary container images. In this procedure, you place your mirror registry on a mirror host that has access to both your network and the internet. If you do not have access to a mirror host, use the Mirroring Operator catalogs for use with disconnected clusters procedure to copy images to a device you can move across network boundaries with. 3.6.1. Prerequisites You must have a container image registry that supports Docker v2-2 in the location that will host the OpenShift Container Platform cluster, such as one of the following registries: Red Hat Quay JFrog Artifactory Sonatype Nexus Repository Harbor If you have an entitlement to Red Hat Quay, see the documentation on deploying Red Hat Quay for proof-of-concept purposes or by using the Red Hat Quay Operator . If you need additional assistance selecting and installing a registry, contact your sales representative or Red Hat Support. If you do not already have an existing solution for a container image registry, subscribers of OpenShift Container Platform are provided a mirror registry for Red Hat OpenShift . The mirror registry for Red Hat OpenShift is included with your subscription and is a small-scale container registry that can be used to mirror the required container images of OpenShift Container Platform in disconnected installations. 3.6.2. About the mirror registry You can mirror the images that are required for OpenShift Container Platform installation and subsequent product updates to a container mirror registry such as Red Hat Quay, JFrog Artifactory, Sonatype Nexus Repository, or Harbor. If you do not have access to a large-scale container registry, you can use the mirror registry for Red Hat OpenShift , a small-scale container registry included with OpenShift Container Platform subscriptions. You can use any container registry that supports Docker v2-2 , such as Red Hat Quay, the mirror registry for Red Hat OpenShift , Artifactory, Sonatype Nexus Repository, or Harbor. Regardless of your chosen registry, the procedure to mirror content from Red Hat hosted sites on the internet to an isolated image registry is the same. After you mirror the content, you configure each cluster to retrieve this content from your mirror registry. Important The OpenShift image registry cannot be used as the target registry because it does not support pushing without a tag, which is required during the mirroring process. If choosing a container registry that is not the mirror registry for Red Hat OpenShift , it must be reachable by every machine in the clusters that you provision. If the registry is unreachable, installation, updating, or normal operations such as workload relocation might fail. For that reason, you must run mirror registries in a highly available way, and the mirror registries must at least match the production availability of your OpenShift Container Platform clusters. When you populate your mirror registry with OpenShift Container Platform images, you can follow two scenarios. If you have a host that can access both the internet and your mirror registry, but not your cluster nodes, you can directly mirror the content from that machine. This process is referred to as connected mirroring . If you have no such host, you must mirror the images to a file system and then bring that host or removable media into your restricted environment. This process is referred to as disconnected mirroring . For mirrored registries, to view the source of pulled images, you must review the Trying to access log entry in the CRI-O logs. Other methods to view the image pull source, such as using the crictl images command on a node, show the non-mirrored image name, even though the image is pulled from the mirrored location. Note Red Hat does not test third party registries with OpenShift Container Platform. Additional information For information about viewing the CRI-O logs to view the image source, see Viewing the image pull source . 3.6.3. Preparing your mirror host Before you perform the mirror procedure, you must prepare the host to retrieve content and push it to the remote location. 3.6.3.1. Installing the OpenShift CLI You can install the OpenShift CLI ( oc ) to interact with OpenShift Container Platform from a command-line interface. You can install oc on Linux, Windows, or macOS. Important If you installed an earlier version of oc , you cannot use it to complete all of the commands in OpenShift Container Platform 4.18. Download and install the new version of oc . Installing the OpenShift CLI on Linux You can install the OpenShift CLI ( oc ) binary on Linux by using the following procedure. Procedure Navigate to the OpenShift Container Platform downloads page on the Red Hat Customer Portal. Select the architecture from the Product Variant drop-down list. Select the appropriate version from the Version drop-down list. Click Download Now to the OpenShift v4.18 Linux Clients entry and save the file. Unpack the archive: USD tar xvf <file> Place the oc binary in a directory that is on your PATH . To check your PATH , execute the following command: USD echo USDPATH Verification After you install the OpenShift CLI, it is available using the oc command: USD oc <command> Installing the OpenShift CLI on Windows You can install the OpenShift CLI ( oc ) binary on Windows by using the following procedure. Procedure Navigate to the OpenShift Container Platform downloads page on the Red Hat Customer Portal. Select the appropriate version from the Version drop-down list. Click Download Now to the OpenShift v4.18 Windows Client entry and save the file. Unzip the archive with a ZIP program. Move the oc binary to a directory that is on your PATH . To check your PATH , open the command prompt and execute the following command: C:\> path Verification After you install the OpenShift CLI, it is available using the oc command: C:\> oc <command> Installing the OpenShift CLI on macOS You can install the OpenShift CLI ( oc ) binary on macOS by using the following procedure. Procedure Navigate to the OpenShift Container Platform downloads page on the Red Hat Customer Portal. Select the appropriate version from the Version drop-down list. Click Download Now to the OpenShift v4.18 macOS Clients entry and save the file. Note For macOS arm64, choose the OpenShift v4.18 macOS arm64 Client entry. Unpack and unzip the archive. Move the oc binary to a directory on your PATH. To check your PATH , open a terminal and execute the following command: USD echo USDPATH Verification Verify your installation by using an oc command: USD oc <command> 3.6.4. Configuring credentials that allow images to be mirrored Create a container image registry credentials file that enables you to mirror images from Red Hat to your mirror. Warning Do not use this image registry credentials file as the pull secret when you install a cluster. If you provide this file when you install cluster, all of the machines in the cluster will have write access to your mirror registry. Prerequisites You configured a mirror registry to use in your disconnected environment. You identified an image repository location on your mirror registry to mirror images into. You provisioned a mirror registry account that allows images to be uploaded to that image repository. You have write access to the mirror registry. Procedure Complete the following steps on the installation host: Download your registry.redhat.io pull secret from Red Hat OpenShift Cluster Manager . Make a copy of your pull secret in JSON format by running the following command: USD cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1 1 Specify the path to the folder to store the pull secret in and a name for the JSON file that you create. Example pull secret { "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } Generate the base64-encoded user name and password or token for your mirror registry by running the following command: USD echo -n '<user_name>:<password>' | base64 -w0 1 1 For <user_name> and <password> , specify the user name and password that you configured for your registry. Example output BGVtbYk3ZHAtqXs= Edit the JSON file and add a section that describes your registry to it: "auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } }, 1 Specify the registry domain name, and optionally the port, that your mirror registry uses to serve content. For example, registry.example.com or registry.example.com:8443 2 Specify the base64-encoded user name and password for the mirror registry. Example modified pull secret { "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } } 3.6.5. Mirroring the OpenShift Container Platform image repository Mirror the OpenShift Container Platform image repository to your registry to use during cluster installation or upgrade. Prerequisites Your mirror host has access to the internet. You configured a mirror registry to use in your restricted network and can access the certificate and credentials that you configured. You downloaded the pull secret from Red Hat OpenShift Cluster Manager and modified it to include authentication to your mirror repository. If you use self-signed certificates, you have specified a Subject Alternative Name in the certificates. Procedure Complete the following steps on the mirror host: Review the OpenShift Container Platform downloads page to determine the version of OpenShift Container Platform that you want to install and determine the corresponding tag on the Repository Tags page. Set the required environment variables: Export the release version: USD OCP_RELEASE=<release_version> For <release_version> , specify the tag that corresponds to the version of OpenShift Container Platform to install, such as 4.5.4 . Export the local registry name and host port: USD LOCAL_REGISTRY='<local_registry_host_name>:<local_registry_host_port>' For <local_registry_host_name> , specify the registry domain name for your mirror repository, and for <local_registry_host_port> , specify the port that it serves content on. Export the local repository name: USD LOCAL_REPOSITORY='<local_repository_name>' For <local_repository_name> , specify the name of the repository to create in your registry, such as ocp4/openshift4 . Export the name of the repository to mirror: USD PRODUCT_REPO='openshift-release-dev' For a production release, you must specify openshift-release-dev . Export the path to your registry pull secret: USD LOCAL_SECRET_JSON='<path_to_pull_secret>' For <path_to_pull_secret> , specify the absolute path to and file name of the pull secret for your mirror registry that you created. Export the release mirror: USD RELEASE_NAME="ocp-release" For a production release, you must specify ocp-release . Export the type of architecture for your cluster: USD ARCHITECTURE=<cluster_architecture> 1 1 Specify the architecture of the cluster, such as x86_64 , aarch64 , s390x , or ppc64le . Export the path to the directory to host the mirrored images: USD REMOVABLE_MEDIA_PATH=<path> 1 1 Specify the full path, including the initial forward slash (/) character. Mirror the version images to the mirror registry: If your mirror host does not have internet access, take the following actions: Connect the removable media to a system that is connected to the internet. Review the images and configuration manifests to mirror: USD oc adm release mirror -a USD{LOCAL_SECRET_JSON} \ --from=quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE} \ --to=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} \ --to-release-image=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE} --dry-run Record the entire imageContentSources section from the output of the command. The information about your mirrors is unique to your mirrored repository, and you must add the imageContentSources section to the install-config.yaml file during installation. Mirror the images to a directory on the removable media: USD oc adm release mirror -a USD{LOCAL_SECRET_JSON} --to-dir=USD{REMOVABLE_MEDIA_PATH}/mirror quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE} Take the media to the restricted network environment and upload the images to the local container registry. USD oc image mirror -a USD{LOCAL_SECRET_JSON} --from-dir=USD{REMOVABLE_MEDIA_PATH}/mirror "file://openshift/release:USD{OCP_RELEASE}*" USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} 1 1 For REMOVABLE_MEDIA_PATH , you must use the same path that you specified when you mirrored the images. Important Running oc image mirror might result in the following error: error: unable to retrieve source image . This error occurs when image indexes include references to images that no longer exist on the image registry. Image indexes might retain older references to allow users running those images an upgrade path to newer points on the upgrade graph. As a temporary workaround, you can use the --skip-missing option to bypass the error and continue downloading the image index. For more information, see Service Mesh Operator mirroring failed . If the local container registry is connected to the mirror host, take the following actions: Directly push the release images to the local registry by using following command: USD oc adm release mirror -a USD{LOCAL_SECRET_JSON} \ --from=quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE} \ --to=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} \ --to-release-image=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE} This command pulls the release information as a digest, and its output includes the imageContentSources data that you require when you install your cluster. Record the entire imageContentSources section from the output of the command. The information about your mirrors is unique to your mirrored repository, and you must add the imageContentSources section to the install-config.yaml file during installation. Note The image name gets patched to Quay.io during the mirroring process, and the podman images will show Quay.io in the registry on the bootstrap virtual machine. To create the installation program that is based on the content that you mirrored, extract it and pin it to the release: If your mirror host does not have internet access, run the following command: USD oc adm release extract -a USD{LOCAL_SECRET_JSON} --icsp-file=<file> --command=openshift-install "USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE}" \ --insecure=true 1 1 Optional: If you do not want to configure trust for the target registry, add the --insecure=true flag. If the local container registry is connected to the mirror host, run the following command: USD oc adm release extract -a USD{LOCAL_SECRET_JSON} --command=openshift-install "USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE}" Important To ensure that you use the correct images for the version of OpenShift Container Platform that you selected, you must extract the installation program from the mirrored content. You must perform this step on a machine with an active internet connection. For clusters using installer-provisioned infrastructure, run the following command: USD openshift-install 3.6.6. The Cluster Samples Operator in a disconnected environment In a disconnected environment, you must take additional steps after you install a cluster to configure the Cluster Samples Operator. Review the following information in preparation. 3.6.6.1. Cluster Samples Operator assistance for mirroring During installation, OpenShift Container Platform creates a config map named imagestreamtag-to-image in the openshift-cluster-samples-operator namespace. The imagestreamtag-to-image config map contains an entry, the populating image, for each image stream tag. The format of the key for each entry in the data field in the config map is <image_stream_name>_<image_stream_tag_name> . During a disconnected installation of OpenShift Container Platform, the status of the Cluster Samples Operator is set to Removed . If you choose to change it to Managed , it installs samples. Note The use of samples in a network-restricted or discontinued environment may require access to services external to your network. Some example services include: Github, Maven Central, npm, RubyGems, PyPi and others. There might be additional steps to take that allow the cluster samples operators's objects to reach the services they require. You can use this config map as a reference for which images need to be mirrored for your image streams to import. While the Cluster Samples Operator is set to Removed , you can create your mirrored registry, or determine which existing mirrored registry you want to use. Mirror the samples you want to the mirrored registry using the new config map as your guide. Add any of the image streams you did not mirror to the skippedImagestreams list of the Cluster Samples Operator configuration object. Set samplesRegistry of the Cluster Samples Operator configuration object to the mirrored registry. Then set the Cluster Samples Operator to Managed to install the image streams you have mirrored. 3.6.7. Mirroring Operator catalogs for use with disconnected clusters You can mirror the Operator contents of a Red Hat-provided catalog, or a custom catalog, into a container image registry using the oc adm catalog mirror command. The target registry must support Docker v2-2 . For a cluster on a restricted network, this registry can be one that the cluster has network access to, such as a mirror registry created during a restricted network cluster installation. Important The OpenShift image registry cannot be used as the target registry because it does not support pushing without a tag, which is required during the mirroring process. Running oc adm catalog mirror might result in the following error: error: unable to retrieve source image . This error occurs when image indexes include references to images that no longer exist on the image registry. Image indexes might retain older references to allow users running those images an upgrade path to newer points on the upgrade graph. As a temporary workaround, you can use the --skip-missing option to bypass the error and continue downloading the image index. For more information, see Service Mesh Operator mirroring failed . The oc adm catalog mirror command also automatically mirrors the index image that is specified during the mirroring process, whether it be a Red Hat-provided index image or your own custom-built index image, to the target registry. You can then use the mirrored index image to create a catalog source that allows Operator Lifecycle Manager (OLM) to load the mirrored catalog onto your OpenShift Container Platform cluster. Additional resources Using Operator Lifecycle Manager in disconnected environments 3.6.7.1. Prerequisites Mirroring Operator catalogs for use with disconnected clusters has the following prerequisites: Workstation with unrestricted network access. podman version 1.9.3 or later. If you want to filter, or prune , an existing catalog and selectively mirror only a subset of Operators, see the following sections: Installing the opm CLI Updating or filtering a file-based catalog image If you want to mirror a Red Hat-provided catalog, run the following command on your workstation with unrestricted network access to authenticate with registry.redhat.io : USD podman login registry.redhat.io Access to a mirror registry that supports Docker v2-2 . On your mirror registry, decide which repository, or namespace, to use for storing mirrored Operator content. For example, you might create an olm-mirror repository. If your mirror registry does not have internet access, connect removable media to your workstation with unrestricted network access. If you are working with private registries, including registry.redhat.io , set the REG_CREDS environment variable to the file path of your registry credentials for use in later steps. For example, for the podman CLI: USD REG_CREDS=USD{XDG_RUNTIME_DIR}/containers/auth.json 3.6.7.2. Extracting and mirroring catalog contents The oc adm catalog mirror command extracts the contents of an index image to generate the manifests required for mirroring. The default behavior of the command generates manifests, then automatically mirrors all of the image content from the index image, as well as the index image itself, to your mirror registry. Alternatively, if your mirror registry is on a completely disconnected, or airgapped , host, you can first mirror the content to removable media, move the media to the disconnected environment, then mirror the content from the media to the registry. 3.6.7.2.1. Mirroring catalog contents to registries on the same network If your mirror registry is co-located on the same network as your workstation with unrestricted network access, take the following actions on your workstation. Procedure If your mirror registry requires authentication, run the following command to log in to the registry: USD podman login <mirror_registry> Run the following command to extract and mirror the content to the mirror registry: USD oc adm catalog mirror \ <index_image> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 [-a USD{REG_CREDS}] \ 3 [--insecure] \ 4 [--index-filter-by-os='<platform>/<arch>'] \ 5 [--manifests-only] 6 1 Specify the index image for the catalog that you want to mirror. 2 Specify the fully qualified domain name (FQDN) for the target registry to mirror the Operator contents to. The mirror registry <repository> can be any existing repository, or namespace, on the registry, for example olm-mirror as outlined in the prerequisites. If there is an existing repository found during mirroring, the repository name is added to the resulting image name. If you do not want the image name to include the repository name, omit the <repository> value from this line, for example <mirror_registry>:<port> . 3 Optional: If required, specify the location of your registry credentials file. {REG_CREDS} is required for registry.redhat.io . 4 Optional: If you do not want to configure trust for the target registry, add the --insecure flag. 5 Optional: Specify which platform and architecture of the index image to select when multiple variants are available. Images are passed as '<platform>/<arch>[/<variant>]' . This does not apply to images referenced by the index. Valid values are linux/amd64 , linux/ppc64le , linux/s390x , linux/arm64 . 6 Optional: Generate only the manifests required for mirroring without actually mirroring the image content to a registry. This option can be useful for reviewing what will be mirrored, and lets you make any changes to the mapping list, if you require only a subset of packages. You can then use the mapping.txt file with the oc image mirror command to mirror the modified list of images in a later step. This flag is intended for only advanced selective mirroring of content from the catalog. Example output src image has index label for database path: /database/index.db using database path mapping: /database/index.db:/tmp/153048078 wrote database to /tmp/153048078 1 ... wrote mirroring manifests to manifests-redhat-operator-index-1614211642 2 1 Directory for the temporary index.db database generated by the command. 2 Record the manifests directory name that is generated. This directory is referenced in subsequent procedures. Note Red Hat Quay does not support nested repositories. As a result, running the oc adm catalog mirror command will fail with a 401 unauthorized error. As a workaround, you can use the --max-components=2 option when running the oc adm catalog mirror command to disable the creation of nested repositories. For more information on this workaround, see the Unauthorized error thrown while using catalog mirror command with Quay registry Knowledgebase Solution. Additional resources Architecture and operating system support for Operators 3.6.7.2.2. Mirroring catalog contents to airgapped registries If your mirror registry is on a completely disconnected, or airgapped, host, take the following actions. Procedure Run the following command on your workstation with unrestricted network access to mirror the content to local files: USD oc adm catalog mirror \ <index_image> \ 1 file:///local/index \ 2 -a USD{REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5 1 Specify the index image for the catalog that you want to mirror. 2 Specify the content to mirror to local files in your current directory. 3 Optional: If required, specify the location of your registry credentials file. 4 Optional: If you do not want to configure trust for the target registry, add the --insecure flag. 5 Optional: Specify which platform and architecture of the index image to select when multiple variants are available. Images are specified as '<platform>/<arch>[/<variant>]' . This does not apply to images referenced by the index. Valid values are linux/amd64 , linux/ppc64le , linux/s390x , linux/arm64 , and .* Example output ... info: Mirroring completed in 5.93s (5.915MB/s) wrote mirroring manifests to manifests-my-index-1614985528 1 To upload local images to a registry, run: oc adm catalog mirror file://local/index/myrepo/my-index:v1 REGISTRY/REPOSITORY 2 1 Record the manifests directory name that is generated. This directory is referenced in subsequent procedures. 2 Record the expanded file:// path that is based on your provided index image. This path is referenced in a subsequent step. This command creates a v2/ directory in your current directory. Copy the v2/ directory to removable media. Physically remove the media and attach it to a host in the disconnected environment that has access to the mirror registry. If your mirror registry requires authentication, run the following command on your host in the disconnected environment to log in to the registry: USD podman login <mirror_registry> Run the following command from the parent directory containing the v2/ directory to upload the images from local files to the mirror registry: USD oc adm catalog mirror \ file://local/index/<repository>/<index_image>:<tag> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 -a USD{REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5 1 Specify the file:// path from the command output. 2 Specify the fully qualified domain name (FQDN) for the target registry to mirror the Operator contents to. The mirror registry <repository> can be any existing repository, or namespace, on the registry, for example olm-mirror as outlined in the prerequisites. If there is an existing repository found during mirroring, the repository name is added to the resulting image name. If you do not want the image name to include the repository name, omit the <repository> value from this line, for example <mirror_registry>:<port> . 3 Optional: If required, specify the location of your registry credentials file. 4 Optional: If you do not want to configure trust for the target registry, add the --insecure flag. 5 Optional: Specify which platform and architecture of the index image to select when multiple variants are available. Images are specified as '<platform>/<arch>[/<variant>]' . This does not apply to images referenced by the index. Valid values are linux/amd64 , linux/ppc64le , linux/s390x , linux/arm64 , and .* Note Red Hat Quay does not support nested repositories. As a result, running the oc adm catalog mirror command will fail with a 401 unauthorized error. As a workaround, you can use the --max-components=2 option when running the oc adm catalog mirror command to disable the creation of nested repositories. For more information on this workaround, see the Unauthorized error thrown while using catalog mirror command with Quay registry Knowledgebase Solution. Run the oc adm catalog mirror command again. Use the newly mirrored index image as the source and the same mirror registry target used in the step: USD oc adm catalog mirror \ <mirror_registry>:<port>/<index_image> \ <mirror_registry>:<port>[/<repository>] \ --manifests-only \ 1 [-a USD{REG_CREDS}] \ [--insecure] 1 The --manifests-only flag is required for this step so that the command does not copy all of the mirrored content again. Important This step is required because the image mappings in the imageContentSourcePolicy.yaml file generated during the step must be updated from local paths to valid mirror locations. Failure to do so will cause errors when you create the ImageContentSourcePolicy object in a later step. After you mirror the catalog, you can continue with the remainder of your cluster installation. After your cluster installation has finished successfully, you must specify the manifests directory from this procedure to create the ImageContentSourcePolicy and CatalogSource objects. These objects are required to enable installation of Operators from OperatorHub. Additional resources Architecture and operating system support for Operators 3.6.7.3. Generated manifests After mirroring Operator catalog content to your mirror registry, a manifests directory is generated in your current directory. If you mirrored content to a registry on the same network, the directory name takes the following pattern: manifests-<index_image_name>-<random_number> If you mirrored content to a registry on a disconnected host in the section, the directory name takes the following pattern: manifests-index/<repository>/<index_image_name>-<random_number> Note The manifests directory name is referenced in subsequent procedures. The manifests directory contains the following files, some of which might require further modification: The catalogSource.yaml file is a basic definition for a CatalogSource object that is pre-populated with your index image tag and other relevant metadata. This file can be used as is or modified to add the catalog source to your cluster. Important If you mirrored the content to local files, you must modify your catalogSource.yaml file to remove any backslash ( / ) characters from the metadata.name field. Otherwise, when you attempt to create the object, it fails with an "invalid resource name" error. The imageContentSourcePolicy.yaml file defines an ImageContentSourcePolicy object that can configure nodes to translate between the image references stored in Operator manifests and the mirrored registry. Note If your cluster uses an ImageContentSourcePolicy object to configure repository mirroring, you can use only global pull secrets for mirrored registries. You cannot add a pull secret to a project. The mapping.txt file contains all of the source images and where to map them in the target registry. This file is compatible with the oc image mirror command and can be used to further customize the mirroring configuration. Important If you used the --manifests-only flag during the mirroring process and want to further trim the subset of packages to mirror, see the steps in the Mirroring a package manifest format catalog image procedure of the OpenShift Container Platform 4.7 documentation about modifying your mapping.txt file and using the file with the oc image mirror command. 3.6.7.4. Postinstallation requirements After you mirror the catalog, you can continue with the remainder of your cluster installation. After your cluster installation has finished successfully, you must specify the manifests directory from this procedure to create the ImageContentSourcePolicy and CatalogSource objects. These objects are required to populate and enable installation of Operators from OperatorHub. Additional resources Populating OperatorHub from mirrored Operator catalogs Updating or filtering a file-based catalog image 3.6.8. steps Install a cluster on infrastructure that you provision in your restricted network, such as on VMware vSphere , bare metal , or Amazon Web Services . 3.6.9. Additional resources See Gathering data about specific features for more information about using must-gather.

Commands:
./mirror-registry install --quayHostname <host_example_com> --quayRoot <example_directory_name>
podman login -u init -p <password> <host_example_com>:8443> --tls-verify=false 1
sudo ./mirror-registry upgrade -v
sudo ./mirror-registry upgrade --quayHostname <host_example_com> --quayRoot <example_directory_name> --quayStorage <example_directory_name>/quay-storage -v
sudo ./mirror-registry upgrade --sqliteStorage <example_directory_name>/sqlite-storage -v
./mirror-registry install -v --targetHostname <host_example_com> --targetUsername <example_user> -k ~/.ssh/my_ssh_key --quayHostname <host_example_com> --quayRoot <example_directory_name>
podman login -u init -p <password> <host_example_com>:8443> --tls-verify=false 1
./mirror-registry upgrade -v --targetHostname <remote_host_url> --targetUsername <user_name> -k ~/.ssh/my_ssh_key
./mirror-registry upgrade -v --targetHostname <remote_host_url> --targetUsername <user_name> -k ~/.ssh/my_ssh_key --sqliteStorage <example_directory_name>/quay-storage
./mirror-registry install --quayHostname <host_example_com> --quayRoot <example_directory_name>
export QUAY=/USDHOME/quay-install
cp ~/ssl.crt USDQUAY/quay-config
cp ~/ssl.key USDQUAY/quay-config
systemctl --user restart quay-app
./mirror-registry uninstall -v --quayRoot <example_directory_name>
sudo systemctl status <service>
systemctl --user status <service>
tar xvzf oc-mirror.tar.gz
chmod +x oc-mirror
sudo mv oc-mirror /usr/local/bin/.
oc mirror --v2 --help
cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1
{ "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
mkdir -p USDXDG_RUNTIME_DIR/containers
echo -n '<user_name>:<password>' | base64 -w0 1
BGVtbYk3ZHAtqXs=
"auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } },
{ "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: channels: - name: stable-4.18 1 minVersion: 4.18.2 maxVersion: 4.18.2 graph: true 2 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 3 packages: 4 - name: aws-load-balancer-operator - name: 3scale-operator - name: node-observability-operator additionalImages: 5 - name: registry.redhat.io/ubi8/ubi:latest - name: registry.redhat.io/ubi9/ubi@sha256:20f695d2a91352d4eaa25107535126727b5945bff38ed36a3e59590f495046f0
oc mirror -c <image_set_configuration> --workspace file://<file_path> docker://<mirror_registry_url> --v2 1
oc mirror -c <image_set_configuration> file://<file_path> --v2
oc mirror -c <image_set_configuration> --from file://<file_path> docker://<mirror_registry_url> --v2
oc apply -f <path_to_oc_mirror_workspace>/working-dir/cluster-resources
oc get imagedigestmirrorset
oc get imagetagmirrorset
oc get catalogsource -n openshift-marketplace
oc get clustercatalog
apiVersion: mirror.openshift.io/v2alpha1 kind: DeleteImageSetConfiguration delete: platform: channels: - name: stable-4.13 minVersion: 4.13.3 maxVersion: 4.13.3 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12 packages: - name: aws-load-balancer-operator minVersion: 0.0.1 maxVersion: 0.0.1 additionalImages: - name: registry.redhat.io/ubi8/ubi@sha256:bce7e9f69fb7d4533447232478fd825811c760288f87a35699f9c8f030f2c1a6 - name: registry.redhat.io/ubi8/ubi-minimal@sha256:8bedbe742f140108897fb3532068e8316900d9814f399d676ac78b46e740e34e
podman restart <registry_container>
version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: "" filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3
podman restart <registry_container>
apiVersion: mirror.openshift.io/v2alpha1 kind: DeleteImageSetConfiguration delete: platform: channels: - name: <channel_name> 1 minVersion: <channel_min_version> 2 maxVersion: <channel_max_version> 3 operators: - catalog: <operator_catalog_name> 4 packages: - name: <operator_name> 5 minVersion: <operator_max_version> 6 maxVersion: <operator_min_version> 7 additionalImages: - name: <additional_images>
oc mirror delete --config delete-image-set-config.yaml --workspace file://<previously_mirrored_work_folder> --v2 --generate docker://<remote_registry>
oc mirror delete --v2 --delete-yaml-file <previously_mirrored_work_folder>/working-dir/delete/delete-images.yaml docker://<remote_registry>
oc mirror -c <image_set_config_yaml> file://<oc_mirror_workspace_path> --dry-run --v2
[INFO] : :wave: Hello, welcome to oc-mirror [INFO] : :gear: setting up the environment for you [INFO] : :twisted_rightwards_arrows: workflow mode: mirrorToDisk [INFO] : :sleuth_or_spy: going to discover the necessary images [INFO] : :mag: collecting release images [INFO] : :mag: collecting operator images [INFO] : :mag: collecting additional images [WARN] : :warning: 54/54 images necessary for mirroring are not available in the cache. [WARN] : List of missing images in : CLID-19/working-dir/dry-run/missing.txt. please re-run the mirror to disk process [INFO] : :page_facing_up: list of all images for mirroring in : CLID-19/working-dir/dry-run/mapping.txt [INFO] : mirror time : 9.641091076s [INFO] : :wave: Goodbye, thank you for using oc-mirror
cd <oc_mirror_workspace_path>
[ERROR] : [Worker] error mirroring image localhost:55000/openshift/graph-image:latest error: copying image 1/4 from manifest list: trying to reuse blob sha256:edab65b863aead24e3ed77cea194b6562143049a9307cd48f86b542db9eecb6e at destination: pinging container registry localhost:5000: Get "https://localhost:5000/v2/": http: server gave HTTP response to HTTPS client
error mirroring image docker://registry.redhat.io/3scale-amp2/zync-rhel9@sha256:8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d (Operator bundles: [3scale-operator.v0.11.12] - Operators: [3scale-operator]) error: initializing source docker://localhost:55000/3scale-amp2/zync-rhel9:8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d: reading manifest 8bb6b31e108d67476cc62622f20ff8db34efae5d58014de9502336fcc479d86d in localhost:55000/3scale-amp2/zync-rhel9: manifest unknown error mirroring image docker://registry.redhat.io/3scale-amp2/3scale-rhel7-operator-metadata@sha256:de0a70d1263a6a596d28bf376158056631afd0b6159865008a7263a8e9bf0c7d error: skipping operator bundle docker://registry.redhat.io/3scale-amp2/3scale-rhel7-operator-metadata@sha256:de0a70d1263a6a596d28bf376158056631afd0b6159865008a7263a8e9bf0c7d because one of its related images failed to mirror error mirroring image docker://registry.redhat.io/3scale-amp2/system-rhel7@sha256:fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e (Operator bundles: [3scale-operator.v0.11.12] - Operators: [3scale-operator]) error: initializing source docker://localhost:55000/3scale-amp2/system-rhel7:fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e: reading manifest fe77272021867cc6b6d5d0c9bd06c99d4024ad53f1ab94ec0ab69d0fda74588e in localhost:55000/3scale-amp2/system-rhel7: manifest unknown
[[registry]] location="registry.redhat.io" [[registry.mirror]] location="<enterprise-registry.in>" [[registry]] location="quay.io" [[registry.mirror]] location="<enterprise-registry.in>"
oc mirror --v2 -c isc.yaml file://<file_path>/enterprise-content
apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: architectures: - "amd64" channels: - name: stable-4.15 minVersion: 4.15.0 maxVersion: 4.15.3
oc mirror --v2 -c isc.yaml --from file://<disconnected_environment_file_path>/enterprise-content docker://<enterprise_registry.in>/
apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: architectures: - "amd64" channels: - name: stable-4.15 minVersion: 4.15.2 maxVersion: 4.15.2
export UPDATE_URL_OVERRIDE=https://<osus.enterprise.in>/graph
oc mirror --v2 -c isc-enclave.yaml file:///disk-enc1/
oc mirror --v2 -c isc-enclave.yaml --from file://local-disk docker://registry.enc1.in
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 packages: - name: compliance-operator
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true - packages: - name: elasticsearch-operator
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator minVersion: 5.6.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator minVersion: 5.6.0 maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.10 full: true - packages: - name: elasticsearch-operator channels: - name: 'stable-v0'
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable - name: stable-5.5
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0
mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 full: true packages: - name: compliance-operator channels - name: stable minVersion: 5.6.0 maxVersion: 6.0.0
apiVersion: mirror.openshift.io/v2alpha1 kind: ImageSetConfiguration mirror: platform: channels: - name: stable-4.16 minVersion: 4.16.0 maxVersion: 4.16.0 kubeVirtContainer: true
additionalImages: - name: registry.redhat.io/ubi8/ubi:latest
local: - name: podinfo path: /test/podinfo-5.0.0.tar.gz
repositories: - name: podinfo url: https://example.github.io/podinfo charts: - name: podinfo version: 5.0.0 imagePaths: - "{.spec.template.spec.custom[*].image}"
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:4.18 packages: - name: elasticsearch-operator minVersion: '2.4.0'
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:4.18 packages: - name: elasticsearch-operator minVersion: '5.2.3-31'
apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: discarded namespace: openshift-marketplace spec: image: discarded sourceType: grpc updateStrategy: registryPoll: interval: 30m0s
architectures: - amd64 - arm64 - multi - ppc64le - s390x
channels: - name: stable-4.12 - name: stable-4.18
additionalImages: - name: registry.redhat.io/ubi8/ubi:latest
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:{product-version} packages: - name: elasticsearch-operator minVersion: '2.4.0'
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:{product-version} packages: - name: elasticsearch-operator minVersion: '5.2.3-31'
architectures: - amd64 - arm64 - multi - ppc64le - s390x
channels: - name: stable-4.12 - name: stable-4.18
oc-mirror --config isc.yaml file://<directory_name> --v2
oc-mirror --config isc.yaml --from file://<directory_name> docker://<remote_registry> --v2
oc-mirror --config isc.yaml --workspace file://<directory_name> docker://<remote_registry> --v2
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 mirror: platform: channels: - name: stable-4.17 graph: true helm: repositories: - name: sbo url: https://redhat-developer.github.io/service-binding-operator-helm-chart/ additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: quay.io/openshifttest/hello-openshift@sha256:example_hash operators: - catalog: oci:///test/redhat-operator-index packages: - name: aws-load-balancer-operator storageConfig: # REMOVE this field in v2 local: path: /var/lib/oc-mirror
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: channels: - name: stable-4.17 graph: true helm: repositories: - name: sbo url: https://redhat-developer.github.io/service-binding-operator-helm-chart/ additionalImages: - name: registry.redhat.io/ubi8/ubi:latest - name: quay.io/openshifttest/hello-openshift@sha256:example_hash operators: - catalog: oci:///test/redhat-operator-index packages: - name: aws-load-balancer-operator
ls <v2_workspace>/working-dir/cluster-resources/
oc get catalogsource -n openshift-marketplace
oc get imagedigestmirrorset,imagetagmirrorset
oc-mirror -c isc.yaml file://some-dir --v2
oc-mirror delete --config=delete-isc.yaml --generate --delete-v1-images --workspace file://some-dir docker://registry.example:5000 --v2
oc-mirror delete --delete-yaml-file some-dir/working-dir/delete/delete-images.yaml docker://registry.example:5000 --v2
tar xvzf oc-mirror.tar.gz
chmod +x oc-mirror
sudo mv oc-mirror /usr/local/bin/.
oc mirror help
cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1
{ "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
mkdir -p <directory_name>
cp <path>/<pull_secret_file_in_json> <directory_name>/<auth_file>
echo -n '<user_name>:<password>' | base64 -w0 1
BGVtbYk3ZHAtqXs=
"auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } },
{ "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
oc mirror init --registry <storage_backend> > imageset-config.yaml 1
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 archiveSize: 4 1 storageConfig: 2 registry: imageURL: example.com/mirror/oc-mirror-metadata 3 skipTLS: false mirror: platform: channels: - name: stable-4.18 4 type: ocp graph: true 5 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 6 packages: - name: serverless-operator 7 channels: - name: stable 8 additionalImages: - name: registry.redhat.io/ubi9/ubi:latest 9 helm: {}
oc mirror --config=./<imageset-config.yaml> \ 1 docker://registry.example:5000 2
oc mirror --config=./imageset-config.yaml \ 1 file://<path_to_output_directory> 2
cd <path_to_output_directory>
ls
mirror_seq1_000000.tar
oc mirror --from=./mirror_seq1_000000.tar \ 1 docker://registry.example:5000 2
oc apply -f ./oc-mirror-workspace/results-1639608409/
oc apply -f ./oc-mirror-workspace/results-1639608409/release-signatures/
oc get imagecontentsourcepolicy
oc get catalogsource -n openshift-marketplace
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.13 1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: rhacs-operator channels: - name: stable 1
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.1 maxVersion: 4.12.1 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages: - name: <new_operator_name> 1 channels: - name: stable
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.14 packages:
oc mirror --config=./imageset-config.yaml \ 1 docker://registry.example:5000 \ 2 --dry-run 3
Checking push permissions for registry.example:5000 Creating directory: oc-mirror-workspace/src/publish Creating directory: oc-mirror-workspace/src/v2 Creating directory: oc-mirror-workspace/src/charts Creating directory: oc-mirror-workspace/src/release-signatures No metadata detected, creating new workspace wrote mirroring manifests to oc-mirror-workspace/operators.1658342351/manifests-redhat-operator-index info: Planning completed in 31.48s info: Dry run complete Writing image mapping to oc-mirror-workspace/mapping.txt
cd oc-mirror-workspace/
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: local: path: /home/user/metadata 1 mirror: platform: channels: - name: stable-4.18 2 type: ocp graph: false operators: - catalog: oci:///home/user/oc-mirror/my-oci-catalog 3 targetCatalog: my-namespace/redhat-operator-index 4 packages: - name: aws-load-balancer-operator - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 5 packages: - name: rhacs-operator additionalImages: - name: registry.redhat.io/ubi9/ubi:latest 6
oc mirror --config=./imageset-config.yaml \ 1 docker://registry.example:5000 2
[[registry]] location = "registry.redhat.io:5000" insecure = false blocked = false mirror-by-digest-only = true prefix = "" [[registry.mirror]] location = "preprod-registry.example.com" insecure = false
additionalImages: - name: registry.redhat.io/ubi8/ubi:latest
local: - name: podinfo path: /test/podinfo-5.0.0.tar.gz
repositories: - name: podinfo url: https://example.github.io/podinfo charts: - name: podinfo version: 5.0.0
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator minVersion: '2.4.0'
operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator minVersion: '5.2.3-31'
architectures: - amd64 - arm64 - multi - ppc64le - s390x
channels: - name: stable-4.10 - name: stable-4.18
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: platform: channels: - name: stable-4.12 minVersion: 4.11.37 maxVersion: 4.12.15 shortestPath: true
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: platform: architectures: - "multi" channels: - name: stable-4.13 minVersion: 4.13.4 maxVersion: 4.13.6
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: local: path: /home/user/metadata mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: rhacs-operator channels: - name: stable minVersion: 4.0.1
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: registry: imageURL: mylocalregistry/ocp-mirror/openshift4 skipTLS: false mirror: platform: channels: - name: stable-4.11 type: ocp graph: true operators: - catalog: registry.redhat.io/redhat/certified-operator-index:v4.18 packages: - name: nutanixcsioperator channels: - name: stable additionalImages: - name: registry.redhat.io/ubi9/ubi:latest
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: elasticsearch-operator channels: - name: stable-5.7 - name: stable
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 full: true
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 targetCatalog: my-namespace/my-operator-catalog
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration archiveSize: 4 storageConfig: registry: imageURL: example.com/mirror/oc-mirror-metadata skipTLS: false mirror: platform: architectures: - "s390x" channels: - name: stable-4.18 operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 helm: repositories: - name: redhat-helm-charts url: https://raw.githubusercontent.com/redhat-developer/redhat-helm-charts/master charts: - name: ibm-mongodb-enterprise-helm version: 0.2.0 additionalImages: - name: registry.redhat.io/ubi9/ubi:latest
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v2alpha1 mirror: platform: graph: true # Required for the OSUS Operator architectures: - amd64 channels: - name: stable-4.12 minVersion: '4.12.28' maxVersion: '4.12.28' shortestPath: true type: ocp - name: eus-4.14 minVersion: '4.12.28' maxVersion: '4.14.16' shortestPath: true type: ocp
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration storageConfig: registry: imageURL: agent.agent.example.com:5000/openshift/release/metadata:latest/openshift/release/metadata:latest mirror: platform: architectures: - "multi" channels: - name: stable-4.18 minVersion: 4.18.0 maxVersion: 4.18.1 type: ocp operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.18 packages: - name: multicluster-engine
tar xvf <file>
echo USDPATH
oc <command>
C:\> path
C:\> oc <command>
echo USDPATH
oc <command>
cat ./pull-secret | jq . > <path>/<pull_secret_file_in_json> 1
{ "auths": { "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
echo -n '<user_name>:<password>' | base64 -w0 1
BGVtbYk3ZHAtqXs=
"auths": { "<mirror_registry>": { 1 "auth": "<credentials>", 2 "email": "you@example.com" } },
{ "auths": { "registry.example.com": { "auth": "BGVtbYk3ZHAtqXs=", "email": "you@example.com" }, "cloud.openshift.com": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "quay.io": { "auth": "b3BlbnNo...", "email": "you@example.com" }, "registry.connect.redhat.com": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" }, "registry.redhat.io": { "auth": "NTE3Njg5Nj...", "email": "you@example.com" } } }
OCP_RELEASE=<release_version>
LOCAL_REGISTRY='<local_registry_host_name>:<local_registry_host_port>'
LOCAL_REPOSITORY='<local_repository_name>'
PRODUCT_REPO='openshift-release-dev'
LOCAL_SECRET_JSON='<path_to_pull_secret>'
RELEASE_NAME="ocp-release"
ARCHITECTURE=<cluster_architecture> 1
REMOVABLE_MEDIA_PATH=<path> 1
oc adm release mirror -a USD{LOCAL_SECRET_JSON} --from=quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE} --to=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} --to-release-image=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE} --dry-run
oc adm release mirror -a USD{LOCAL_SECRET_JSON} --to-dir=USD{REMOVABLE_MEDIA_PATH}/mirror quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE}
oc image mirror -a USD{LOCAL_SECRET_JSON} --from-dir=USD{REMOVABLE_MEDIA_PATH}/mirror "file://openshift/release:USD{OCP_RELEASE}*" USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} 1
oc adm release mirror -a USD{LOCAL_SECRET_JSON} --from=quay.io/USD{PRODUCT_REPO}/USD{RELEASE_NAME}:USD{OCP_RELEASE}-USD{ARCHITECTURE} --to=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY} --to-release-image=USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE}
oc adm release extract -a USD{LOCAL_SECRET_JSON} --icsp-file=<file> --command=openshift-install "USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE}" --insecure=true 1
oc adm release extract -a USD{LOCAL_SECRET_JSON} --command=openshift-install "USD{LOCAL_REGISTRY}/USD{LOCAL_REPOSITORY}:USD{OCP_RELEASE}-USD{ARCHITECTURE}"
openshift-install
podman login registry.redhat.io
REG_CREDS=USD{XDG_RUNTIME_DIR}/containers/auth.json
podman login <mirror_registry>
oc adm catalog mirror <index_image> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 [-a USD{REG_CREDS}] \ 3 [--insecure] \ 4 [--index-filter-by-os='<platform>/<arch>'] \ 5 [--manifests-only] 6
src image has index label for database path: /database/index.db using database path mapping: /database/index.db:/tmp/153048078 wrote database to /tmp/153048078 1 wrote mirroring manifests to manifests-redhat-operator-index-1614211642 2
oc adm catalog mirror <index_image> \ 1 file:///local/index \ 2 -a USD{REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5
info: Mirroring completed in 5.93s (5.915MB/s) wrote mirroring manifests to manifests-my-index-1614985528 1 To upload local images to a registry, run: oc adm catalog mirror file://local/index/myrepo/my-index:v1 REGISTRY/REPOSITORY 2
podman login <mirror_registry>
oc adm catalog mirror file://local/index/<repository>/<index_image>:<tag> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 -a USD{REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5
oc adm catalog mirror <mirror_registry>:<port>/<index_image> <mirror_registry>:<port>[/<repository>] --manifests-only \ 1 [-a USD{REG_CREDS}] [--insecure]
manifests-<index_image_name>-<random_number>
manifests-index/<repository>/<index_image_name>-<random_number>