ドキュメントには頻繁に更新が加えられ、その都度公開されています。本ページの翻訳はまだ未完成な部分があることをご了承ください。最新の情報については、英語のドキュメンテーションをご参照ください。本ページの翻訳に問題がある場合はこちらまでご連絡ください。
記事のバージョン: Free, Pro, and Team
記事のバージョン: Free, Pro, and Team

GitHub ActionsのためのDockerfileサポート

Dockerコンテナアクション用のDockerfileを作成する際には、いくつかのDockerの命令がGitHub Actionsやアクションのメタデータファイルとどのように関わるのかを知っておく必要があります。

GitHub ActionsはGitHub Free、GitHub Pro、GitHub FreeのOrganization、GitHub Team、GitHub Enterprise Cloud、GitHub Oneで利用できます。 GitHub Actionsは、レガシーのリポジトリごとのプランを使っているアカウントが所有しているプライベートリポジトリでは利用できません。 For more information, see "GitHub's products."

ここには以下の内容があります:

Did this doc help you?

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

OR, learn how to contribute.

GitHub Actions の支払いを管理する GitHubは、macOSランナーのホストにMacStadiumを使用しています。

Dockerfileの命令について

Dockerfileには、Dockerコンテナの内容と起動時の動作を定義する命令と引数が含まれています。 Dockerがサポートしている命令に関する詳しい情報については、Dockerのドキュメンテーション中の「Dockerfile のリファレンス」を参照してください。

Dockerfileの命令とオーバーライド

Dockerの命令の中にはGitHub Actionと関わるものがあり、アクションのメタデータファイルはDockerの命令のいくつかをオーバーライドできます。 予期しない動作を避けるために、DockerfileがGitHub Actionsとどのように関わるかについて馴染んでおいてください。

USER

DockerアクションはデフォルトのDockerユーザ(root)で実行されなければなりません。 GITHUB_WORKSPACEにアクセスできなくなってしまうので、Dockerfile中ではUSER命令を使わないでください。 詳しい情報については、「環境変数の利用」と、Dockerのドキュメンテーション中のUSERのリファレンスを参照してください。

FROM

Dockerfileファイル中の最初の命令はFROMでなければなりません。これは、Dockerのベースイメージを選択します。 詳しい情報については、Dockerのドキュメンテーション中のFROMのリファレンスを参照してください。

FROM引数の設定にはいくつかのベストプラクティスがあります。

  • 公式のDockerイメージを使うことをおすすめします。 たとえばpythonrubyです。
  • バージョンタグが存在する場合は使ってください。メジャーバージョンも含めることが望ましいです。 たとえばnode:latestよりもnode:10を使ってください。
  • Debianオペレーティングシステムに基づくDockerイメージを使うことをおすすめします。

WORKDIR

GitHubは、ワーキングディレクトリのパスを環境変数のGITHUB_WORKSPACEに設定します。 Dockerfile中ではWORKDIR命令を使わないことをおすすめします。 アクションが実行される前に、GitHubはGITHUB_WORKSPACEディレクトリを、Dockerイメージ内にあったその場所になにがあってもその上にマウントし、GITHUB_WORKSPACEをワーキングディレクトリとして設定します。 詳しい情報については「環境変数の利用」と、Dockerのドキュメンテーション中のWORKDIRのリファレンスを参照してください。

ENTRYPOINT

アクションのメタデータファイル中でentrypointを定義すると、それはDockerfile中で定義されたENTRYPOINTをオーバーライドします。 詳しい情報については「GitHub Actionsのメタデータ構文」を参照してください。

DockerのENTRYPOINT命令には、shell形式とexec形式があります。 DockerのENTRYPOINTのドキュメンテーションは、ENTRYPOINTexec形式を使うことを勧めています。 execおよびshell形式に関する詳しい情報については、Dockerのドキュメンテーション中のENTRYPOINTのリファレンスを参照してください。

exec形式のENTRYPOINT命令を使うようにコンテナを設定した場合、アクションのメタデータファイル中に設定されたargsはコマンドシェル内では実行されません。 アクションのargsに環境変数が含まれている場合、その変数は置換されません。 たとえば、以下のexec形式は$GITHUB_SHAに保存された値を出力せず、代わりに"$GITHUB_SHA"を出力します。

ENTRYPOINT ["echo $GITHUB_SHA"]

変数の置換をさせたい場合は、shell形式を使うか、直接シェルを実行してください。 たとえば、以下のexec形式を使えば、シェルを実行して環境変数GITHUB_SHAに保存された値を出力できます。

ENTRYPOINT ["sh", "-c", "echo $GITHUB_SHA"]

アクションのメタデータファイルに定義されたargsを、ENTRYPOINT中でexec形式を使うDockerコンテナに渡すには、ENTRYPOINT命令から呼ぶentrypoint.shというシェルスクリプトを作成することをおすすめします。

Dockerfileの例
# コードを実行するコンテナイメージ
FROM debian:9.5-slim

# アクションリポジトリからコンテナのファイルシステムパスの`/`にコードファイルをコピー
COPY entrypoint.sh /entrypoint.sh

# Dockerコンテナの起動時に`entrypoint.sh`を実行
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.shファイルの例

上のDockerfileを使って、GitHubはアクションのメタデータファイルに設定されたargsを、entrypoint.shの引数として送ります。 #!/bin/shシバンentrypoint.shファイルの先頭に追加し、システムのPOSIX準拠のシェルを明示的に使ってください。

#!/bin/sh

# `$*`は`array`内で渡された`args`を個別に展開するか、
# を空白で区切られた文字列中の`args`を分割します。
sh -c "echo $*"

コードは実行可能になっていなければなりません。 entrypoint.shファイルをワークフロー中で使う前に、execute権限が付けられていることを確認してください。 この権限は、ターミナルから以下のコマンドで変更できます。

chmod +x entrypoint.sh    

ENTRYPOINTシェルスクリプトが実行可能ではなかった場合、以下のようなエラーが返されます。

Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/entrypoint.sh\": permission denied": unknown

CMD

アクションのメタデータファイル中でargsを定義すると、argsDockerfile中で指定されたCMD命令をオーバーライドします。 詳しい情報については「GitHub Actionsのメタデータ構文」を参照してください。

Dockerfile中でCMDを使っているなら、以下のガイドラインに従ってください。

  1. 必須の引数をアクションのREADME中でドキュメント化し、CMD命令から除外してください。
  2. argsを指定せずにアクションを利用できるよう、デフォルトを使ってください。
  3. アクションが--helpフラグやそれに類するものを備えているなら、アクションを自己ドキュメント化するために利用してください。

サポートされているLinuxの機能

GitHub Actionsは、DockerがサポートするデフォルトのLinuxの機能をサポートします。 機能の追加や削除はできません。 DockerがサポートするデフォルトのLinuxの機能に関する詳しい情報については、Dockerのドキュメンテーション中の「 Runtime privilege and Linux capabilities」を参照してください。 Linuxの機能についてさらに学ぶには、Linuxのman-pageの" Overview of Linux capabilities"を参照してください。

Did this doc help you?

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

OR, learn how to contribute.