Skip to main content

GitHub Actionsを使ってNode.jsのDockerイメージをDocker Hubレジストリに公開する方法

著者

2021年8月9日

0 分で読めます

前回の記事では、GitHub Actionsを使ってNode.jsのDockerイメージをGitHub Packagesレジストリに公開する方法を、手順に沿って解説しました。今回は、ビルドしたDockerイメージをパブリックDocker Hubレジストリに公開する方法に焦点を当てます。

これがなぜ便利なのか、と思うかもしれません。Dockerのコマンドラインアプリケーションdockerでは、デフォルトのレジストリがdocker.ioに設定されており、Docker Hubレジストリを指しています。そのため、次のように<user>/<repository>形式でイメージを取得でき、開発者にとって使いやすい環境になります。たとえば、Snyk CLIをDockerイメージとして使う場合は、次のようにします。

docker pull snyk/snyk-cli

この記事では、Dockerイメージを新たにビルドして公開するワークフローの設定方法を、手順に沿って説明します。このワークフローは、前回紹介したGitHub Packagesレジストリ向けのワークフローと並行して実行できます。

前回の記事と同様、この記事では、CLIからDockerコンテナを管理するオープンソースのNode.jsコマンドラインツールDocklyを取り上げ、DockerイメージをDocker Hubにプッシュする方法を紹介します。DocklyのGitHubリポジトリで最終的なワークフローを確認できます。

GitHub Actionsワークフローを作成する

新しいワークフローを追加するには、.github/workflows/ディレクトリに新しいファイルを作成するか、GitHubでオープンソースリポジトリを開き、ActionsタブをクリックしてからNew Workflowをクリックし、新しいワークフローを作成します。

「Docker: GitHub Packages」と「All workflows」フィルターが表示された、ワークフロー一覧のGitHub Actionsページ。

Docker Hubへの公開に使うワークフローファイルに、docker-publish-to-dockerhub.ymlなどのファイル名を付けます。

GitHubのUIから作成する場合、ワークフローファイルに内容があらかじめ入力されていることがあります。その場合は削除して、以下を追加してください。

name: "Docker: Docker Hub"

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
  push:
    branches: [ main ]
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ main ]

env:
  REGISTRY: docker.io
  IMAGE_NAME: ${{ github.repository }}

それぞれの詳細は前回の記事で説明していますが、ここで要点を振り返ります。

  • このDocker Hubワークフローは、リポジトリのmainブランチへのプッシュ、タグのリリース、プルリクエストのたびに実行されます。

  • グローバル環境変数では、REGISTRYをdocker.ioに設定します。これにより、イメージはDocker Hubにプッシュされ、そこから利用できるようになります。また、IMAGE_NAMEにはGitHubのユーザー名とリポジトリ名を設定します。Docker Hubのユーザー名が異なる場合は、この値を変更してください。

次にジョブを定義し、Dockerイメージをビルドしてから公開するまでの処理を設定します。

Docker Hubにログインし、Dockerイメージをビルドして公開する

次に、以下の操作を行います。

  1. Docker Hubにログインします。そのためにDocker Hubでトークンを作成し、GitHubリポジトリの設定でリポジトリシークレットとして登録する必要があります。

  2. ビルドするDockerイメージのメタデータを抽出し、イメージのビルドプロセスで利用できるようにします。

  3. ビルドしたDockerイメージをDocker Hubにプッシュします。

これらの設定を次のコードスニペットで行います。前の手順で作成したワークフローの内容に追加してください。

jobs:
  build_and_publish:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          flavor: |
            latest=true
            prefix=
            suffix=

      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

ワークフローファイルを適用してmainブランチにマージすると、ビルドが成功し、新しいDockerイメージがDocker Hubレジストリにプッシュされるはずです。

mainブランチでDocker Hubへの公開を行う新しいジョブを示すGitHub Actionsの通知

既知の注意点として、現時点では、イメージの公開先であるDocker Hubリポジトリに、適切な説明やREADMEの内容が自動的に反映されません。公式のGitHub Actiondocker/build-and-pushでは、この機能が提供されていないためです。

この機能を利用したい場合、メンテナーはマーケットプレイスにあるGitHub ActionDocker Hub Descriptionを推奨しており、ドキュメントに採用可能な使用例も紹介しています。

Docker HubレジストリからDockerイメージを取得する

Docker Hubから新しいDockerイメージを取得するには、使い慣れたdocker pull コマンドを実行するだけです。たとえば、次のようにします。

$ docker pull <user>/<repository>
Using default tag: latest
latest: Pulling from <user>/<repository>
b4d181a07f80: Pulling fs layer
de8ecf497b75: Pulling fs layer
69b92f9e5e70: Pulling fs layer
1f2b8e2c8ad8: Waiting
d0f4259cb643: Waiting
9ae47f3f99ba: Waiting
87270829eb60: Waiting
905fc634546c: Waiting

脆弱なDockerイメージをプッシュしていませんか?

ここで終わりではありません。Snykを使えば、Dockerイメージの脆弱性を検出、監視し、修正することもできます。CLIを使う方法や、Docker HubからDockerイメージを直接インポートしてセキュリティ上の脆弱性を監視する方法など、ニーズに合ったワークフローを選べます。

同僚のEric Smallingが、知識を深めたい方に向けて、開発者主導のワークフロー – Dockerfileとイメージのスキャン、優先順位付け、修正に関するベストプラクティスガイドを詳しく執筆しています。最後に、GitHub Actionsのエコシステムで利用できるSnyk GitHub Actionを使えば、オープンソースライブラリやコンテナイメージのセキュリティ上の脆弱性をスキャンできます。

さらに詳しく

Dockerイメージのビルドに関するベストプラクティスをさらに詳しく知りたい方は、以下をご覧ください。

  1. DockerでNode.jsウェブアプリケーションをコンテナ化するためのベストプラクティス10選

  2. Node.js開発者のためのDocker:セキュリティで失敗しないために知っておくべき5つのこと

前回の記事をまだ読んでおらず、DockerイメージをGitHub Packagesに公開したい場合は、GitHub Actionsを使ってDockerイメージをGitHub Packagesレジストリに公開する方法をご覧ください。

開発者ファーストのコンテナセキュリティ

Snykは、コンテナイメージとKubernetesワークロードの脆弱性を検出し、自動的に修正します。