添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Skip to main content

Dockerfile 对 GitHub Actions 的支持

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

Note

GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

关于 Dockerfile 指令

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

Dockerfile 指令和覆盖

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

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

Dockerfile 中的第一条指令必须为 FROM ,该指令用于选择 Docker 基础映像。 有关详细信息,请参阅 Docker 文档中的 FROM 参考

以下是设置 FROM 参数时的一些最佳做法:

  • 建议使用正式的 Docker 映像。 例如, python ruby
  • 使用版本标记(如果有),最好使用主要版本。 例如,请使用 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 Actions 的元数据语法 ”。

    Docker ENTRYPOINT 指令具有 shell 形式和 exec 形式 。 Docker ENTRYPOINT 文档建议使用 ENTRYPOINT 指令的 exec 形式。 有关 exec 和 shell 形式的详细信息,请参阅 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 文件之前,请确保该文件具有 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
    

    如果在操作的元数据文件中定义 argsargs 将替代 Dockerfile 中指定的 CMD 指令。 有关详细信息,请参阅“GitHub Actions 的元数据语法”。

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