{"meta":{"title":"Docker コンテナーのアクションを作成する","intro":"このチュートリアルでは、Docker コンテナー アクションを構築する方法について説明します。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/tutorials","title":"チュートリアル"},{"href":"/ja/actions/tutorials/use-containerized-services","title":"コンテナー化されたサービスを使用する"},{"href":"/ja/actions/tutorials/use-containerized-services/create-a-docker-container-action","title":"Docker コンテナーのアクションを作成する"}],"documentType":"article"},"body":"# Docker コンテナーのアクションを作成する\n\nこのチュートリアルでは、Docker コンテナー アクションを構築する方法について説明します。\n\n## はじめに\n\nこのガイドでは、パッケージ化されたDockerコンテナのアクションを作成して使うために必要な、基本的コンポーネントについて学びます。 アクションのパッケージ化に必要なコンポーネントのガイドに焦点を当てるため、アクションのコードの機能は最小限に留めます。 アクションでは、ログに \"Hello World\" が出力されます。カスタム名を指定した場合は \"Hello \\[who-to-greet]\" が出力されます。\n\nこのプロジェクトを完了すると、あなたの Docker コンテナのアクションをビルドして、ワークフローでテストする方法が理解できます。\n\nセルフホストランナーでDockerコンテナアクションを実行するためには、Linuxオペレーティングシステムを使い、Dockerがインストールされていなければなりません。 自己ホストランナーの要件の詳細については、「[セルフホステッド ランナー](/ja/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#requirements-for-self-hosted-runner-machines)」を参照してください。\n\nデータ 再利用可能なアクション.コンテキスト挿入警告 %}\n\n## 前提条件\n\n* GitHub にリポジトリを作成し、ワークステーションに複製する必要があります。 詳細については、「[新しいリポジトリの作成](/ja/repositories/creating-and-managing-repositories/creating-a-new-repository)」および「[リポジトリをクローンする](/ja/repositories/creating-and-managing-repositories/cloning-a-repository)」を参照してください。\n* リポジトリで Git LFS を使用する場合は、リポジトリのアーカイブにオブジェクトを含める必要があります。 詳しくは、「[リポジトリのアーカイブで Git LFS オブジェクトを管理する](/ja/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-git-lfs-objects-in-archives-of-your-repository)」をご覧ください。\n* GitHub Actions の環境変数及びDockerコンテナのファイルシステムに関する基本的な理解があれば役立つでしょう。 詳細については、「[変数に情報を格納する](/ja/actions/learn-github-actions/variables)」および「[GitHub ホステッド ランナー](/ja/enterprise-cloud@latest/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem)」を参照してください。\n\n## Dockerfileの作成\n\n新しい `hello-world-docker-action` ディレクトリに、新しい `Dockerfile` ファイルを作成します。 問題が発生する場合は、ファイル名で大文字が正しく使用されていることを確認します (`D` は大文字にしますが、`f` は大文字にしません)。 詳しくは、「[GitHub ActionsのためのDockerfileサポート](/ja/actions/creating-actions/dockerfile-support-for-github-actions)」をご覧ください。\n\n```\n          **Dockerfile**\n```\n\n```dockerfile copy\n# Container image that runs your code\nFROM alpine:3.10\n\n# Copies your code file from your action repository to the filesystem path `/` of the container\nCOPY entrypoint.sh /entrypoint.sh\n\n# Code file to execute when the docker container starts up (`entrypoint.sh`)\nENTRYPOINT [\"/entrypoint.sh\"]\n```\n\n## アクションのメタデータファイルの作成\n\n上で作成した `action.yml` ディレクトリに新しい `hello-world-docker-action` ファイルを作成します。 詳しくは、「[メタデータ構文リファレンス](/ja/actions/creating-actions/metadata-syntax-for-github-actions)」をご覧ください。\n\n**action.yml**\n\n```yaml copy\n# action.yml\nname: 'Hello World'\ndescription: 'Greet someone and record the time'\ninputs:\n  who-to-greet:  # id of input\n    description: 'Who to greet'\n    required: true\n    default: 'World'\noutputs:\n  time: # id of output\n    description: 'The time we greeted you'\nruns:\n  using: 'docker'\n  image: 'Dockerfile'\n  args:\n    - ${{ inputs.who-to-greet }}\n```\n\nこのメタデータで、1 つの `who-to-greet` 入力と 1 つの `time` 出力パラメーターを定義します。 入力を Docker コンテナーに渡すには、`inputs` を使用して入力を宣言し、`args` キーワードで入力を渡す必要があります。\n`args` に含めたすべてのものがコンテナーに渡されますが、アクションのユーザーにわかりやすいよう、inputs を使用することをお勧めします。\n\nGitHub によって `Dockerfile` からイメージがビルドされ、このイメージを使用して新しいコンテナーでコマンドが実行されます。\n\n## アクションのコードの記述\n\n任意のベース Docker イメージを選択できるので、アクションに任意の言語を選択できます。 次のシェル スクリプトの例では、`who-to-greet` 入力変数を使って、ログ ファイルに \"Hello \\[who-to-greet]\" と出力されます。\n\n次に、スクリプトは現在の時刻を取得し、それをジョブ内で後に実行するアクションが利用できる出力変数に設定します。 GitHub が出力変数を認識するには、それらを`$GITHUB_OUTPUT`環境ファイル`echo \"<output name>=<value>\" >> $GITHUB_OUTPUT`に書き込む必要があります。 詳しくは、「[GitHub Actions のワークフロー コマンド](/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter)」をご覧ください。\n\n1. ```\n          `entrypoint.sh` ディレクトリに新しい `hello-world-docker-action` ファイルを作成します。\n   ```\n\n2. 次のコードを `entrypoint.sh` ファイルに追加します。\n\n   ```\n          **entrypoint.sh**\n   ```\n\n   ```shell copy\n   #!/bin/sh -l\n\n   echo \"Hello $1\"\n   time=$(date)\n   echo \"time=$time\" >> $GITHUB_OUTPUT\n\n   ```\n\n   ```\n          `entrypoint.sh` がエラーなしで実行された場合、アクションの状態は `success` に設定されます。 アクションのコード中で明示的に終了コードを設定して、アクションのステータスを提供することもできます。 詳しくは、「[AUTOTITLE](/actions/creating-actions/setting-exit-codes-for-actions)」をご覧ください。\n   ```\n\n3. ```\n          `entrypoint.sh` ファイルを実行可能にします。 Git では、クローンやフォークがあるたびにリセットされないように、ファイルのアクセス許可モードを明示的に変更する方法が用意されています。\n   ```\n\n   ```shell copy\n   git add entrypoint.sh\n   git update-index --chmod=+x entrypoint.sh\n   ```\n\n4. 必要に応じて、Git インデックス内のファイルのアクセス許可モードを確認するには、次のコマンドを実行します。\n\n   ```shell copy\n   git ls-files --stage entrypoint.sh\n   ```\n\n   ```\n          `100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       entrypoint.sh` のような出力は、ファイルに実行可能なアクセス許可があることを意味します。 この例では、`755` が実行可能なアクセス許可を示しています。\n   ```\n\n## READMEの作成\n\nアクションの使用方法を説明するために、README ファイルを作成できます。 README はアクションの公開を計画している時に非常に役立ちます。また、アクションの使い方をあなたやチームが覚えておく方法としても優れています。\n\n```\n          `hello-world-docker-action` ディレクトリに、次の情報を指定する `README.md` ファイルを作成します。\n```\n\n* アクションの動作に関する詳細な説明。\n* 必須の入力および出力の引数。\n* 省略可能な入力および出力の引数。\n* アクションで使用されるシークレット。\n* アクションで使用される環境変数。\n* ワークフローでのアクションの使用方法の例。\n\n  ```\n          **README.md**\n  ```\n\n```markdown copy\n# Hello world docker action\n\nThis action prints \"Hello World\" or \"Hello\" + the name of a person to greet to the log.\n\n## Inputs\n\n## `who-to-greet`\n\n**Required** The name of the person to greet. Default `\"World\"`.\n\n## Outputs\n\n## `time`\n\nThe time we greeted you.\n\n## Example usage\n\nuses: actions/hello-world-docker-action@v2\nwith:\n  who-to-greet: 'Mona the Octocat'\n```\n\n## アクションをコミットし、タグを付けて、プッシュする\n\nお使いのターミナルから、`action.yml`、`entrypoint.sh`、`Dockerfile`、`README.md` の各ファイルをコミットします。\n\nアクションのリリースにはバージョンタグを加えることもベストプラクティスです。 アクションのバージョン管理の詳細については、「[カスタム アクションについて](/ja/actions/creating-actions/about-custom-actions#using-release-management-for-actions)」を参照してください。\n\n```shell copy\ngit add action.yml entrypoint.sh Dockerfile README.md\ngit commit -m \"My first action is ready\"\ngit tag -a -m \"My first action release\" v1\ngit push --follow-tags\n```\n\n## ワークフローでアクションをテストする\n\nこれで、ワークフローでアクションをテストできるようになりました。\n\n* アクションがプライベート リポジトリにある場合は、アクセスできるユーザーを制御できます。 詳しくは、「[リポジトリのGitHub Actions設定の管理](/ja/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository)」をご覧ください。\n* アクションが内部リポジトリにある場合、そのアクションは同じリポジトリ内のワークフローでのみ使用できます。\n* パブリック アクションは、任意のリポジトリ内のワークフローで使用できます。\n\n### パブリックアクションを使用する例\n\n次のワークフロー コードでは、パブリックの \\_\\_ リポジトリにある完全な `actions/hello-world-docker-action` アクションを使用します。 次のワークフローの例のコードを `.github/workflows/main.yml` ファイルにコピーしますが、`actions/hello-world-docker-action` を実際のリポジトリとアクション名に置き換えてください。\n`who-to-greet` 入力を自分の名前に置き換えることもできます。 パブリック アクションは、GitHub Marketplace に公開されていない場合でも使用できます。 詳しくは、「[GitHub Marketplaceでのアクションの公開](/ja/actions/creating-actions/publishing-actions-in-github-marketplace#publishing-an-action)」をご覧ください。\n\n```\n          **.github/workflows/main.yml**\n```\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      - name: Hello world action step\n        id: hello\n        uses: actions/hello-world-docker-action@v2\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\n### プライベートアクションを使用する例\n\n次の例のワークフロー コードを、アクションのリポジトリ内の `.github/workflows/main.yml` ファイルにコピーします。\n`who-to-greet` 入力を自分の名前に置き換えることもできます。 このプライベート アクションは GitHub Marketplace に公開できず、このリポジトリ内でのみ使用できます。\n\n```\n          **.github/workflows/main.yml**\n```\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      # To use this repository's private action,\n      # you must check out the repository\n      - name: Checkout\n        uses: actions/checkout@v5\n      - name: Hello world action step\n        uses: ./ # Uses an action in the root directory\n        id: hello\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\nリポジトリから **\\[アクション]** タブをクリックして、最新のワークフロー実行を選択します。 **\\[ジョブ]** または視覚化グラフで、\"**A job to say hello**\" をクリックします。\n\n**Hello world action step** をクリックすると、\"Hello Mona the Octocat\" またはログに出力されている `who-to-greet` に入力した名前が表示されます。 タイムスタンプを表示するには、 **\\[出力時刻の取得]** をクリックします。\n\n## コンテナー アクションで作成したファイルへのアクセス\n\nコンテナー アクションを実行する、ランナーの既定の作業ディレクトリ (`GITHUB_WORKSPACE`) がコンテナー上の `/github/workspace` ディレクトリに自動的にマップされます。 コンテナーのこのディレクトリに追加されたファイルは、同じジョブ内の後続のステップで使用できます。 たとえば、プロジェクトをビルドするコンテナー アクションがあり、ビルド出力を成果物としてアップロードする場合は、次の手順を使用できます。\n\n```\n          **workflow.yml**\n```\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v5\n\n      # Output build artifacts to /github/workspace on the container.\n      - name: Containerized Build\n        uses: ./.github/actions/my-container-action\n\n      - name: Upload Build Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: workspace_artifacts\n          path: ${{ github.workspace }}\n```\n\nビルド出力を成果物としてアップロードする方法の詳細については、「[ワークフロー成果物を使ったデータの格納と共有](/ja/actions/using-workflows/storing-workflow-data-as-artifacts)」を参照してください。\n\n## GitHub.com\n\nに対する Docker コンテナー アクションの例\n\nDocker コンテナー アクションの例は、GitHub.com\nに多数あります。\n\n* [github/issue-metrics](https://github.com/github/issue-metrics)\n* [microsoft/infersharpaction](https://github.com/microsoft/infersharpaction)\n* [microsoft/ps-docs](https://github.com/microsoft/ps-docs)"}