GitHub Actions to build/push a Docker image

Page content

https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions

TL;DR

  1. mkdir -p .github/workflows.
  2. vim .github/workflows/deploy-image.yml:
    name: Create and publish a Docker image
    
    on:
      push:
        branches: ['main']
    
    env:
      REGISTRY: ghcr.io
      IMAGE_NAME: ${{ github.repository }}
    
    jobs:
      build-and-push-image:
        runs-on: ubuntu-latest
        permissions:
          contents: read
          packages: write
    
        steps:
          - name: Checkout repository
            uses: actions/checkout@v2
    
          - name: Log in to the Container registry
            uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
            with:
              registry: ${{ env.REGISTRY }}
              username: ${{ github.actor }}
              password: ${{ secrets.GITHUB_TOKEN }}
    
          - name: Extract metadata (tags, labels) for Docker
            id: meta
            uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
            with:
              images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
    
          - name: Build and push Docker image
            uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
            with:
              context: .
              push: true
              tags: ${{ steps.meta.outputs.tags }}
              labels: ${{ steps.meta.outputs.labels }}
    
  3. Push to the main branch.

Note

Run on your own container

From:

runs-on: ubuntu-latest

To:

runs-on: ubuntu-latest
container:
  image: myid/myimage:tag

Service containers

I wanted to test my app in Docker container with a DB instance, so I added service container in the job.

https://docs.github.com/en/actions/using-containerized-services/about-service-containers

runs-on: ubuntu-latest
container:
  image: rust:latest
services:
  mysql:
    image: mysql
    ports:
      - 5432:5432

Inside the main container rust:latest, the domain name of the service container is mysql, the name of service.