はじめに
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を Repository secrets
に登録します
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"