Build and Deploy a Docker image on GitHub Container Registry
Docker is a powerful platform that allows developers to package their applications and dependencies into lightweight, portable containers. By dockerizing your Node.js application, you can ensure that it runs consistently across various systems, simplifying deployment and reducing compatibility issues.
In this blog post, we'll take you through the process of dockerizing your Node.js application, making it easier to deploy, manage, and scale across different environments.
Prerequisites
- Docker installed on your local machine.
- Node & NPM installed on your local machine.
Getting Started
- In your terminal, create your Node JS file using
npm init -y
it will create thepackage.json
file for you.
{
"name": "ghcr",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"keywords": [],
"author": "",
"license": "ISC"
}
- Next, create your
index.js
file and paste the following code or you can work on your own express js configurations for your application. An index.js file is a common entry point or the main file in a JavaScript or Node.js application or module. When a module is imported or required in another file, the JavaScript runtime (such as Node.js) looks for the index.js file in the module's directory by default. This file typically contains the core logic of the application or exports the module's public API.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
- In your directory, delete your
node modules
folder as you don’t need them anymore.
Create and Build a Dockerfile
- Create your Dockerfile, and configure it for your Express JS application needs before we create our Dockerfile, create an account, and sign in to Docker Hub.
- Next, log in to your DockerHub account using the
docker login
command in your terminal.
- Write and configure your Dockerfile with the following configurations. A Dockerfile is a script containing a set of instructions used to create a Docker image for a specific application or service. It defines the environment, dependencies, and configurations required to run the application inside a Docker container. A Dockerfile is essentially a blueprint for building our Node image, which can then be run as a container on any system with Docker installed. A Dockerfile typically consists of various instructions that define the base image for our Node app, install dependencies, copy application files, set environment variables, expose ports, and specify the entry point or command to run the application.
FROM node:slim
WORKDIR /app
# copy from your current directory to your destination which is /app
COPY . /app
# after that go ahead and run some commands
RUN npm install
EXPOSE 3000
CMD node index.js
- Next, build your image but tag it with your DockerHub name and image name using the command
docker build -t <username>/<image_name>:0.0.1 .
The docker build -t
command is used to build a Docker image from a Dockerfile and assign a name (and optionally a tag) to the created image. The -t
flag stands for tag
and allows you to specify the name and tag in the format name:tag
. If you don't provide a tag, Docker will assign the default latest tag to the image.
- Check to see your Docker image using the command
docker images
. You’ll see your Node image details in your terminal. - Next, access your Node App in your browser using the port you built your image on.
- Next, after building your image, push it to the Docker registry in DockerHub using the command
docker push <dockerhub name>/<docker_image>tag
- Back in DockerHub, you can see your image and your latest tag.
Pushing Docker image to GitHub Container Registry
- Create a Personal Access Token (PAT) on GitHub:
- Go to your GitHub account settings. Click on Developer settings in the left sidebar, click on Personal access tokens and then Generate new token.
- Give your token a descriptive name, and select the following scopes:
read:packages
,write:packages
, anddelete:packages
. You might also need to select the repo scope if your image is private. - Click Generate token and copy the generated token. Store it securely, as you won't be able to see it again.
- Next, log in to GHCR using the Docker CLI, open your terminal, and run the following command.
docker login ghcr.io -u YOUR_GITHUB_USERNAME -p YOUR_PERSONAL_ACCESS_TOKEN
replaceYOUR_GITHUB_USERNAME
with your GitHub username, andYOUR_PERSONAL_ACCESS_TOKEN
with the token you generated earlier. - Build your Docker image if you haven’t already using the Docker command
docker build -t ghcr.io/OWNER/IMAGE_NAME:TAG .
Replace OWNER
with your GitHub username or organization name, IMAGE_NAME
with the desired name for your image, and TAG
with the desired version or tag for your image. For example:
- Next, push the Docker image to GHCR with the
docker push
command:docker push ghcr.io/OWNER/IMAGE_NAME:TAG
ReplaceOWNER
,IMAGE_NAME
, andTAG
with the same values you used earlier.
After the push is complete, your Docker image will be available on GHCR under your account or organization. You can manage and view your container images by visiting https://github.com/OWNER?tab=packages
, replacing OWNER with your GitHub username or organization name.
Conclusion
Empower your development experience by learning how to harness the full potential of GHCR. Our open-source workflows for GHCR lets you gain valuable insights into streamlining your containerized workflow so you can optimize your project development process.