メモ
GitHub ホステッド ランナーは、現在 GitHub Enterprise Server ではサポートされていません。
User
DockerアクションはデフォルトのDockerユーザ(root)で実行されなければなりません。
USER では Dockerfile 命令を使用しないでください。そうしないと、GITHUB_WORKSPACE ディレクトリにアクセスできなくなります。 詳細については、「変数リファレンス」と、Docker ドキュメントの USER リファレンスを参照してください。
FROM
`Dockerfile` の最初の命令は、`FROM` とする必要があります。これにより、Docker ベース イメージが選択されます。 詳細については、Docker ドキュメントの [FROM リファレンス](https://docs.docker.com/engine/reference/builder/#from)を参照してください。
`FROM` 引数の設定には、いくつかのベストプラクティスがあります。
- 公式のDockerイメージを使うことをおすすめします。 たとえば、
pythonまたはrubyです。 - バージョンタグが存在する場合は使ってください。メジャーバージョンも含めることが望ましいです。 たとえば、
node:10の代わりにnode:latestを使用します。 -
[Debian](https://www.debian.org/) オペレーティング システムに基づいて Docker イメージを使用することをお勧めします。
WORKDIR
GitHub は、作業ディレクトリのパスを GITHUB_WORKSPACE 環境変数に設定します。
WORKDIR では、Dockerfile 命令を使用しないことをお勧めします。 アクションが実行される前に、GitHub は GITHUB_WORKSPACE ディレクトリを、Docker イメージ内でその場所にあったものの上にマウントし、GITHUB_WORKSPACE を作業ディレクトリとして設定します。 詳細については、「変数リファレンス」と、Docker ドキュメントの WORKDIR リファレンスを参照してください。
ENTRYPOINT
アクションのメタデータ ファイルで entrypoint を定義すると、それによって、ENTRYPOINT 内に定義されている Dockerfile がオーバーライドされます。 詳しくは、「メタデータ構文リファレンス」をご覧ください。
Docker の ENTRYPOINT 命令には、shell 形式と exec 形式があります。 Docker ENTRYPOINT ドキュメントでは、__ 命令の ENTRYPOINT 形式を使用することを推奨しています。
exec 形式と shell 形式の詳細については、Docker ドキュメントの ENTRYPOINT リファレンスを参照してください。
Dockerfile でエントリポイントを指定する場合は、WORKDIR を使用しないでください。 代わりに、絶対パスを使用する必要があります。 詳細については、「WORKDIR」を参照してください。
_
_ 命令の `ENTRYPOINT` 形式を使用するようにコンテナーを構成した場合、アクションのメタデータ ファイルで構成された `args` はコマンド シェルで実行されません。 アクションの `args` に環境変数が含まれている場合、その変数は置換されません。 たとえば、次の _exec_ 形式を使用すると、`$GITHUB_SHA` に格納されている値は出力されませんが、代わりに `"$GITHUB_SHA"` が出力されます。
ENTRYPOINT ["echo $GITHUB_SHA"]
変数の置換が必要な場合は、shell 形式を使用するか、直接シェルを実行してください。 たとえば、以下の exec 形式を使用すれば、シェルを実行して環境変数 GITHUB_SHA に保存された値を出力できます。
ENTRYPOINT ["sh", "-c", "echo $GITHUB_SHA"]
アクションのメタデータ ファイルで定義されている args を、__ で ENTRYPOINT 形式を使用している Docker コンテナーに指定するには、entrypoint.sh 命令から呼び出す ENTRYPOINT というシェル スクリプトを作成することをお勧めします。
_Dockerfile_ の例
# Container image that runs your code
FROM debian:9.5-slim
# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh
# Executes `entrypoint.sh` when the Docker container starts up
ENTRYPOINT ["/entrypoint.sh"]
_entrypoint.sh_ ファイルの例
上の Dockerfile を使って、GitHub は、アクションのメタデータ ファイルで構成されている args を entrypoint.sh への引数として送信します。
#!/bin/sh ファイルの先頭に entrypoint.sh を追加して、システムの POSIX準拠のシェルを明示的に使用します。
#!/bin/sh
# `$#` expands to the number of arguments and `$@` expands to the supplied `args`
printf '%d args:' "$#"
printf " '%s'" "$@"
printf '\n'
コードは実行可能になっていなければなりません。 ワークフローで使用する前に、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 を定義すると、args によって、CMD で指定された Dockerfile 命令がオーバーライドされます。 詳しくは、「メタデータ構文リファレンス」をご覧ください。
`CMD` で `Dockerfile` を使用する場合は、次のガイドラインに従ってください。
- アクションの README 中で必須の引数をドキュメント化し、
CMD命令から除外します。 argsを指定せずにアクションを利用できるよう、既定値を使用します。- アクションが
--helpフラグやそれに類するものを備えているなら、アクションを自己ドキュメント化するためにそれを利用します。
サポートされているLinuxの機能
GitHub Actionsは、DockerがサポートするデフォルトのLinuxの機能をサポートします。 機能の追加や削除はできません。 Docker でサポートされる既定の Linux 機能の詳細については、Docker ドキュメントの「Linux kernel capabilities」(Linux カーネル機能) を参照してください。 Linux 機能の詳細については、Linux の man ページの Linux 機能の概要に関するページを参照してください。