Skip to content

Build and Publish a Docker Image

This action builds and publishes a Docker image to a container registry. For most of my projects I use DockerHub, but you could use this action and tweak it to use any container registry.

For publish docker images I usually restrict this to the main branch, however as this step is often just part of the CI pipeline, you will need some conditional logic to ensure the image is only published on the main branch (and not when the build is triggered by a feature/* or fix/* branch).

Minimal Pipeline Example

yaml
name: Build, Test & Publish

on:
  push:
    branches:
    - main
    - feature/*  
    - fix/*
  pull_request:
    branches:
    - main

jobs:
  publish:
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    name: Build and Publish Container Image
    runs-on: ubuntu-latest
    
    needs:
    - build

    steps:
    - uses: actions/checkout@v3
  
    - name: Setup Docker Metadata
      id: meta
      uses: docker/metadata-action@v4
      with:
          images: your-username/your-project
          tags: |
            type=raw,value=latest

    - name: Login to DockerHub
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_TOKEN }}

    - name: Build and Push Docker Image to DockerHub
      uses: docker/build-push-action@v4 
      with:
        file: './path/to/project/Dockerfile'
        context: ./path/to/project
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}

In the above pipeline a few changes will need to be made to suit the project you are working on:

  • In the setup docker metadata step, update the images to your DockerHub username and the name of your project.
  • In the build and push docker image step, update the file to the path of your Dockerfile, and the context to the path of your project.
  • You will also need to add your docker username and docker token to your GitHub repository secrets. The DOCKER_USERNAME is your DockerHub username, and the DOCKER_TOKEN is a token generated from DockerHub.