{"id":49180,"date":"2025-04-25T16:46:12","date_gmt":"2025-04-25T16:46:12","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49180"},"modified":"2025-04-25T16:46:12","modified_gmt":"2025-04-25T16:46:12","slug":"what-is-openshift-s2i","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/what-is-openshift-s2i\/","title":{"rendered":"What is Openshift S2I?"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf What is S2I?<\/h1>\n\n\n\n<p><strong>S2I = Source-to-Image<\/strong><\/p>\n\n\n\n<p>\u2705 It\u2019s a <strong>build process<\/strong> invented by OpenShift (Red Hat) to automate:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&#8220;Take my source code + take a base image \u2192 and build a new runnable application container.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p>You give it:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Source code<\/strong> (like HTML, PHP, Python app, Java code)<\/li>\n\n\n\n<li><strong>S2I base image<\/strong> (like nginx, nodejs, python builder image)<\/li>\n<\/ul>\n\n\n\n<p>It gives you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>New container image<\/strong> that has both the code + runtime server inside.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce6 What is an S2I Base Image?<\/h1>\n\n\n\n<p>An <strong>S2I base image<\/strong> is a <strong>special Docker container image<\/strong> that:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>Has a web server, app server, or runtime pre-installed<\/td><td>e.g., nginx, nodejs, python<\/td><\/tr><tr><td>Has scripts inside (<code>assemble<\/code>, <code>run<\/code>)<\/td><td>Helps OpenShift build a new app image automatically<\/td><\/tr><tr><td>Waits for your <strong>source code<\/strong><\/td><td>Your app code is injected during build<\/td><\/tr><tr><td>Produces a <strong>new runnable image<\/strong><\/td><td>Combining base + your code<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 S2I base images are <strong>made specially for OpenShift pipelines<\/strong>.<\/p>\n\n\n\n<p>They are <strong>not<\/strong> meant to be directly run without building first.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\udde0 Easy Example:<\/h1>\n\n\n\n<p>Imagine you want to deploy a static website:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Traditional Way<\/th><th>S2I Way<\/th><\/tr><\/thead><tbody><tr><td>You manually build Docker image (nginx + your site files)<\/td><td>You push your HTML files to GitHub<\/td><\/tr><tr><td>You write Dockerfile yourself<\/td><td>OpenShift runs <code>oc new-app nginx-s2i~your-git-repo<\/code><\/td><\/tr><tr><td>You manually build\/push container<\/td><td>OpenShift builds everything automatically<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 <strong>Less work<\/strong> for you \u2705 <strong>More automation<\/strong> for you<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce2 Example of S2I base images:<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Base Image<\/th><th>Language\/Runtime<\/th><th>Usage<\/th><\/tr><\/thead><tbody><tr><td><code>registry.redhat.io\/rhscl\/nginx-116-rhel7<\/code><\/td><td>nginx<\/td><td>Serve HTML sites<\/td><\/tr><tr><td><code>registry.redhat.io\/rhscl\/nodejs-14-rhel7<\/code><\/td><td>Node.js 14<\/td><td>Node.js apps<\/td><\/tr><tr><td><code>registry.redhat.io\/rhscl\/python-38-rhel7<\/code><\/td><td>Python 3.8<\/td><td>Python apps<\/td><\/tr><tr><td><code>registry.redhat.io\/rhscl\/php-73-rhel7<\/code><\/td><td>PHP 7.3<\/td><td>PHP apps<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>All these are <strong>S2I base images<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udccb How an S2I base image actually works inside:<\/h1>\n\n\n\n<p>It includes scripts like:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Script<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><code>assemble<\/code><\/td><td>How to <strong>copy your source code<\/strong> into the container and prepare the app<\/td><\/tr><tr><td><code>run<\/code><\/td><td>How to <strong>start the server<\/strong> when container runs<\/td><\/tr><tr><td><code>save-artifacts<\/code><\/td><td>Optional, to cache dependencies<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 OpenShift uses these scripts automatically when you run <code>oc new-app<\/code>.<\/p>\n\n\n\n<p>You don\u2019t have to write Dockerfiles manually!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 S2I Full Flow (Visual)<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Your GitHub Repo (HTML \/ PHP \/ Python App)\n          \u2193\n+-------------------+\n|  S2I Base Image    |\n| (nginx, python)    |\n+-------------------+\n          \u2193\nOpenShift S2I Process (BuildConfig)\n          \u2193\n<span class=\"hljs-keyword\">New<\/span> Image (runtime + your code together)\n          \u2193\nPod runs your application!\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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\">\ud83d\udd25 When to use S2I<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Use S2I if&#8230;<\/th><th>Reason<\/th><\/tr><\/thead><tbody><tr><td>You have app <strong>source code<\/strong> (HTML, PHP, Node.js, Python, etc.)<\/td><td>Easy auto-build<\/td><\/tr><tr><td>You don&#8217;t want to write <strong>Dockerfiles manually<\/strong><\/td><td>Saves your time<\/td><\/tr><tr><td>You want to build and deploy faster inside OpenShift<\/td><td>Automated pipelines<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 S2I is powerful especially for <strong>development workflows<\/strong> and <strong>CI\/CD pipelines<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\u2728 In one simple sentence:<\/h1>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>S2I Base Image is a starting point container that expects your source code and creates a ready-to-run application image automatically inside OpenShift.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 Summary Table:<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>S2I<\/td><td>Source-to-Image build process<\/td><\/tr><tr><td>S2I Base Image<\/td><td>Pre-built image waiting for your code<\/td><\/tr><tr><td>Used for<\/td><td>Automating app builds inside OpenShift<\/td><\/tr><tr><td>Needs Source Code?<\/td><td>\u2705 Yes<\/td><\/tr><tr><td>Runs directly as pod?<\/td><td>\u274c No, needs build step first<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 Practical Tip for You<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>What to use<\/th><\/tr><\/thead><tbody><tr><td>Want to run simple nginx server quickly<\/td><td>Use <code>nginxinc\/nginx-unprivileged<\/code><\/td><\/tr><tr><td>Want to build HTML app and serve<\/td><td>Use <code>rhscl\/nginx-116-rhel7<\/code> as S2I<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf <strong>Running an S2I Base Image in OpenShift Cluster<\/strong><\/h1>\n\n\n\n<p>\u2705 Beginner-friendly<br>\u2705 Realistic example<br>\u2705 Works on OpenShift 4.x or later<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udce6 S2I Tutorial Overview<\/h1>\n\n\n\n<p>We will:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Task<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Pick an S2I base image<\/td><td>Example: <code>registry.redhat.io\/rhscl\/nginx-116-rhel7<\/code><\/td><\/tr><tr><td>2<\/td><td>Prepare simple source code<\/td><td>HTML project on GitHub<\/td><\/tr><tr><td>3<\/td><td>Create S2I app in OpenShift<\/td><td>Using <code>oc new-app<\/code><\/td><\/tr><tr><td>4<\/td><td>Deploy and access app<\/td><td>Via OpenShift Route<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 Step 1: Pick an S2I Base Image<\/h1>\n\n\n\n<p>We will use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">registry.redhat.io\/rhscl\/nginx-116-rhel7\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 It\u2019s an NGINX S2I builder (for serving static websites).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\uddf0 Step 2: Prepare Source Code (GitHub)<\/h1>\n\n\n\n<p>You need a GitHub repo with static website files (HTML\/CSS).<\/p>\n\n\n\n<p>Example ready-to-use repo:<br>\u27a1\ufe0f <a href=\"https:\/\/github.com\/sclorg\/nginx-container\/tree\/master\/1.16\/test\/test-app\/\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/sclorg\/nginx-container\/tree\/master\/1.16\/test\/test-app\/<\/a><\/p>\n\n\n\n<p>Or you can <strong>create your own repo<\/strong> like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a new GitHub repo:<br>Example: <code>https:\/\/github.com\/yourusername\/my-s2i-nginx-app<\/code><\/li>\n\n\n\n<li>Add some simple <code>index.html<\/code>:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-comment\">&lt;!-- index.html --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Welcome to S2I NGINX App<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Hello from OpenShift + S2I!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/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\">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>\u2705 Push this file to GitHub.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 Step 3: Create S2I App in OpenShift<\/h1>\n\n\n\n<p>\ud83d\udc49 Login to your OpenShift cluster:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login https:<span class=\"hljs-comment\">\/\/your-openshift-cluster:6443<\/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\">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>\ud83d\udc49 Now create your S2I app:<\/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\">new<\/span>-app registry.redhat.io\/rhscl\/nginx<span class=\"hljs-number\">-116<\/span>-rhel7~https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-s2i-nginx-app --strategy=source<\/span>\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>\u2705 What this command does:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pulls base image <code>nginx-116-rhel7<\/code><\/li>\n\n\n\n<li>Pulls your source code from GitHub<\/li>\n\n\n\n<li>Builds a new image combining both<\/li>\n\n\n\n<li>Deploys a pod automatically<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udf0d Step 4: Expose Route (to Access App)<\/h1>\n\n\n\n<p>Create a Route:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/my-s2i-nginx-app\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 Then get the URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> routes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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>You&#8217;ll get something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/my-s2i-nginx-app-yourproject.apps.cluster.example.com<\/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\">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>Open it in browser \u2014<br>\u2728 <strong>You will see your HTML page served from the new OpenShift app!<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udccb Full Commands Summary<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Login<\/span>\noc login https:<span class=\"hljs-comment\">\/\/your-openshift-cluster:6443<\/span>\n\n<span class=\"hljs-comment\"># Create S2I app<\/span>\noc <span class=\"hljs-keyword\">new<\/span>-app registry.redhat.io\/rhscl\/nginx<span class=\"hljs-number\">-116<\/span>-rhel7~https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-s2i-nginx-app --strategy=source<\/span>\n\n<span class=\"hljs-comment\"># (Optional) Watch build<\/span>\noc logs -f bc\/my-s2i-nginx-app\n\n<span class=\"hljs-comment\"># Expose a Route<\/span>\noc expose svc\/my-s2i-nginx-app\n\n<span class=\"hljs-comment\"># Get public URL<\/span>\noc get routes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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\">\ud83d\udd25 Important Tips<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Solution<\/th><\/tr><\/thead><tbody><tr><td><code>error: cannot find source repository<\/code><\/td><td>Check GitHub URL is public<\/td><\/tr><tr><td><code>imagepullbackoff<\/code><\/td><td>Check cluster can pull Red Hat registry images (pull secret)<\/td><\/tr><tr><td>App not updating?<\/td><td>Run <code>oc start-build my-s2i-nginx-app --from-dir=.<\/code> to rebuild manually<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83e\udde0 Visual Flow<\/h1>\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\">GitHub Repo (HTML)\n        \u2193\noc <span class=\"hljs-keyword\">new<\/span>-app (S2I build)\n        \u2193\nBuildConfig + ImageStream created\n        \u2193\nPod created <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-keyword\">new<\/span> image\n        \u2193\nService + Route exposed\n        \u2193\nYour app live on internet! \ud83d\ude80\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\">\ud83c\udfc6 Final Quick Recap<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Action<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Pick S2I builder (<code>registry.redhat.io\/rhscl\/nginx-116-rhel7<\/code>)<\/td><\/tr><tr><td>2<\/td><td>Prepare GitHub repo (index.html)<\/td><\/tr><tr><td>3<\/td><td>Run <code>oc new-app<\/code> with <code>--strategy=source<\/code><\/td><\/tr><tr><td>4<\/td><td>Expose service using Route<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 You now know <strong>how to run S2I base images in OpenShift<\/strong>!<br>\u2705 This knowledge is <strong>essential for DevOps, OpenShift developers, CI\/CD engineers<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><br>Let\u2019s do a <strong>real<\/strong> complete project:<br>You\u2019ll <strong>build your own HTML website<\/strong>,<br>then <strong>deploy it into OpenShift<\/strong> using <strong>S2I process<\/strong>.<\/h1>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfaf Project Goal<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Action<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Create a simple HTML website<\/td><\/tr><tr><td>2<\/td><td>Push the website to GitHub<\/td><\/tr><tr><td>3<\/td><td>Deploy it into OpenShift using S2I base image<\/td><\/tr><tr><td>4<\/td><td>Access your site via OpenShift Route<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0 Step 1: Create Your Own HTML Website<\/h1>\n\n\n\n<p>On your local machine, create a project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">mkdir my-openshift-website\ncd my-openshift-website\n<\/code><\/span><\/pre>\n\n\n<p>Now create a simple <code>index.html<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-comment\">&lt;!-- my-openshift-website\/index.html --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">title<\/span>&gt;<\/span>Welcome to My OpenShift Website<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">title<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">head<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>Hello World from Rajesh! \ud83d\ude80<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span>&gt;<\/span>Running on OpenShift with S2I magic!<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">body<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">html<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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>\u2705 Done \u2014 your website is ready.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udf0d Step 2: Push Your Website to GitHub<\/h1>\n\n\n\n<p>Initialize Git and push:<\/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\">git init\ngit add .\ngit commit -m <span class=\"hljs-string\">\"Initial commit - my openshift html site\"<\/span>\ngit branch -M main\ngit remote add origin https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-openshift-website.git<\/span>\ngit push -u origin main\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>\u2705 Now your project is live at:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-openshift-website<\/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\">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><em>(Public GitHub repo needed for OpenShift to pull.)<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\ude80 Step 3: Deploy to OpenShift Using S2I<\/h1>\n\n\n\n<p>\u2705 Login to your OpenShift cluster:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login https:<span class=\"hljs-comment\">\/\/your-openshift-cluster:6443<\/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\">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>\u2705 Now run S2I Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" 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.redhat.io\/rhscl\/nginx<span class=\"hljs-number\">-116<\/span>-rhel7~https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-openshift-website --strategy=source<\/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\">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>\u2705 OpenShift will:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pull NGINX S2I base image (<code>rhscl\/nginx-116-rhel7<\/code>)<\/li>\n\n\n\n<li>Pull your HTML website from GitHub<\/li>\n\n\n\n<li>Build a new container image<\/li>\n\n\n\n<li>Deploy a Pod automatically<\/li>\n<\/ul>\n\n\n\n<p>\u2705 Watch the build logs (optional):<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/my-openshift-website\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\">\ud83c\udf10 Step 4: Expose your app with a Route<\/h1>\n\n\n\n<p>\u2705 Create a Route:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/my-openshift-website\n<\/code><\/span><\/pre>\n\n\n<p>\u2705 Get the public URL:<\/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> routes\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>You\u2019ll get something like:<\/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\">http:<span class=\"hljs-comment\">\/\/my-openshift-website-myproject.apps.cluster.example.com<\/span>\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>\u2705 Open this URL in browser!<\/p>\n\n\n\n<p>\ud83c\udf89 You\u2019ll see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Hello World <span class=\"hljs-keyword\">from<\/span> Rajesh! \ud83d\ude80\nRunning on OpenShift <span class=\"hljs-keyword\">with<\/span> S2I magic!\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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>\u2705 Your custom HTML website is now <strong>live<\/strong> on OpenShift! \ud83c\udf1f<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udccb Full Commands Summary (Cheat Sheet)<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># 1. Create HTML site<\/span>\nmkdir my-openshift-website &amp;&amp; cd my-openshift-website\n<span class=\"hljs-comment\"># (create index.html)<\/span>\n\n<span class=\"hljs-comment\"># 2. Push to GitHub<\/span>\ngit init\ngit add .\ngit commit -m <span class=\"hljs-string\">\"initial commit\"<\/span>\ngit remote add origin https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-openshift-website.git<\/span>\ngit push -u origin main\n\n<span class=\"hljs-comment\"># 3. Deploy to OpenShift<\/span>\noc login https:<span class=\"hljs-comment\">\/\/your-openshift-cluster:6443<\/span>\noc <span class=\"hljs-keyword\">new<\/span>-app registry.redhat.io\/rhscl\/nginx<span class=\"hljs-number\">-116<\/span>-rhel7~https:<span class=\"hljs-comment\">\/\/github.com\/yourusername\/my-openshift-website --strategy=source<\/span>\n\n<span class=\"hljs-comment\"># 4. Watch build (optional)<\/span>\noc logs -f bc\/my-openshift-website\n\n<span class=\"hljs-comment\"># 5. Expose<\/span>\noc expose svc\/my-openshift-website\n\n<span class=\"hljs-comment\"># 6. Get URL<\/span>\noc get routes\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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\">\ud83e\udde0 Visual Architecture<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Your GitHub Repo (index.html)\n         \u2193\nS2I Build Process (oc <span class=\"hljs-keyword\">new<\/span>-app)\n         \u2193\nBuildConfig + ImageStream\n         \u2193\n<span class=\"hljs-keyword\">New<\/span> Container Image Created\n         \u2193\nPod Running + Service\n         \u2193\nRoute Created\n         \u2193\n<span class=\"hljs-keyword\">Public<\/span> Website LIVE \ud83d\ude80\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><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\">\ud83d\udce2 Key Points to Remember<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Topic<\/th><th>Tip<\/th><\/tr><\/thead><tbody><tr><td>Base Image<\/td><td><code>registry.redhat.io\/rhscl\/nginx-116-rhel7<\/code><\/td><\/tr><tr><td>Strategy<\/td><td><code>--strategy=source<\/code><\/td><\/tr><tr><td>Code Location<\/td><td>Public GitHub repo<\/td><\/tr><tr><td>Exposing service<\/td><td>Use <code>oc expose svc\/&lt;service-name&gt;<\/code><\/td><\/tr><tr><td>Cluster pull secrets<\/td><td>Must be able to pull Red Hat registry images<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83c\udfc6 Now you know how to:<\/h1>\n\n\n\n<p>\u2705 Create your own HTML app<br>\u2705 Deploy it into OpenShift using S2I<br>\u2705 Access it publicly over internet<br>\u2705 Automate build from GitHub source<br>\u2705 Master basic OpenShift developer workflow \ud83d\ude80<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><\/h1>\n","protected":false},"excerpt":{"rendered":"<p>\ud83c\udfaf What is S2I? S2I = Source-to-Image \u2705 It\u2019s a build process invented by OpenShift (Red Hat) to automate: &#8220;Take my source code + take a base image \u2192 and&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-49180","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49180","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=49180"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49180\/revisions"}],"predecessor-version":[{"id":49181,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49180\/revisions\/49181"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}