跳至主要内容

GitHub 操作的 Dockerfile 支持

为 Docker 容器操作创建 Dockerfile 时,你应该了解一些 Docker 指令如何与 GitHub 操作和操作的元数据文件交互。

关于 Dockerfile 指令

Dockerfile 包含定义 Docker 容器的内容和启动行为的指令和参数。有关 Docker 支持的指令的更多信息,请参阅 Docker 文档中的“Dockerfile 参考”。

Dockerfile 指令和覆盖

一些 Docker 指令与 GitHub Actions 交互,操作的元数据文件可以覆盖一些 Docker 指令。确保您熟悉 Dockerfile 如何与 GitHub Actions 交互,以防止任何意外行为。

USER

Docker 操作必须由默认 Docker 用户 (root) 运行。请勿在 Dockerfile 中使用 USER 指令,因为您将无法访问 GITHUB_WORKSPACE 目录。有关更多信息,请参阅 Docker 文档中的“变量”和“USER 参考”。

FROM

Dockerfile 中的第一条指令必须是 FROM,它会选择一个 Docker 基础镜像。有关更多信息,请参阅 Docker 文档中的“FROM 参考”。

以下是设置 FROM 参数时的一些最佳实践

  • 建议使用官方 Docker 镜像。例如,pythonruby
  • 如果存在版本标记,请使用该标记,最好使用主版本。例如,使用 node:10 而不是 node:latest
  • 建议使用基于 Debian 操作系统的 Docker 镜像。

WORKDIR

GitHub 在 GITHUB_WORKSPACE 环境变量中设置工作目录路径。建议不要在 Dockerfile 中使用 WORKDIR 指令。在操作执行之前,GitHub 会将 GITHUB_WORKSPACE 目录装载到 Docker 镜像中该位置的任何内容之上,并将 GITHUB_WORKSPACE 设置为工作目录。有关更多信息,请参阅 Docker 文档中的“变量”和“WORKDIR 参考”。

入口点

如果您在操作的元数据文件中定义了 entrypoint,它将覆盖在 Dockerfile 中定义的 ENTRYPOINT。有关更多信息,请参阅“GitHub Actions 的元数据语法”。

Docker ENTRYPOINT 指令具有shell 形式和exec 形式。Docker ENTRYPOINT 文档建议使用 ENTRYPOINT 指令的exec 形式。有关execshell 形式的更多信息,请参阅 Docker 文档中的 ENTRYPOINT 参考

您不应使用 WORKDIR 在 Dockerfile 中指定入口点。相反,您应使用绝对路径。有关更多信息,请参阅 WORKDIR

如果您将容器配置为使用 ENTRYPOINT 指令的exec 形式,则在操作的元数据文件中配置的 args 将不会在命令 shell 中运行。如果操作的 args 包含环境变量,则不会替换该变量。例如,使用以下exec 格式不会打印存储在 $GITHUB_SHA 中的值,而是会打印 "$GITHUB_SHA"

ENTRYPOINT ["echo $GITHUB_SHA"]

如果您想要变量替换,则使用shell 形式或直接执行 shell。例如,使用以下exec 格式,您可以执行 shell 以打印存储在 GITHUB_SHA 环境变量中的值。

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

要将操作的元数据文件中定义的 args 提供给在 ENTRYPOINT 中使用exec 形式的 Docker 容器,我们建议创建一个名为 entrypoint.sh 的 shell 脚本,您可从 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。在 entrypoint.sh 文件的顶部添加 #!/bin/sh shebang 以明确使用系统的 POSIX 兼容 shell。

#!/bin/sh

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

您的代码必须可执行。在工作流中使用 entrypoint.sh 文件之前,请确保该文件具有“执行”权限。您可以使用以下命令从终端修改权限

chmod +x entrypoint.sh

ENTRYPOINT shell 脚本不可执行时,您会收到类似以下内容的错误

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 将覆盖在 Dockerfile 中指定的 CMD 指令。有关更多信息,请参阅“GitHub Actions 的元数据语法”。

如果您在 Dockerfile 中使用 CMD,请遵循以下准则

  1. 在操作的 README 中记录所需的文档参数,并从 CMD 指令中省略它们。
  2. 使用允许在不指定任何 args 的情况下使用操作的默认值。
  3. 如果操作公开 --help 标志或类似内容,请使用它使操作具有自文档功能。

受支持的 Linux 功能

GitHub Actions 支持 Docker 支持的默认 Linux 功能。无法添加或删除功能。有关 Docker 支持的默认 Linux 功能的更多信息,请参阅 Docker 文档中的“运行时特权和 Linux 功能”。要了解有关 Linux 功能的更多信息,请参阅 Linux 手册页中的“Linux 功能概述”。