独自のDockerImageを作成して、GitHub ActionsからDocker Hubにpushする【Docker】【GitHubActions】

はじめに

Dockerを使っていると自分でimageをカスタマイズしたくなることがあると思います
今回は、Simpleなカスタマイズしたimageを作成して、GitHub Actions上で自動でDocker Hubにpushするところまでを作っていきます

環境

  • Docker
  • Docker Hub(アカウントが必要.無料アカウントでOK)

準備

docker hubのTokenを作成

まずは docker hubの Access Tokensを作成します。

今回は、Write(upload)も追加します

GitHub Secretの登録

GitHub Actionsからdocker hubにpushしたいので、usernameや tokenを 以下のKeyとして Repository secrets に登録します

  • DOCKER_HUB_USERNAME : user name
  • DOCKER_HUB_ACCESS_TOKEN : docker hub token

Docker imageの作成

今回は、python3.10をベースに起動したら hello World + 現在の時間 を表示するimageを作成します

# 使用するベースイメージを指定
FROM python:3.10

# ワーキングディレクトリを設定
WORKDIR /usr/src/app

# 日本時間での現在の日付と時刻を取得し、それを"Hello World"メッセージと一緒に出力するPythonスクリプトを作成
RUN echo "import datetime; print('Hello World at', datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9), 'JST')))" > hello.py

# Dockerコンテナが起動したときに実行するコマンドを指定
CMD ["python", "./hello.py"]

GitHub Actionsによる自動化

docker imageを作ってもdocker hubにpushするのが手動だと大変なので、GitHub Actionsから自動で行えるようにします
また、作成したimageが正しく動いているかのデバッグもpushの後に処理して見れるようにします

DockerHubにpush時にuploadをするActionの作成

先ほど登録した user name とtokenを使って、ログインを行います

    - name: Login to Docker Hub
      uses: docker/login-action@v3.0.0
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

Actionの設定ファイルは以下です

name: Docker Build and Push

on:
  push:
    branches:
      - main

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout Repository
      uses: actions/checkout@v4.1.1

    - name: Login to Docker Hub
      uses: docker/login-action@v3.0.0
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

    - name: Build and Push Docker Image
      uses: docker/build-push-action@v5.1.0
      with:
        context: .
        file: ./Dockerfile
        push: true
        tags: ayousanz/test1:latest

uploadしたimageのデバッグ用のActionの作成

上記のActionsが終わるまで、成功したら実行されるようにします

if: ${{ github.event.workflow_run.conclusion == 'success' }}

Actionの設定ファイルは以下です

name: Docker Image Test

on:
  workflow_run:
    workflows: ["Docker Build and Push"]
    types:
      - completed

jobs:
  test:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
    - name: Checkout Repository
      uses: actions/checkout@v4.1.1

    - name: Pull Docker Image from Docker Hub
      run: docker pull ayousanz/test1:latest

    - name: Run Docker Image
      run: docker run --rm ayousanz/test1:latest

    # ここでテストコマンドを実行
    - name: Test Command
      run: echo "Run your test commands here"