GitHubのdockerについてまとめています。
GitHubでDockerイメージを公開する
GitHubではCI(継続的インテグレーション)の一環として、DockerHubやGitHub PackagesなどのレジストリにDockerのコンテナイメージを公開出来ます。以下は、ビルド後にDocker Hubへのイメージ公開を行うためのyamlファイルの例です。
name: Publish Docker image on: release: types: [published] jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v2 - name: Log in to Docker Hub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Push to Docker Hub uses: docker/build-push-action@v2 with: push: true tags: my-docker-hub-namespace/my-docker-hub-repository:latest
参考)Dockerイメージの公開 – GitHub Docs
YAMLファイルのstepsに以下を記述することで、ビルド時にDockerHubへのイメージ公開をおこなっています。
- リポジトリのチェックアウト
- Docker Hubへのログイン
- Docker Hubへのイメージのプッシュ
GitHubから、Dockerにコンテナイメージを自動公開するための認証
Dockerにコンテナレジストリにイメージを公開するためには、GitHubにて個人アクセストークン(PAT)で、read:packages、write:packages、delete:packagesを選択します。
コンテナイメージのダウンロードとメタデータを読むためにread:packages、コンテナイメージのアップロードのためにwrite:packages、コンテナイメージの削除のためにdelete:packagesの権限が必要になります。
参考)イメージの構築と実行 — Docker-docs-ja 19.03 ドキュメント
PATを生成したら、Docker側でDockerとGitHubのアカウントをリンクします。
DockerのSettings→Linked Accountsにて、GitHubの「Connect」をクリックします。
DockerとGitHubの連携を承認する画面が表示されます。Authorize dockerをクリックします。
必要に応じて、パスワードを入力します。
アカウントのリンクが完了すると、Linked AccountsのGitHubの欄にリンク付されたカウント名が表示されます。
GitHub Packages Container regstryにコンテナイメージを公開
YAMLファイルのstepsに処理を追加することで、複数のレジストリにイメージを公開することも可能です。GitHub自体にも、Dockerイメージを公開するサービスGitHub Packages Container regstryというサービスがあります。
参考)GitHubによるDockerコンテナレジストリ「GitHub Packages Container registry」が正式サービスに - Publickey
GitHub Packages Container regstryでは、DockerやOCIのイメージをhttps://ghcr.ioを使用するコンテナレジストリに保存して管理できます。2021年6月現在、コンテナレジストリでは以下のコンテナフォーマットをサポートしています。
- DDocker イメージマニフェスト V2、スキーマ 2
- Open Container Initiative (OCI) 仕様
以下は、ghcr.ioにコンテナイメージをプッシュするコマンドです。
$ docker push ghcr.io/OWNER/IMAGE_NAME:latest
公開したイメージをpullする場合は、ダイジェストSHA値を指定します。
# dockerイメージのダイジェストSHA値を調べる $ docker inspect ghcr.io/OWNER/IMAGE_NAME # 必要に応じローカルでのイメージを削除 $ docker rmi ghcr.io/OWNER/IMAGE_NAME:latest # イメージのあとにダイジェストSHA値をつけてイメージをプル $ docker pull ghcr.io/OWNER/IMAGE_NAME@sha256:82jf9a84u29hiasldj289498uhois8498hjs29hkuhs
以下は、コンテナイメージのビルドの手順です。ビルド後、イメージIDを使ってホスティング先でのタグ付を行います。
# コンテナイメージ hello_dockerのビルド $ docker build -t hello_docker . # dockerイメージのIDを調べる $ docker images > REPOSITORY TAG IMAGE ID CREATED SIZE > ghcr.io/my-org/hello_docker latest 38f737a91f39 47 hours ago 91.7MB > ghcr.io/my-username/hello_docker latest 38f737a91f39 47 hours ago 91.7MB > hello-world latest fce289e99eb9 16 months ago 1.84kB #イメージIDを使用して、イメージ名をホスティング先でタグ付け $ docker tag 38f737a91f39 ghcr.io/OWNER/NEW_IMAGE_NAME:latest
なお、コンテナイメージのビルドをおこなうには、Dockerfileにビルド方法を記述しておく必要があります。以下は、Dockerfileのサンプルです。
# 親イメージとして公式イメージを使う FROM node:current-slim # 作業用(working)ディレクトリを指定 WORKDIR /usr/src/app # ホスト上のファイルを現在の場所にコピー COPY package.json . # イメージのファイルシステム内でコマンドを実行 RUN npm install # 実行時、コンテナが特定のポートをリッスンするよう Docker に通知 EXPOSE 8080 # コンテナ内で指定したコマンドを実行 CMD [ "npm", "start" ] # 残りのソースコードをホスト上からイメージのファイルシステム上にコピー COPY . .
【関連記事】
▶DockerでRuby on Rails開発環境を作りアプリをGitHubに公開する
まとめ
- GitHubのビルド時に、Dockerにてコンテナイメージを自動公開することが可能
- ビルド時に複数のコンテナレジストリでイメージを公開できる
- GitHubにもて、コンテナレジストリサービスGitHub Packages Container regstryがある