Skip to main content

Поддержка 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.