👋 We've unified all of GitHub's product documentation in one place! Check out the content for REST API, GraphQL API, and Developers. Learn more on the GitHub blog.


我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

Dockerfile 对 GitHub 操作的支持

为 Docker 容器创建 Dockerfile 时, 您应该知道一些 Docker 指令如何与 GitHub 操作及操作的元数据文件交互。

GitHub 操作 可用于 GitHub Free、GitHub Pro、组织的 GitHub Free、GitHub Team、GitHub Enterprise Cloud 和 GitHub One。 GitHub 操作 不适用于使用旧版按仓库计划的帐户所拥有的私有仓库。 更多信息请参阅“GitHub 的产品”。

本文内容

Were you able to find what you were looking for?

关于 Dockerfile 指令

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

Dockerfile 指令和覆盖

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

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 将在 Docker 映像中位于该位置的任何项目上安装 GITHUB_WORKSPACE 目录,并将 GITHUB_WORKSPACE 设置为工作目录。 更多信息请参阅“使用环境变量”和 Docker 文档中的 WORKDIR 引用

ENTRYPOINT

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

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

如果您配置容器使用 exec 形式的 ENTRYPOINT 指令,在操作元数据文件中配置的 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 指令调用、名为 entrypoint.sh 的 shell 脚本。

示例 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 the `args` supplied in an `array` individually 
# or splits `args` in a string separated by whitespace.
sh -c "echo $*"

您的代码必须是可执行的。 在用于工作流程之前,确保 entrypoint.sh 文件有 execute 权限。 您可以使用此命令从终端修改权限:

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

如果在操作的元数据文件中定义 argsargs 将覆盖 Dockerfile 中指定的 CMD 指令。 更多信息请参阅“GitHub 操作 的元数据语法”。

如果在 Dockerfile 中使用 CMD,请遵循以下指导方针:

  1. 在操作的自述文件中记录必要的参数,并在 CMD 指令的中忽略它们。
  2. 使用默认值,允许不指定任何 args 即可使用操作。
  3. 如果操作显示 --help 标记或类似项,请使用它让您的操作能够自行记录。

支持的 Linux 功能

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

Were you able to find what you were looking for?

问问别人

找不到要找的内容?

联系我们