Skip to main content
Мы публикуем частые обновления нашей документации, и перевод этой страницы, возможно, еще выполняется. Актуальные сведения см. в документации на английском языке.

Создание действия контейнера Docker

В этом руководстве показаны минимально необходимые шаги для создания действия контейнера Docker.

Введение

В этом руководстве вы узнаете об основных компонентах, необходимых для создания и использования упакованного действия контейнера Docker. Чтобы была возможность сосредоточить это руководство на компонентах, необходимых для упаковки действия, функциональные возможности кода действия минимальны. Действие выводит Hello World в журналах или Hello [who-to-greet] при указании настраиваемого имени.

Завершив этот проект, вы должны понять, как создать собственное действие контейнера Docker и протестировать его в рабочем процессе.

В локальных средствах выполнения должна использоваться операционная система Linux и должен быть установлен Docker для выполнения действий с контейнерами Docker. Дополнительные сведения о требованиях для локальных средств выполнения см. в разделе Сведения о локальных средствах выполнения.

Предупреждение. Во время создания рабочих процессов и действий необходимо учитывать, будет ли код использовать непроверенные входные данные от возможных злоумышленников. Некоторые контексты следует считать непроверенными, так как злоумышленники могут вставить собственное вредоносное содержимое. Дополнительные сведения см. в разделе "Основные сведения о риске вставки данных в скрипты".

Предварительные требования

Возможно, полезно иметь базовое представление о переменных среды GitHub Actions и файловой системе контейнера Docker.

Перед началом работы необходимо создать репозиторий GitHub.

  1. Создайте репозиторий в GitHub.com. Вы можете выбрать любое имя репозитория или использовать hello-world-docker-action, как в этом примере. Дополнительные сведения см. в разделе Создание репозитория.

  2. Клонируйте репозиторий на ваш компьютер. Дополнительные сведения см. в разделе Клонирование репозитория.

  3. В терминале измените каталоги на новый репозиторий.

    Shell
    cd hello-world-docker-action

Создание файла Dockerfile

В новом каталоге hello-world-docker-action создайте файл Dockerfile. Убедитесь, что имя файла имеет прописную букву (используйте прописную букву D, но не прописную букву f), если у вас возникли проблемы. Дополнительные сведения см. на странице Поддержка Dockerfile для GitHub Actions.

Dockerfile

Dockerfile
# Container image that runs your code
FROM alpine:3.10

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

Создание файла метаданных действия

Создайте новый файл action.yml в каталоге hello-world-docker-action. Дополнительные сведения см. в разделе Синтаксис метаданных для GitHub Actions.

action.yml

YAML
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.who-to-greet }}

Эти метаданные определяют один входной параметр who-to-greet и один выходной параметр time. Чтобы передать входные данные в контейнер Docker, необходимо объявить входные данные с помощью inputs и передать их в ключевом слове args. Все, что вы включаете в контейнер, передается в контейнер args, но для лучшего обнаружения для пользователей вашего действия мы рекомендуем использовать входные данные.

GitHub создаст образ из образа Dockerfile и выполнит команды в новом контейнере с помощью этого образа.

Написание кода действия

Вы можете выбрать любой базовый образ Docker и, следовательно, любой язык для своего действия. В указанном ниже примере скрипта оболочки используется входная переменная who-to-greet для печати Hello [who-to-greet] в файле журнала.

Затем скрипт получает текущее время и задает его в качестве выходной переменной, которая может использовать действия, выполняемые позже в задании. Чтобы GitHub распознал выходные переменные, необходимо записать их $GITHUB_OUTPUT в файл среды: echo "<output name>=<value>" >> $GITHUB_OUTPUT. Дополнительные сведения см. в статье Команды рабочего процесса для GitHub Actions.

  1. Создайте файл entrypoint.sh в новом каталоге hello-world-docker-action.

  2. Добавьте в файл entrypoint.sh указанный ниже код.

    entrypoint.sh

    Shell
    #!/bin/sh -l
    
    echo "Hello $1"
    time=$(date)
    echo "time=$time" >> $GITHUB_OUTPUT

    Если entrypoint.sh выполняется без ошибок, состояние действия имеет значение success. Вы также можете явно задать коды выхода в коде действия, чтобы предоставить состояние действия. Дополнительные сведения см. в разделе Настройка кодов выхода для действий.

  3. entrypoint.sh Сделайте файл исполняемым. Git предоставляет способ явного изменения режима разрешений для файла, чтобы он не сбрасывал каждый раз при наличии клона или вилки.

    Shell
    $ git add entrypoint.sh
    $ git update-index --chmod=+x entrypoint.sh
  4. При необходимости, чтобы проверить режим разрешений файла в индексе Git, выполните следующую команду.

    Shell
    $ git ls-files --stage entrypoint.sh

    Выходные данные, такие как 100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 entrypoint.sh , означают, что файл имеет разрешение на исполняемый файл. В этом примере 755 обозначает разрешение исполняемого файла.

Создание файла README

Чтобы сообщить людям, как применить свое действие, можно создать файл README. Файл README является наиболее полезным, если вы планируете поделиться своим действием публично, но также является отличным способом напомнить вам или вашей команде, как использовать действие.

В каталоге hello-world-docker-action создайте файл README.md, указывающий следующие сведения:

  • подробное описание того, что делает действие;
  • обязательные входные и выходные аргументы;
  • необязательные входные и выходные аргументы;
  • секреты, используемые действием;
  • переменные среды, используемые действием;
  • пример использования действия в рабочем процессе.

README.md

markdown
# Hello world docker action

This action prints "Hello World" or "Hello" + the name of a person to greet to the log.

## Inputs

## `who-to-greet`

**Required** The name of the person to greet. Default `"World"`.

## Outputs

## `time`

The time we greeted you.

## Example usage

uses: actions/hello-world-docker-action@v2
with:
  who-to-greet: 'Mona the Octocat'

Фиксация действия, добавление тегов к нему и его отправка в GitHub

В терминале зафиксируйте файлы action.yml, entrypoint.sh, Dockerfile и README.md.

Рекомендуется также добавить тег версии для выпусков действия. Дополнительные сведения об управлении версиями действия см. в разделе О действиях.

Shell
git add action.yml entrypoint.sh Dockerfile README.md
git commit -m "My first action is ready"
git tag -a -m "My first action release" v1
git push --follow-tags

Тестирование действия в рабочем процессе

Теперь вы готовы протестировать действие в рабочем процессе.

— если действие находится в частном репозитории, вы можете контролировать, кто может получить к нему доступ. Дополнительные сведения см. в разделе Разрешение доступа к компонентам в частном репозитории.

  • Общедоступные действия могут использоваться рабочими процессами в любом репозитории.

Пример использования общедоступного действия

В указанном ниже коде рабочего процесса используется готовое действие hello world в общедоступном репозитории actions/hello-world-docker-action. Скопируйте указанный ниже пример кода рабочего процесса в файл .github/workflows/main.yml, но замените actions/hello-world-docker-action именем репозитория и действия. Вы также можете заменить именем входные данные who-to-greet. Открытые действия можно применять, даже если они не опубликованы в GitHub Marketplace. Дополнительные сведения см. в статье Публикация действия.

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - name: Hello world action step
        id: hello
        uses: actions/hello-world-docker-action@v2
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

Пример применения частного действия

Скопируйте указанный ниже пример кода рабочего процесса в файл .github/workflows/main.yml в репозитории действия. Вы также можете заменить именем входные данные who-to-greet. Это частное действие не может быть опубликовано в GitHub Marketplace, и его можно использовать только в этом репозитории.

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      # To use this repository's private action,
      # you must check out the repository
      - name: Checkout
        uses: actions/checkout@v3
      - name: Hello world action step
        uses: ./ # Uses an action in the root directory
        id: hello
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

В репозитории перейдите на вкладку Действия и выберите последний запуск рабочего процесса. В разделе Задания или в графе визуализации щелкните Задание для отображения приветствия. Вы должны увидеть Hello Mona the Octocat (или имя, которое вы использовали для входных данных who-to-greet и метки времени, напечатанной в журнале).

Снимок экрана с использованием действия в рабочем процессе