Build and Push a Container Image from Source Code With S2I

DZone 's Guide to

Build and Push a Container Image from Source Code With S2I

Use S2I to create a container image from your source code.

· Cloud Zone ·
Free Resource

source code

Create an image right from your source code with this tool.

Recently, while drafting an OpenShift solution tutorial, I explored an interesting tool called S2I (Source-to-Image). In this post, you will learn how to create a container image directly from your source code and push the generated container image to a private IBM Cloud Container registry.

You may also enjoy:  How to Create a Builder Image With S2I 

What is S2I (Source-to-Image)?

S2I is a tool for building reproducible, Docker-formatted container images. It produces ready-to-run images by injecting application source into a container image and assembling a new image. The new image incorporates the base image (the builder) and built source and is ready to use with the docker run   command. S2I supports incremental builds, which reuses previously downloaded dependencies, previously built artifacts, etc.

Installation and Setup

Let’s start by installing S2I on your machine.

You can install the s2i binary using  go get , which will download the source-to-image code into your $GOPATH, build the s2i binary, and install it into your  $GOPATH/bin:

go get github.com/openshift/source-to-image/cmd/s2i

For Mac, you can either follow the installation instructions for Linux (and use the darwin-amd64 link) or you can just install Source-to-Image with Homebrew:

brew install source-to-image

Follow the instructions here to install on other operating systems. To confirm the installation, run this command on a terminal or command prompt:


Follow the instructions mentioned in the link here to set up the IBM Cloud Container Registry CLI and your registry namespace.


Once created, open the terminal and export the MYNAMESPACE  environment variable pointing to your Registry namespace:

cat Dockerfile

Let’s Build

The s2i build command provides two options to generate a new container image:

Build a Docker image from a remote Git repository:

s2i build https://github.com/IBM-Cloud/get-started-node nodeshift/centos7-s2i-nodejs:latest us.icr.io/$MYNAMESPACE/webapp

Build from a local directory. If this directory is a git repo, the current commit will be built:

Clone the get-started-node Git repo and run the below command

s2i build . nodeshift/centos7-s2i-nodejs:latest us.icr.io/$MYNAMESPACE/webapplocal

Even before building an image, you can see the generated Dockerfile by appending --as-dockerfile Dockerfile to your build commands. Once generated, check the contents of the generated Dockerfile.

To understand the S2I requirements and the artifacts of the generated Dockerfile, see the documentation.

Run the App Locally and Push It to Private Registry

Check the generated Docker image by running it locally with the following command:

docker run -p 3000:3000 -it us.icr.io/$MYNAMESPACE/webapp
Docker image screen
Docker image screen

Push the container image to the private IBM Cloud Container Registry. Don’t forget to log into the container registry with ibmcloud cr logincommand:

docker push us.icr.io/$MYNAMESPACE/webapp

You can check the container image by running the following command:

ibmcloud cr images

What’s Next?

Follow the steps mentioned in the solution tutorial to deploy the generated container image as a new app on OpenShift. Also, learn to create a scalable web application on OpenShift in this solution tutorial.

Further Reading

How to Deploy a Container to The IBM Cloud Kubernetes Service

Kubernetes vs OpenShift: What Is the Difference?

openshift ,kubernetes ,container registry ,ibm cloud ,cloud ,s2i ,container images

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}