{"meta":{"title":"GitHub ActionsのためのDockerfileサポート","intro":"Docker コンテナー アクション用の Dockerfile を作成する際には、いくつかの Docker の命令が GitHub Actions やアクションのメタデータ ファイルとどのように関わるのかを知っておく必要があります。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/enterprise-server@3.22/actions","title":"GitHub Actions"},{"href":"/ja/enterprise-server@3.22/actions/reference","title":"リファレンス"},{"href":"/ja/enterprise-server@3.22/actions/reference/workflows-and-actions","title":"ワークフローとアクション"},{"href":"/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/dockerfile-support","title":"Dockerfile のサポート"}],"documentType":"article"},"body":"# GitHub ActionsのためのDockerfileサポート\n\nDocker コンテナー アクション用の Dockerfile を作成する際には、いくつかの Docker の命令が GitHub Actions やアクションのメタデータ ファイルとどのように関わるのかを知っておく必要があります。\n\n> \\[!NOTE]\n> GitHub Enterprise Server ホステッド ランナーは、現在 GitHub ではサポートされていません。\n\n### ユーザー\n\nDockerアクションはデフォルトのDockerユーザ（root）で実行されなければなりません。\n`USER` では `Dockerfile` 命令を使用しないでください。そうしないと、`GITHUB_WORKSPACE` ディレクトリにアクセスできなくなります。 詳細については、「[変数リファレンス](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/variables#default-environment-variables)」と、Docker ドキュメントの [USER リファレンス](https://docs.docker.com/engine/reference/builder/#user)を参照してください。\n\n### FROM\n\n`Dockerfile` の最初の命令は、`FROM` とする必要があります。これにより、Docker ベース イメージが選択されます。 詳細については、Docker ドキュメントの [FROM リファレンス](https://docs.docker.com/engine/reference/builder/#from)を参照してください。\n\n`FROM` 引数の設定には、いくつかのベストプラクティスがあります。\n\n* 公式のDockerイメージを使うことをおすすめします。 たとえば、`python` または `ruby` です。\n* バージョンタグが存在する場合は使ってください。メジャーバージョンも含めることが望ましいです。 たとえば、`node:10` の代わりに `node:latest` を使用します。\n* [Debian](https://www.debian.org/) オペレーティング システムに基づいて Docker イメージを使用することをお勧めします。\n\n### WORKDIR\n\nGitHub は、 `GITHUB_WORKSPACE` 環境変数の作業ディレクトリ パスを設定します。\n`WORKDIR`では、`Dockerfile`命令を使用しないことをお勧めします。 アクションが実行される前に、 GitHub は、docker イメージ内のその場所にあったものの上に `GITHUB_WORKSPACE` ディレクトリをマウントし、作業ディレクトリとして `GITHUB_WORKSPACE` 設定します。 詳細については、「[変数リファレンス](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/variables#default-environment-variables)」と、Docker ドキュメントの [WORKDIR リファレンス](https://docs.docker.com/engine/reference/builder/#workdir)を参照してください。\n\n### エントリーポイント\n\nアクションのメタデータ ファイルで `entrypoint` を定義すると、それによって、`ENTRYPOINT` 内に定義されている `Dockerfile` がオーバーライドされます。 詳しくは、「[メタデータ構文リファレンス](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#runsentrypoint)」をご覧ください。\n\nDocker の `ENTRYPOINT` 命令には、*shell* 形式と *exec* 形式があります。 Docker `ENTRYPOINT` ドキュメントでは、*exec* 形式の`ENTRYPOINT`命令を使用することを推奨しています。\n*exec* 形式と *shell* 形式の詳細については、Docker ドキュメントの [ENTRYPOINT リファレンス](https://docs.docker.com/engine/reference/builder/#entrypoint)を参照してください。\n\nDockerfile でエントリポイントを指定する場合は、`WORKDIR` を使用しないでください。 代わりに、絶対パスを使用する必要があります。 詳細については、「[WORKDIR](#workdir)」を参照してください。\n\n\\_\n\\_ 命令の `ENTRYPOINT` 形式を使用するようにコンテナーを構成した場合、アクションのメタデータ ファイルで構成された `args` はコマンド シェルで実行されません。 アクションの `args` に環境変数が含まれている場合、その変数は置換されません。 たとえば、次の *exec* 形式を使用すると、`$GITHUB_SHA` に格納されている値は出力されませんが、代わりに `\"$GITHUB_SHA\"` が出力されます。\n\n```dockerfile\nENTRYPOINT [\"echo $GITHUB_SHA\"]\n```\n\n変数の置換が必要な場合は、*shell* 形式を使用するか、直接シェルを実行してください。 たとえば、以下の *exec* 形式を使用すれば、シェルを実行して環境変数 `GITHUB_SHA` に保存された値を出力できます。\n\n```dockerfile\nENTRYPOINT [\"sh\", \"-c\", \"echo $GITHUB_SHA\"]\n```\n\nアクションのメタデータファイルで定義されている`args`を、exec形式を\\_\\_ で使用しているDockerコンテナーに指定するには、`ENTRYPOINT`命令から呼び出す`entrypoint.sh`というシェルスクリプトを作成することをお勧めします。\n\n#### *Dockerfile* の例\n\n```dockerfile\n# Container image that runs your code\nFROM debian:9.5-slim\n\n# Copies your code file from your action repository to the filesystem path `/` of the container\nCOPY entrypoint.sh /entrypoint.sh\n\n# Executes `entrypoint.sh` when the Docker container starts up\nENTRYPOINT [\"/entrypoint.sh\"]\n```\n\n#### *entrypoint.sh* ファイルの例\n\n上記の Dockerfile の例を使用して、 GitHub はアクションのメタデータ ファイルで構成された `args` を引数として `entrypoint.sh`に送信します。 ファイル`#!/bin/sh`の先頭に[](https://en.wikipedia.org/wiki/Shebang_\\(Unix\\))`entrypoint.sh`を追加して、システムの[POSIX](https://en.wikipedia.org/wiki/POSIX)準拠のシェルを明示的に使用します。\n\n```shell\n#!/bin/sh\n\n# `$#` expands to the number of arguments and `$@` expands to the supplied `args`\nprintf '%d args:' \"$#\"\nprintf \" '%s'\" \"$@\"\nprintf '\\n'\n```\n\nコードは実行可能になっていなければなりません。 ワークフローで使用する前に、`entrypoint.sh` ファイルに `execute` アクセス許可があることを確認します。 この権限は、ターミナルから以下のコマンドで変更できます。\n\n```shell\nchmod +x entrypoint.sh\n```\n\n`ENTRYPOINT` シェル スクリプトが実行可能ではなかった場合、以下のようなエラーが返されます。\n\n```shell\nError response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused \"exec: \\\"/entrypoint.sh\\\": permission denied\": unknown\n```\n\n### コマンドプロンプト (CMD)\n\nアクションのメタデータ ファイルで `args` を定義すると、`args` によって、`CMD` で指定された `Dockerfile` 命令がオーバーライドされます。 詳しくは、「[メタデータ構文リファレンス](/ja/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#runsargs)」をご覧ください。\n\n`CMD` で `Dockerfile` を使用する場合は、次のガイドラインに従ってください。\n\n1. アクションの README 中で必須の引数をドキュメント化し、`CMD` 命令から除外します。\n2. `args` を指定せずにアクションを利用できるよう、既定値を使用します。\n3. アクションが `--help` フラグやそれに類するものを備えているなら、アクションを自己ドキュメント化するためにそれを利用します。\n\n## サポートされているLinuxの機能\n\nGitHub Actions では、Docker でサポートされる既定の Linux 機能がサポートされています。 機能の追加や削除はできません。 Docker でサポートされる既定の Linux 機能の詳細については、Docker ドキュメントの「[Linux kernel capabilities](https://docs.docker.com/engine/security/#linux-kernel-capabilities)」(Linux カーネル機能) を参照してください。 Linux 機能の詳細については、Linux の man ページの [Linux 機能の概要](http://man7.org/linux/man-pages/man7/capabilities.7.html)に関するページを参照してください。"}