{"meta":{"title":"Создание действия контейнера Docker","intro":"В этом руководстве вы узнаете, как создать действие контейнера Docker.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/use-containerized-services","title":"Использование контейнерных служб"},{"href":"/ru/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В локальных средствах выполнения должна использоваться операционная система Linux и должен быть установлен Docker для выполнения действий с контейнерами Docker. Дополнительные сведения о требованиях локальных средств выполнения см. в разделе [Справочник по локальным запускам](/ru/actions/reference/runners/self-hosted-runners#requirements-for-self-hosted-runner-machines).\n\n> \\[!WARNING]\n> При создании рабочих процессов и действий следует всегда учитывать, может ли код выполнять ненадежные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе [Справочник по безопасному использованию](/ru/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks).\n\n## Необходимые компоненты\n\n* Необходимо создать репозиторий GitHub и клонировать его на рабочую станцию. Дополнительные сведения см. в разделе \\[AUTOTITLE и [Создание репозитория](/ru/repositories/creating-and-managing-repositories/creating-a-new-repository)]\\(/repositories/creating-and-managing-repositories/cloning-a-repository).\n* Если используется Git LFS (Git Large File Storage — поддержка хранения больших файлов в Git)репозиторий, необходимо включить объекты в архивы репозитория. Дополнительные сведения см. в разделе [Управление объектами LFS Git в архивах репозитория](/ru/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. Дополнительные сведения см. в разделе \\[AUTOTITLE и [Хранение сведений в переменных](/ru/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables)]\\(/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\n## Создание файла Dockerfile\n\nВ новом каталоге `hello-world-docker-action` создайте файл `Dockerfile`. Убедитесь, что имя файла имеет прописную букву (используйте прописную букву `D`, но не прописную букву `f`), если у вас возникли проблемы. Дополнительные сведения см. в разделе [Поддержка Dockerfile для GitHub Actions](/ru/actions/reference/workflows-and-actions/dockerfile-support).\n\n**Dockerfile**\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`. Дополнительные сведения см. в разделе [Справочник по синтаксису метаданных](/ru/actions/reference/workflows-and-actions/metadata-syntax).\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Эти метаданные определяют один `who-to-greet` входной и один выходной `time` параметр. Чтобы передать входные данные в контейнер Docker, необходимо объявить входные данные с помощью `inputs` и передать их в ключевом слове `args`. Все, что вы включаете в контейнер, передается в контейнер `args`, но для лучшего обнаружения для пользователей вашего действия мы рекомендуем использовать входные данные.\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](/ru/actions/reference/workflows-and-actions/workflow-commands#setting-an-output-parameter).\n\n1. Создайте файл `entrypoint.sh` в новом каталоге `hello-world-docker-action`.\n\n2. Добавьте в файл `entrypoint.sh` указанный ниже код.\n\n**entrypoint.sh**\n\n```shell copy\n#!/bin/sh -l\n\necho \"Hello $1\"\ntime=$(date)\necho \"time=$time\" >> $GITHUB_OUTPUT\n\n```\n\nЕсли `entrypoint.sh` выполняется без ошибок, состояние действия имеет значение `success`. Вы также можете явно задать коды выхода в коде действия, чтобы предоставить состояние действия. Дополнительные сведения см. в разделе [Настройка кодов выхода для действий](/ru/actions/how-tos/create-and-publish-actions/set-exit-codes).\n\n1. Сделайте исполняемый `entrypoint.sh` файл исполняемым файлом. Git предоставляет способ явного изменения режима разрешений файла, чтобы он не сбрасывал каждый раз, когда есть клон/вилка.\n\n   ```shell copy\n   git add entrypoint.sh\n   git update-index --chmod=+x entrypoint.sh\n   ```\n\n2. При необходимости, чтобы проверить режим разрешений файла в индексе Git, выполните следующую команду.\n\n   ```shell copy\n   git ls-files --stage entrypoint.sh\n   ```\n\n   Выходные данные, такие как `100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       entrypoint.sh` означает, что файл имеет разрешение исполняемого файла. В этом примере `755` обозначает разрешение исполняемого файла.\n\n## Создание файла README\n\nЧтобы сообщить людям, как применить свое действие, можно создать файл README. Файл сведений наиболее полезен, если вы планируете опубликовать действие в открытом доступе, но может также применяться в качестве напоминания для себя или своей команды.\n\nВ каталоге `hello-world-docker-action` создайте файл `README.md` со следующими сведениями:\n\n* подробное описание того, что делает действие;\n* обязательные входные и выходные аргументы;\n* необязательные входные и выходные аргументы;\n* секреты, используемые действием;\n* переменные среды, используемые действием;\n* пример использования действия в рабочем процессе.\n\n**README.md**\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Рекомендуется также добавить тег версии для выпусков действия. Дополнительные сведения о настройке версий см. в разделе [Управление пользовательскими действиями](/ru/actions/how-tos/create-and-publish-actions/manage-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 для репозитория](/ru/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В указанном ниже коде рабочего процесса используется готовое действие *hello world* в общедоступном репозитории [`actions/hello-world-docker-action`](https://github.com/actions/hello-world-docker-action). Скопируйте указанный ниже пример кода рабочего процесса в файл `.github/workflows/main.yml`, но замените `actions/hello-world-docker-action` именем репозитория и действия. Вы также можете заменить входное поле `who-to-greet` на свое имя.\nОбщедоступные действия можно использовать, даже если они не публикуются GitHub Marketplace. Дополнительные сведения см. в разделе [Публикация действий в GitHub Marketplace](/ru/actions/how-tos/create-and-publish-actions/publish-in-github-marketplace#publishing-an-action).\n\n**.github/workflows/main.yml**\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` в репозитории действия. Вы также можете заменить входное поле `who-to-greet` на свое имя.\nЭто частное действие не может быть опубликовано GitHub Marketplaceи может использоваться только в этом репозитории.\n\n**.github/workflows/main.yml**\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@v6\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В репозитории перейдите на вкладку **Действия** и выберите последний запуск рабочего процесса. В разделе **Задания** или в графе визуализации щелкните **Задание для отображения приветствия**.\n\nНажмите кнопку **\"Hello world action step**\", и вы увидите \"Hello Mona the Octocat\" или имя, которое вы использовали для `who-to-greet` ввода, напечатанного в журнале. Чтобы просмотреть метку времени, нажмите кнопку **\"Получить время** вывода\".\n\n## Доступ к файлам, созданным действием контейнера\n\nПри выполнении действия контейнера он автоматически сопоставляет рабочий каталог по умолчанию (`GITHUB_WORKSPACE`) в средстве выполнения с `/github/workspace` каталогом в контейнере. Все файлы, добавленные в этот каталог в контейнере, будут доступны для всех последующих шагов в том же задании. Например, если у вас есть действие контейнера, которое создает проект, и вы хотите отправить выходные данные сборки в качестве артефакта, можно выполнить следующие действия.\n\n**workflow\\.yml**\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\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Дополнительные сведения о передаче выходных данных сборки в качестве артефакта см. в разделе [Хранение и предоставление общего доступа к данным с артефактами рабочего процесса](/ru/actions/tutorials/store-and-share-data).\n\n## Примеры действий контейнера Docker в GitHub.com\n\nВы можете найти множество примеров действий контейнера Docker в GitHub.com.\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)"}