DEV Community

Cover image for Upload Docker Images to GitHub: A Simple Guide with GitHub Actions
Jack Kweyunga
Jack Kweyunga

Posted on

Upload Docker Images to GitHub: A Simple Guide with GitHub Actions

We are going to create a GitHub action that, when triggered, builds and pushes our application image to the GitHub container registry, making it ready for production or testing. Triggers will be manual or on push.

Who is this for.

  • Docker enthusiasts

  • GitHub actions users

  • DevOps practitioners

The process.

First, create a Dockerfile for your project.

Test your Dockerfile to ensure it works and successfully builds a functional Docker image.

Create the following folder structure at the root of your application. Add a file named docker-image.yml.

my-project
    .github
        workflows
            docker-image.yml
Enter fullscreen mode Exit fullscreen mode

Add the following content to the docker-image.yml file. Change the branch name if it is different from the one you are targeting.


name: ci # Put the name of your choice

on:
  workflow_dispatch:
  push:
    branches:
      - "master" # Change to the branch name you are targeting

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }} # takes the name of the repository. 

jobs:

  build-publish-deploy:
    name: build and push docker
    runs-on: ubuntu-latest
    permissions:
      contents: write
      packages: write

    steps:

    - name: checkout
      uses: actions/checkout@v3

    - name: Set up Docker Builds
      uses: docker/setup-buildx-action@v2

    - name: Login to Container registry
      uses: docker/login-action@v2
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@69f6fc9d46f2f8bf0d5491e4aabe0bb8c6a4678a
      with:
        images: |
          ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
        tags: |
          type=ref,event=branch
          type=ref,event=tag
          type=ref,event=pr
          type=sha
        flavor: |
          latest=auto
          prefix=
          suffix=

    - name: Build and push hash tagged image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
        cache-to: type=inline
Enter fullscreen mode Exit fullscreen mode

Commit your changes and push them to GitHub.

After that, visit the Actions tab in your GitHub repository to see available and running GitHub actions. GitHub actions are displayed using the name specified in the docker-image.yml file. In our case, we named our action "ci". You can name it whatever you like.

By selecting the "ci" GitHub action, you can manually trigger it at any time to build and push your application Docker images to GitHub's container registry (ghcr.io) as packages.

Why would you do this?

This process automates your Docker builds using GitHub actions. Automating builds is a key step in setting up a complete CI/CD pipeline for your development workflow. CI/CD boosts the performance of any development team by cutting deployment time, reducing lead time, lowering the change failure rate, and enhancing the overall development experience.

All the best 😎

Top comments (0)