Skip to main content
We publish frequent updates to our documentation, and translation of this page may still be in progress. For the most current information, please visit the English documentation.

Поддержка Dockerfile для GitHub Actions

При создании Dockerfile для действия контейнера Docker следует знать, как отдельные инструкции Docker взаимодействуют с GitHub Actions и файлом метаданных действия.

Примечание. В GitHub Enterprise Server в настоящее время не поддерживаются средства выполнения тестов, размещенные в GitHub. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.

Инструкции по Dockerfile

Dockerfile содержит инструкции и аргументы, определяющие содержимое и реакцию на событие запуска контейнера Docker. Дополнительные сведения об инструкциях, поддерживаемых Docker, см. в статье Справочник по Dockerfile в документации по Docker.

Инструкции и переопределения Dockerfile

Некоторые инструкции Docker взаимодействуют с GitHub Actions, а файл метаданных действия может переопределять некоторые инструкции Docker. Обязательно изучите то, как Dockerfile взаимодействует с GitHub Actions, чтобы предотвратить непредвиденную реакцию на событие.

Пользователь

Действия Docker должен выполнять пользователь Docker по умолчанию (корневой). Не используйте инструкцию USER в Dockerfile, поскольку вы не сможете получить доступ к GITHUB_WORKSPACE. Дополнительные сведения см. в разделах "Переменные" и Справочник пользователя в документации по Docker.

FROM

Первой инструкцией в Dockerfile должна быть FROM, выбирающая базовый образ Docker. Дополнительные сведения см. в справочнике FROM в документации по Docker.

Далее приведены некоторые рекомендации по настройке аргумента FROM:

  • Рекомендуется использовать официальные образы Docker. Например, python или ruby.
  • Используйте тег версии (если он существует), предпочтительно с основным номером версии. Например, используйте node:10 вместо node:latest.
  • Рекомендуется использовать образы Docker, основанные на операционной системе Debian.

WORKDIR

GitHub Enterprise Server задает путь к рабочей папке в переменной среды GITHUB_WORKSPACE. Инструкцию WORKDIR не рекомендуется использовать в Dockerfile. Перед выполнением действия GitHub Enterprise Server подключит каталог GITHUB_WORKSPACE поверх всего, что находилось в этом расположении в образе Docker и задаст GITHUB_WORKSPACE в качестве рабочей папки. Дополнительные сведения см. в разделе "Переменные" и справочнике по WORKDIR в документации по Docker.

ENTRYPOINT

Если вы укажите entrypoint в файле метаданных действия, он переопределит ENTRYPOINT, указанный в файле Dockerfile. Дополнительные сведения см. в разделе Синтаксис метаданных для GitHub Actions.

Инструкция Docker ENTRYPOINT имеет форму оболочки и форму exec. В документации по ENTRYPOINT Docker рекомендуется использовать форму exec инструкции ENTRYPOINT. Дополнительные сведения о форме exec и форме оболочки см. в справочнике ENTRYPOINT в документации по Docker.

Не следует применять WORKDIR для указания точки входа в Dockerfile. Вместо этого воспользуйтесь абсолютным путем. Дополнительные сведения см. в статье о WORKDIR.

Если вы настроите контейнер для использования формы exec инструкции ENTRYPOINT, args, настроенный в файле метаданных действия, не будет выполняться в командной оболочке. Если args действия содержит переменную среды, эта переменная не будет заменена. Например, при использовании следующего формата exec вместо значения, хранящегося в $GITHUB_SHA, будет напечатано "$GITHUB_SHA".

ENTRYPOINT ["echo $GITHUB_SHA"]

Если вам нужно выполнить подстановку переменной, используйте форму оболочки или выполните оболочку напрямую. Например, используя следующий формат exec, можно выполнить оболочку для печати значения, хранящегося в переменной среды GITHUB_SHA.

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

Чтобы предоставить args, определенный в файле метаданных действия, контейнеру Docker, который использует форму exec в ENTRYPOINT, рекомендуется создать сценарий оболочки под именем entrypoint.sh, вызываемый из инструкции ENTRYPOINT:

Пример 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 Enterprise Server отправит args, настроенный в файле метаданных действия в качестве аргументов, в entrypoint.sh. Добавьте #!/bin/sh shebang в начало файла entrypoint.sh, чтобы явно использовать оболочку, соответствующую POSIX.

#!/bin/sh

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

Ваш код должен быть исполняемым. Прежде чем использовать файл entrypoint.sh в рабочем процессе, убедитесь, что он имеет разрешения execute. Вы можете изменить разрешение в терминале с помощью следующей команды:

chmod +x entrypoint.sh

Если сценарий оболочки ENTRYPOINT не является исполняемым, вы получите следующую ошибку:

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. Дополнительные сведения см. в статье Синтаксис метаданных для GitHub Actions.

При использовании CMD в своем Dockerfile следуйте приведенным ниже рекомендациям:

  1. Задокументируйте обязательные аргументы в README действия и опустите их из инструкции CMD.
  2. Используйте значения по умолчанию, позволяющие использовать действие без указания args.
  3. Если действие предоставляет флаг --help или что-то подобное, используйте его, чтобы действие документировало само себя.

Поддерживаемые возможности Linux

GitHub Actions поддерживает возможности Linux по умолчанию, которые поддерживает Docker. Возможности нельзя добавлять или удалять. Дополнительные сведения о возможностях Linux по умолчанию, которые поддерживает Docker, см. в статье Привилегии среды выполнения и возможности Linux в документации по Docker. Дополнительные сведения о возможностях Linux см. в статье Общие сведения о возможностях Linux на страницах руководства Linux.