{"id":77369,"date":"2026-07-04T03:38:32","date_gmt":"2026-07-04T03:38:32","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77369"},"modified":"2026-07-04T03:38:35","modified_gmt":"2026-07-04T03:38:35","slug":"openshift-imagestreams-vs-normal-container-images-a-complete-hands-on-tutorial-using-httpd","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-imagestreams-vs-normal-container-images-a-complete-hands-on-tutorial-using-httpd\/","title":{"rendered":"OpenShift ImageStreams vs Normal Container Images: A Complete Hands-on Tutorial Using HTTPD"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift can deploy applications in two major ways:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Using a normal container image directly<\/strong>, such as:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">registry.access.redhat.com\/ubi9\/httpd-24:latest\ndocker.io\/library\/httpd:2.4\nquay.io\/some-org\/some-image:tag\n<\/code><\/span><\/pre>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Using an OpenShift ImageStream<\/strong>, such as:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<span class=\"hljs-selector-tag\">httpd<\/span><span class=\"hljs-selector-pseudo\">:2.4-ubi9<\/span>\n<span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Both approaches ultimately run containers in Pods, but they behave very differently in terms of tracking, automation, promotion, rollback, image lookup, image triggers, disconnected environments, and enterprise governance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift ImageStreams are an OpenShift-native abstraction over container images. They do <strong>not<\/strong> store the image layers themselves; instead, they store image metadata, tags, digests, and references. Red Hat\u2019s current OpenShift image documentation says ImageStreams provide an abstraction for referencing container images, can manage image versions, and can automate builds and deployments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your cluster is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Server<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: 4<span class=\"hljs-selector-class\">.21<\/span><span class=\"hljs-selector-class\">.14<\/span>\n<span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.34<\/span><span class=\"hljs-selector-class\">.6<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift 4.21 officially uses Kubernetes 1.34 with CRI-O runtime.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. What Is a Normal Image Deployment in OpenShift?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A normal image deployment means the Kubernetes Deployment directly references an external or internal container image pull spec.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">containers:\n  - name: httpd\n    image: registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In this model, OpenShift behaves much like Kubernetes. The Deployment points directly to the registry image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-direct \\\n  --image=registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is simple and familiar, but OpenShift does not automatically give you the full ImageStream-based lifecycle unless you explicitly add ImageStreams or image triggers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift\u2019s own CLI tutorial says the simplest way to deploy an application is to run a provided container image. In its example, <code>oc new-app<\/code> deploys an image and creates resources such as a Deployment and Service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important nuance: <code>oc new-app<\/code> is OpenShift-aware. Even when you provide an external image, <code>oc new-app<\/code> can create an ImageStreamTag to track that image. Red Hat\u2019s tutorial output shows: \u201cAn image stream tag will be created \u2026 that will track this image.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So if you want a <strong>true no-ImageStream test<\/strong>, use <code>oc create deployment<\/code>, <code>oc apply -f deployment.yaml<\/code>, or <code>kubectl create deployment<\/code>, not <code>oc new-app<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. What Is an ImageStream Deployment?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An ImageStream deployment means the Deployment refers to an OpenShift ImageStreamTag, not directly to the external registry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">containers<\/span>:\n  <span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">name<\/span>: <span class=\"hljs-selector-tag\">httpd<\/span>\n    <span class=\"hljs-selector-tag\">image<\/span>: <span class=\"hljs-selector-tag\">httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But for Kubernetes Deployments to resolve <code>httpd:latest<\/code> as an OpenShift ImageStreamTag, you must enable image lookup using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat\u2019s current docs say Kubernetes resources can use ImageStreams when the ImageStream is in the same project and referenced by a single-segment value such as <code>ruby:2.5<\/code>. They also say <code>oc set image-lookup<\/code> can enable ImageStream resolution either on a specific resource or on the ImageStream itself.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. High-Level Comparison<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Normal Image Deployment<\/th><th>ImageStream Deployment<\/th><\/tr><\/thead><tbody><tr><td>Image reference<\/td><td>Full registry path<\/td><td>ImageStreamTag such as <code>httpd:latest<\/code><\/td><\/tr><tr><td>Example<\/td><td><code>registry.access.redhat.com\/ubi9\/httpd-24:latest<\/code><\/td><td><code>httpd:latest<\/code><\/td><\/tr><tr><td>OpenShift abstraction<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Tracks external image metadata<\/td><td>No, not by itself<\/td><td>Yes<\/td><\/tr><tr><td>Can trigger builds\/deployments on tag changes<\/td><td>Not automatically<\/td><td>Yes, with ImageStream triggers<\/td><\/tr><tr><td>Can promote tags like dev \u2192 test \u2192 prod<\/td><td>Manual registry\/tag work<\/td><td>Easy with <code>oc tag<\/code><\/td><\/tr><tr><td>Can rollback ImageStreamTag<\/td><td>Manual image digest change<\/td><td>Easier using ImageStream tag history<\/td><\/tr><tr><td>Works like vanilla Kubernetes<\/td><td>Yes<\/td><td>OpenShift-specific<\/td><\/tr><tr><td>Best for portability<\/td><td>Better<\/td><td>Less portable outside OpenShift<\/td><\/tr><tr><td>Best for OpenShift CI\/CD<\/td><td>Basic<\/td><td>Strong<\/td><\/tr><tr><td>Useful in disconnected environments<\/td><td>Possible but manual<\/td><td>Very useful with mirroring and samples<\/td><\/tr><tr><td>Fine-grained image access through OpenShift objects<\/td><td>Limited<\/td><td>Stronger<\/td><\/tr><tr><td>Stores image layers<\/td><td>Registry stores layers<\/td><td>ImageStream stores metadata, not layers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift ImageStreams can point to images in the integrated registry, external registries such as <code>registry.redhat.io<\/code> or <code>quay.io<\/code>, or other ImageStreams in the cluster. Red Hat also documents that when a build or deployment references an ImageStreamTag, OpenShift queries the repository through that tag and uses the exact associated image ID.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Why ImageStreams Exist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">ImageStreams solve practical enterprise problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Developers want to use short names like <code>httpd:latest<\/code>.<\/li>\n\n\n\n<li>Platform teams want to control which external images are allowed.<\/li>\n\n\n\n<li>CI\/CD pipelines want image-change triggers.<\/li>\n\n\n\n<li>Security teams want better visibility into image references.<\/li>\n\n\n\n<li>Release teams want promotion flows such as <code>dev<\/code>, <code>qa<\/code>, <code>stage<\/code>, and <code>prod<\/code>.<\/li>\n\n\n\n<li>Disconnected clusters need a clean way to mirror and manage image references.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Red Hat lists several ImageStream benefits: tagging, rollback, triggering builds and deployments, periodic re-import, fine-grained image access control, team sharing, and keeping applications on a known-good image when the source image changes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Lab Setup<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">6.1 Confirm versions<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Your current output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Client<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: 4<span class=\"hljs-selector-class\">.18<\/span><span class=\"hljs-selector-class\">.7<\/span>\n<span class=\"hljs-selector-tag\">Kustomize<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: <span class=\"hljs-selector-tag\">v5<\/span><span class=\"hljs-selector-class\">.4<\/span><span class=\"hljs-selector-class\">.2<\/span>\n<span class=\"hljs-selector-tag\">Server<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: 4<span class=\"hljs-selector-class\">.21<\/span><span class=\"hljs-selector-class\">.14<\/span>\n<span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.34<\/span><span class=\"hljs-selector-class\">.6<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recommended for this tutorial:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected ideal state:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Client<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: 4<span class=\"hljs-selector-class\">.21<\/span><span class=\"hljs-selector-class\">.x<\/span>\n<span class=\"hljs-selector-tag\">Server<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: 4<span class=\"hljs-selector-class\">.21<\/span><span class=\"hljs-selector-class\">.x<\/span>\n<span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">Version<\/span>: <span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.34<\/span><span class=\"hljs-selector-class\">.x<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat recommends using the <code>oc<\/code> binary corresponding to the OpenShift server version if you want latest features and full command compatibility.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.2 Create a project<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Do not test workloads in <code>default<\/code>, <code>openshift<\/code>, <code>kube-system<\/code>, or other privileged system projects. Red Hat warns that default projects are reserved for core components, and functionality such as admission plugins, SCCs, quotas, and image reference resolution does not work normally in highly privileged projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a clean project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project httpd-image-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check current project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using project <span class=\"hljs-string\">\"httpd-image-demo\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Check Existing HTTPD ImageStreams in OpenShift<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Many OpenShift clusters include sample ImageStreams in the <code>openshift<\/code> namespace through the Cluster Samples Operator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check HTTPD sample ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is -n openshift | grep -i httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestream httpd -n openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check available tags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is httpd -n openshift\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You may see tags such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">2<span class=\"hljs-selector-class\">.4-ubi8<\/span>\n2<span class=\"hljs-selector-class\">.4-ubi9<\/span>\n<span class=\"hljs-selector-tag\">latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact tags depend on your cluster, release, sample operator configuration, architecture, and network access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Cluster Samples Operator creates and manages sample ImageStreams and templates, including HTTPD, and its configuration can be <code>Managed<\/code>, <code>Unmanaged<\/code>, or <code>Removed<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check Samples Operator:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">get<\/span> <span class=\"hljs-selector-tag\">configs<\/span><span class=\"hljs-selector-class\">.samples<\/span><span class=\"hljs-selector-class\">.operator<\/span><span class=\"hljs-selector-class\">.openshift<\/span><span class=\"hljs-selector-class\">.io<\/span> <span class=\"hljs-selector-tag\">cluster<\/span> <span class=\"hljs-selector-tag\">-o<\/span> <span class=\"hljs-selector-tag\">yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Short status:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get configs.samples.operator.openshift.io cluster \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.managementState}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Managed\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If it says <code>Removed<\/code>, sample ImageStreams might not exist.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Method 1 \u2014 Deploy HTTPD Using a Normal Image, Without ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the Kubernetes-style deployment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8.1 Create Deployment directly from image<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use a Red Hat UBI HTTPD image:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-direct \\\n  --image=registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy httpd-direct\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -l app=httpd-direct\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe Pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe pod -l app=httpd-direct\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check exact image in Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-direct \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;0].image}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This proves the Deployment is using the external registry image directly.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8.2 Expose HTTPD internally<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The UBI HTTPD image usually listens on port <code>8080<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a Service:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose deployment httpd-direct --port=8080\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc httpd-direct\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a Route:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc httpd-direct\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route httpd-direct\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Get URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get route httpd-direct \\\n  -o jsonpath=<span class=\"hljs-string\">'http:\/\/{.spec.host}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$(oc get route httpd-direct -o jsonpath='http:\/\/{.spec.host}')\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\">HTTP\/1.1 <span class=\"hljs-number\">200<\/span> OK\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8.3 Observe normal-image behavior<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check image field:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy httpd-direct -o yaml | grep -A3 \"image:\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">image<\/span>: registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check if any ImageStream was created:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">No resources found in httpd-image-demo <span class=\"hljs-keyword\">namespace<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That is the key point: this is a <strong>direct image deployment<\/strong>, not an ImageStream-based deployment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Method 2 \u2014 Deploy HTTPD Using <code>oc new-app<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is a useful OpenShift shortcut, but understand the behavior carefully.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --name=httpd-newapp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all -l app=httpd-newapp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check ImageStreams:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You may see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME           IMAGE REPOSITORY   TAGS     UPDATED\nhttpd-newapp   ...                latest   ...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This happens because <code>oc new-app<\/code> is designed to generate OpenShift application objects and can create an ImageStreamTag to track the supplied image. Red Hat\u2019s CLI tutorial shows this exact behavior: when deploying a container image through <code>oc new-app<\/code>, an ImageStreamTag is created to track that image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app external-image\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">does <strong>not always mean \u201cwithout ImageStream.\u201d<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a pure direct-image test, prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or declarative YAML.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Method 3 \u2014 Create Your Own HTTPD ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now let us create an ImageStream manually and deploy from it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10.1 Create\/import ImageStream from external HTTPD image<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check ImageStreamTag:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> istag my-httpd:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents <code>oc import-image &lt;imagestreamtag&gt; --from=&lt;image&gt; --confirm<\/code> as the command for importing an image into an ImageStream.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10.2 View the external image reference behind the ImageStream<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> istag my-httpd:latest -o yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful JSONPath commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get istag my-httpd:latest \\\n  -o jsonpath=<span class=\"hljs-string\">'{.image.dockerImageReference}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get istag my-httpd:latest \\\n  -o jsonpath=<span class=\"hljs-string\">'{.image.metadata.name}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get istag my-httpd:latest \\\n  -o jsonpath=<span class=\"hljs-string\">'{.image.dockerImageMetadata.Architecture}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This shows that the ImageStreamTag tracks image metadata and digest information.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Deploy HTTPD from ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are two ways.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11.1 Option A \u2014 Enable ImageStream lookup on the ImageStream<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enable lookup:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup imagestream --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">NAME       LOCAL\nmy-httpd   <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat says enabling image lookup on the ImageStream sets <code>ImageStream.spec.lookupPolicy.local<\/code> to <code>true<\/code>, and then the behavior applies to all tags in that ImageStream.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now create a Deployment using the short ImageStreamTag reference:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-is \\\n  --image=my-httpd:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check what image the Deployment has:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-is \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;0].image}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You might see either:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or a resolved pull spec, depending on when admission resolution happened and how the object was admitted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check Pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -l app=httpd-is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe Pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc describe pod -l app=httpd-is | grep -i <span class=\"hljs-string\">\"Image:\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose deployment httpd-is --port=8080\noc expose svc httpd-is\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$(oc get route httpd-is -o jsonpath='http:\/\/{.spec.host}')\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11.2 Option B \u2014 Enable ImageStream lookup only on the Deployment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-is-specific \\\n  --image=my-httpd:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Enable image lookup only for this Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup deploy\/httpd-is-specific\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat says you can enable image stream resolution on a specific resource; for a Deployment this sets the <code>alpha.image.policy.openshift.io\/resolve-names<\/code> annotation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check annotation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy httpd-is-specific -o yaml | grep -A5 \"annotations:\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose deployment httpd-is-specific --port=8080\noc expose svc httpd-is-specific\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$(oc get route httpd-is-specific -o jsonpath='http:\/\/{.spec.host}')\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. ImageStreamTag Reference Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift supports several image reference styles.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Reference Type<\/th><th>Example<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Direct external image<\/td><td><code>registry.access.redhat.com\/ubi9\/httpd-24:latest<\/code><\/td><td>Pull directly from external registry<\/td><\/tr><tr><td>ImageStreamTag<\/td><td><code>my-httpd:latest<\/code><\/td><td>Mutable tag in an ImageStream<\/td><\/tr><tr><td>ImageStreamImage<\/td><td><code>my-httpd@sha256:&lt;digest&gt;<\/code><\/td><td>Immutable image digest inside ImageStream<\/td><\/tr><tr><td>DockerImage source<\/td><td><code>quay.io\/org\/app:tag<\/code><\/td><td>External registry pull spec<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents that ImageStreamTag uses <code>&lt;image_stream_name&gt;:&lt;tag&gt;<\/code>, ImageStreamImage uses <code>&lt;image_stream_name&gt;@&lt;image_id&gt;<\/code>, and external DockerImage references use the normal registry pull specification.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Refreshing ImageStreams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Refreshing is one of the biggest reasons ImageStreams exist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are two refresh styles:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Manual refresh<\/strong><\/li>\n\n\n\n<li><strong>Scheduled refresh<\/strong><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13.1 Manual refresh<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or with confirm if creating\/updating:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check updated tag:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check import events:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp | tail -20\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">13.2 Scheduled refresh using <code>oc tag --scheduled<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a scheduled tracking tag:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc tag registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  my-httpd:scheduled \\\n  --scheduled=<span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents <code>--scheduled=true<\/code> for periodic refresh\/re-import, and the period is configured globally at the system level. In current docs, the example says the default cluster-wide period is 15 minutes.<br>Remove scheduled behavior:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc tag registry.access.redhat.com\/ubi9\/httpd-24:latest \\\n  my-httpd:scheduled\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or delete the tag:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-d<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:scheduled<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Permanent Tags vs Tracking Tags<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift has two important ImageStream tag behaviors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14.1 Permanent tag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A permanent tag points to a specific image at a point in time.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:stable<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat says the default <code>oc tag<\/code> behavior creates a permanent tag pinned to an image ID. If the source later changes, the destination does not automatically change.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use this for production-safe promotion:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:prod<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">14.2 Tracking tag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A tracking tag follows another tag.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc tag --alias=<span class=\"hljs-literal\">true<\/span> my-httpd:latest my-httpd:tracking\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents <code>--alias=true<\/code> as a tracking tag, where the destination tag metadata updates when the source tag changes. It also notes that this tracking behavior works correctly within a single ImageStream.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is my-httpd\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Trigger Deployments When ImageStream Changes<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">ImageStreams become powerful when a Deployment reacts to ImageStreamTag changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15.1 Create Deployment from ImageStream<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-triggered \\\n  --image=my-httpd:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Enable image lookup:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup deploy\/httpd-triggered\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now add an image trigger:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> triggers deploy\/httpd-triggered \\\n  --from-image=my-httpd:latest \\\n  -c httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But your container name might not be <code>httpd<\/code>. Check it first:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-triggered \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;*].name}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the container is named <code>my-httpd<\/code>, use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> triggers deploy\/httpd-triggered \\\n  --from-image=my-httpd:latest \\\n  -c my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat\u2019s latest ImageStream trigger docs say Kubernetes resources do not have built-in trigger fields like OpenShift BuildConfigs and DeploymentConfigs, so OpenShift uses the <code>image.openshift.io\/triggers<\/code> annotation. They also document <code>oc set triggers deploy\/example --from-image=example:latest -c web<\/code> for Deployment image-change triggers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check triggers:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> triggers deploy\/httpd-triggered\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check annotation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy httpd-triggered -o yaml | grep -A20 \"image.openshift.io\/triggers\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">15.2 Trigger a rollout by changing the ImageStreamTag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Import another HTTPD image tag into the same ImageStreamTag.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deploy\/httpd-triggered\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check new ReplicaSet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> rs -l app=httpd-triggered\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Deployment image:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-triggered \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;0].image}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Normal Image Update vs ImageStream Update<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">16.1 Normal image update<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With a direct image Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image deployment\/httpd-direct \\\n  httpd=registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But check the container name first:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-direct \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;*].name}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc set image deployment\/httpd-direct \\\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span>=registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/httpd-direct\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is manual.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">16.2 ImageStream update<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If triggers are configured, OpenShift can update the Deployment automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Red Hat\u2019s ImageStream documentation explains that when a new image is added to a stream or a tag is modified, watching resources receive notifications and can react by starting a new build or deployment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Rollback and Promotion<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">17.1 Promotion using ImageStreams<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create environment-style tags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:dev<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:dev<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:test<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:test<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:prod<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deploy production from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create deployment httpd-prod --image=my-httpd:prod\noc <span class=\"hljs-keyword\">set<\/span> image-lookup deploy\/httpd-prod\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose deployment httpd-prod --port=8080\noc expose svc httpd-prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now your production Deployment refers to the <code>prod<\/code> ImageStreamTag.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">17.2 Roll back prod to older known-good tag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a known-good tag:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:stable<\/span> <span class=\"hljs-selector-tag\">my-httpd<\/span><span class=\"hljs-selector-pseudo\">:prod<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then trigger deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deploy\/httpd-prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or force rollout if needed:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout restart deploy\/httpd-prod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">ImageStreams help because you can promote and repoint tags without changing every application YAML.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. ImageStream with External Image and Local Reference Policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can tag an external image and tell OpenShift to use local pull-through behavior:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc tag registry.access.redhat.com\/ubi9\/httpd-24:latest \\\n  my-httpd:local \\\n  --reference-policy=local\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents <code>--reference-policy=local<\/code> as a way to instruct OpenShift to fetch the tagged image from the integrated registry, using pull-through behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> istag my-httpd:local -o yaml | grep -A10 referencePolicy\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is useful when you want OpenShift to control how images are pulled, especially in enterprise registry, network, or disconnected setups.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Private Registry with ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If your HTTPD image is in a private registry, create a Docker config JSON secret.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create secret generic private-registry-secret \\\n  --<span class=\"hljs-keyword\">from<\/span>-file=.dockerconfigjson=<span class=\"hljs-regexp\">\/path\/<\/span>to\/config.json \\\n  --type=kubernetes.io\/dockerconfigjson\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then import:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image private-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=private-registry.example.com\/team\/httpd:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat documents creating a <code>kubernetes.io\/dockerconfigjson<\/code> secret and then running <code>oc import-image &lt;imagestreamtag&gt; --from=&lt;image&gt; --confirm<\/code> for importing ImageStreams from private registries.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Multi-Architecture ImageStreams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Modern clusters often contain mixed architecture nodes, such as <code>amd64<\/code>, <code>arm64<\/code>, <code>ppc64le<\/code>, or <code>s390x<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenShift 4.21 supports <code>--import-mode<\/code> with <code>oc import-image<\/code> and <code>oc tag<\/code> for working with manifest lists. Red Hat documents two modes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Legacy\nPreserveOriginal\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The docs say <code>Legacy<\/code> imports a single sub-manifest, while <code>PreserveOriginal<\/code> preserves the manifest list. They also note that the default import mode is <code>Legacy<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Import preserving multi-arch manifest list:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:multiarch \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --<span class=\"hljs-keyword\">import<\/span>-mode=<span class=\"hljs-string\">'PreserveOriginal'<\/span> \\\n  --reference-policy=local \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Import legacy mode:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:legacy \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --<span class=\"hljs-keyword\">import<\/span>-mode=<span class=\"hljs-string\">'Legacy'<\/span> \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is my-httpd\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. OpenShift Sample HTTPD ImageStream<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check the OpenShift-provided HTTPD ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is httpd -n openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is httpd -n openshift\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Import\/tag it into your own project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc tag openshift\/httpd:latest local-httpd:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or choose a specific tag after checking:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe is httpd -n openshift\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc tag openshift\/httpd:2.4-ubi9 local-httpd:2.4-ubi9\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Enable lookup:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup local-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deploy:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create deployment httpd-<span class=\"hljs-keyword\">from<\/span>-sample \\\n  --image=local-httpd:<span class=\"hljs-number\">2.4<\/span>-ubi9\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc expose deployment httpd-<span class=\"hljs-keyword\">from<\/span>-sample --port=<span class=\"hljs-number\">8080<\/span>\noc expose svc httpd-<span class=\"hljs-keyword\">from<\/span>-sample\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -I <span class=\"hljs-string\">\"$(oc get route httpd-from-sample -o jsonpath='http:\/\/{.spec.host}')\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Cluster Samples Operator can manage sample ImageStreams, and Red Hat documents that the operator monitors ImageStreamTag imports and retries failed imports about every 15 minutes until the import succeeds or the configuration changes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Full Side-by-Side Hands-on Test<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">22.1 Clean project<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project httpd-compare\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.2 Direct image deployment<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-direct \\\n  --image=registry.access.redhat.com\/ubi9\/httpd-24:latest\n\noc expose deployment httpd-direct --port=8080\noc expose svc httpd-direct\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-direct \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;0].image}{\"\\n\"}'<\/span>\n\noc get is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest\nNo resources found in httpd-compare <span class=\"hljs-keyword\">namespace<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.3 ImageStream deployment<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n\noc <span class=\"hljs-keyword\">set<\/span> image-lookup my-httpd\n\noc create deployment httpd-is \\\n  --image=my-httpd:latest\n\noc expose deployment httpd-is --port=8080\noc expose svc httpd-is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get is\noc describe is my-httpd\n\noc get deploy httpd-is \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;0].image}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.4 Add trigger to ImageStream deployment<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Find container name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-is \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;*].name}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add trigger:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-88\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> triggers deploy\/httpd-is \\\n  --from-image=my-httpd:latest \\\n  -c my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-88\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If container name differs, replace <code>my-httpd<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-89\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> triggers deploy\/httpd-is\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-89\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.5 Refresh ImageStream<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-90\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-90\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deploy\/httpd-is\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Troubleshooting<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 1: <code>ImagePullBackOff<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-91\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc describe pod <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pod-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-91\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common causes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Wrong image name\nRegistry requires authentication\nCluster cannot reach registry\nImage is blocked by image policy\nPull secret missing\nArchitecture mismatch\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 2: ImageStream not found<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-92\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> is\noc <span class=\"hljs-keyword\">get<\/span> is -n openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-92\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If using sample ImageStreams:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-93\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">get<\/span> <span class=\"hljs-selector-tag\">configs<\/span><span class=\"hljs-selector-class\">.samples<\/span><span class=\"hljs-selector-class\">.operator<\/span><span class=\"hljs-selector-class\">.openshift<\/span><span class=\"hljs-selector-class\">.io<\/span> <span class=\"hljs-selector-tag\">cluster<\/span> <span class=\"hljs-selector-tag\">-o<\/span> <span class=\"hljs-selector-tag\">yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-93\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 3: Short image name does not resolve<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Example failure:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment test --image=my-httpd:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-94\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-94\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-95\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> image-lookup deploy\/test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-95\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenShift requires ImageStream lookup to resolve short ImageStream references in Kubernetes resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 4: Trigger not working<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check trigger annotation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-96\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deploy httpd-is -o yaml | grep -A20 image.openshift.io\/triggers\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-96\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check container name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-97\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get deploy httpd-is \\\n  -o jsonpath=<span class=\"hljs-string\">'{.spec.template.spec.containers&#91;*].name}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-97\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recreate trigger:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-98\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc set triggers deploy\/httpd-is \\\n  --from-image=my-httpd:latest \\\n  -c <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-98\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 5: <code>oc<\/code> command behaves strangely<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Your client is 4.18.7 and server is 4.21.14. Install the matching 4.21 <code>oc<\/code> client.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Red Hat\u2019s 4.21 docs warn that if an earlier <code>oc<\/code> is installed, you might not be able to complete all OpenShift 4.21 commands.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. When to Use Normal Images<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use direct images when:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-99\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">You want Kubernetes portability.\nYou are deploying a simple app.\nYou <span class=\"hljs-keyword\">do<\/span> not need ImageStream triggers.\nYou <span class=\"hljs-keyword\">do<\/span> not need OpenShift-native promotion.\nYou manage images fully outside OpenShift.\nYour CI\/CD already pins images by digest.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-99\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example production-style direct image:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-100\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: httpd-direct-prod\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: httpd-direct-prod\n  template:\n    metadata:\n      labels:\n        app: httpd-direct-prod\n    spec:\n      containers:\n        - name: httpd\n          image: registry.access.redhat.com\/ubi9\/httpd-24@sha256:<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">digest<\/span>&gt;<\/span>\n          ports:\n            - containerPort: 8080\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-100\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For production, prefer immutable digests over mutable <code>latest<\/code> tags.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. When to Use ImageStreams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use ImageStreams when:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-101\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">You are building OpenShift-native CI\/CD.\nYou want automatic deployment triggers.\nYou want dev\/test\/prod image promotion.\nYou want ImageStreamTag rollback.\nYou want to <span class=\"hljs-keyword\">abstract<\/span> external registry locations.\nYou want to support disconnected <span class=\"hljs-keyword\">or<\/span> mirrored environments.\nYou want better OpenShift RBAC around image references.\nYou <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">BuildConfigs<\/span>, <span class=\"hljs-title\">S2I<\/span>, <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">OpenShift<\/span> <span class=\"hljs-title\">image<\/span> <span class=\"hljs-title\">workflows<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-101\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Red Hat specifically lists ImageStream advantages around triggers, periodic re-import, known-good image behavior, access control, and image sharing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Recommended Enterprise Pattern<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For enterprise OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-102\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Do<\/span> not deploy random external images directly in production.\nImport approved base images into controlled ImageStreams.\n<span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">ImageStreamTags<\/span> <span class=\"hljs-title\">such<\/span> <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">dev<\/span>, <span class=\"hljs-title\">qa<\/span>, <span class=\"hljs-title\">stage<\/span>, <span class=\"hljs-title\">prod<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">triggers<\/span> <span class=\"hljs-title\">only<\/span> <span class=\"hljs-title\">where<\/span> <span class=\"hljs-title\">automatic<\/span> <span class=\"hljs-title\">rollout<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">desired<\/span>.\n<span class=\"hljs-title\">Pin<\/span> <span class=\"hljs-title\">production<\/span> <span class=\"hljs-title\">releases<\/span> <span class=\"hljs-title\">to<\/span> <span class=\"hljs-title\">stable<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">digest<\/span>-<span class=\"hljs-title\">backed<\/span> <span class=\"hljs-title\">tags<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">scheduled<\/span> <span class=\"hljs-title\">imports<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">approved<\/span> <span class=\"hljs-title\">base<\/span> <span class=\"hljs-title\">images<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">registry<\/span> <span class=\"hljs-title\">policies<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">mirroring<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">disconnected<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">secured<\/span> <span class=\"hljs-title\">clusters<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">matching<\/span> <span class=\"hljs-title\">oc<\/span> <span class=\"hljs-title\">client<\/span> <span class=\"hljs-title\">version<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">your<\/span> <span class=\"hljs-title\">OpenShift<\/span> <span class=\"hljs-title\">server<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-102\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recommended flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">External Registry\n      |\n      v\nApproved ImageStream: my-httpd:latest\n      |\n      v\nPromotion: my-httpd:dev -&gt; my-httpd:test -&gt; my-httpd:prod\n      |\n      v\nDeployment uses my-httpd:prod\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Final Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>normal image deployment<\/strong> is simple and Kubernetes-portable:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc create deployment httpd-direct \\\n  --image=registry.access.redhat.com\/ubi9\/httpd-24:latest\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">An <strong>ImageStream deployment<\/strong> is OpenShift-native and better for enterprise image lifecycle management:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-103\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">import<\/span>-image my-httpd:latest \\\n  --<span class=\"hljs-keyword\">from<\/span>=registry.access.redhat.com\/ubi9\/httpd<span class=\"hljs-number\">-24<\/span>:latest \\\n  --confirm\n\noc <span class=\"hljs-keyword\">set<\/span> image-lookup my-httpd\n\noc create deployment httpd-is \\\n  --image=my-httpd:latest\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-103\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The practical difference:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-104\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Normal image = direct pull <span class=\"hljs-keyword\">from<\/span> registry.\nImageStream = OpenShift-managed image reference, metadata, tags, imports, triggers, promotion, and governance.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-104\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The best one-line answer:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-105\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">direct<\/span> <span class=\"hljs-title\">images<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">simple<\/span> <span class=\"hljs-title\">Kubernetes<\/span>-<span class=\"hljs-title\">style<\/span> <span class=\"hljs-title\">deployments<\/span>; <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">ImageStreams<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">you<\/span> <span class=\"hljs-title\">want<\/span> <span class=\"hljs-title\">OpenShift<\/span>-<span class=\"hljs-title\">native<\/span> <span class=\"hljs-title\">image<\/span> <span class=\"hljs-title\">tracking<\/span>, <span class=\"hljs-title\">promotion<\/span>, <span class=\"hljs-title\">triggers<\/span>, <span class=\"hljs-title\">refresh<\/span>, <span class=\"hljs-title\">rollback<\/span>, <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">enterprise<\/span> <span class=\"hljs-title\">control<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-105\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Cleanup<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-106\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc project httpd-image-demo\noc <span class=\"hljs-keyword\">delete<\/span> project httpd-image-demo\n\noc project httpd-compare\noc <span class=\"hljs-keyword\">delete<\/span> project httpd-compare\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-106\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>","protected":false},"excerpt":{"rendered":"<p>1. Introduction OpenShift can deploy applications in two major ways: Both approaches ultimately run containers in Pods, but they behave very differently in terms of tracking, automation,&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77369","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77369","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=77369"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77369\/revisions"}],"predecessor-version":[{"id":77370,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77369\/revisions\/77370"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}