# GitHub ActionsのためのDockerfileサポート

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

### ユーザー

DockerアクションはデフォルトのDockerユーザ（root）で実行されなければなりません。
`USER` では `Dockerfile` 命令を使用しないでください。そうしないと、`GITHUB_WORKSPACE` ディレクトリにアクセスできなくなります。 詳細については、「[変数リファレンス](/ja/enterprise-cloud@latest/actions/reference/variables-reference#default-environment-variables)」と、Docker ドキュメントの [USER リファレンス](https://docs.docker.com/engine/reference/builder/#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` 環境変数に設定します。
`Dockerfile`では、`WORKDIR`命令を使用しないことをお勧めします。 アクションが実行される前に、GitHub は `GITHUB_WORKSPACE` ディレクトリを、Docker イメージ内でその場所にあったものの上にマウントし、`GITHUB_WORKSPACE` を作業ディレクトリとして設定します。 詳細については、「[変数リファレンス](/ja/enterprise-cloud@latest/actions/reference/variables-reference#default-environment-variables)」と、Docker ドキュメントの [WORKDIR リファレンス](https://docs.docker.com/engine/reference/builder/#workdir)を参照してください。

### エントリーポイント

アクションのメタデータ ファイルで `entrypoint` を定義すると、それによって、`ENTRYPOINT` 内に定義されている `Dockerfile` がオーバーライドされます。 詳しくは、「[メタデータ構文リファレンス](/ja/enterprise-cloud@latest/actions/creating-actions/metadata-syntax-for-github-actions#runsentrypoint)」をご覧ください。

Docker の `ENTRYPOINT` 命令には、*shell* 形式と *exec* 形式があります。 Docker `ENTRYPOINT` ドキュメントでは、*exec* 形式の`ENTRYPOINT`命令を使用することを推奨しています。
*exec* 形式と *shell* 形式の詳細については、Docker ドキュメントの [ENTRYPOINT リファレンス](https://docs.docker.com/engine/reference/builder/#entrypoint)を参照してください。

Dockerfile でエントリポイントを指定する場合は、`WORKDIR` を使用しないでください。 代わりに、絶対パスを使用する必要があります。 詳細については、「[WORKDIR](#workdir)」を参照してください。

```
          _
          _ 命令の `ENTRYPOINT` 形式を使用するようにコンテナーを構成した場合、アクションのメタデータ ファイルで構成された `args` はコマンド シェルで実行されません。 アクションの `args` に環境変数が含まれている場合、その変数は置換されません。 たとえば、次の _exec_ 形式を使用すると、`$GITHUB_SHA` に格納されている値は出力されませんが、代わりに `"$GITHUB_SHA"` が出力されます。
```

```dockerfile
ENTRYPOINT ["echo $GITHUB_SHA"]
```

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

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

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

####

```
          _Dockerfile_ の例
```

```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` への引数として送信します。 ファイル`entrypoint.sh`の先頭に`#!/bin/sh`[シェバング](https://en.wikipedia.org/wiki/Shebang_\(Unix\))を追加して、システムの[POSIX](https://en.wikipedia.org/wiki/POSIX)準拠のシェルを明示的に使用します。

```shell
#!/bin/sh

# `$#` expands to the number of arguments and `$@` expands to the supplied `args`
printf '%d args:' "$#"
printf " '%s'" "$@"
printf '\n'
```

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

```shell
chmod +x entrypoint.sh
```

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

```shell
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` 命令がオーバーライドされます。 詳しくは、「[メタデータ構文リファレンス](/ja/enterprise-cloud@latest/actions/creating-actions/metadata-syntax-for-github-actions#runsargs)」をご覧ください。

```
          `CMD` で `Dockerfile` を使用する場合は、次のガイドラインに従ってください。
```

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

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

GitHub 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)に関するページを参照してください。