Инструкции по 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 задает путь к рабочей папке в переменной среды GITHUB_WORKSPACE
. Инструкцию WORKDIR
не рекомендуется использовать в Dockerfile
. Перед выполнением действия GitHub подключит каталог 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 отправит 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
следуйте приведенным ниже рекомендациям:
- Задокументируйте обязательные аргументы в README действия и опустите их из инструкции
CMD
. - Используйте значения по умолчанию, позволяющие использовать действие без указания
args
. - Если действие предоставляет флаг
--help
или что-то подобное, используйте его, чтобы действие документировало само себя.
Поддерживаемые возможности Linux
GitHub Actions поддерживает возможности Linux по умолчанию, которые поддерживает Docker. Возможности нельзя добавлять или удалять. Дополнительные сведения о возможностях Linux по умолчанию, поддерживаемых Docker, см. в разделе "Возможности ядра Linux" в документации По Docker. Дополнительные сведения о возможностях Linux см. в статье Общие сведения о возможностях Linux на страницах руководства Linux.