返回

在 GitLab Runner 中如何确保 Windows Docker 入门点的稳定行为?

windows

在 GitLab Runner 中让 Windows Docker 入门点保持一致的行为

引言

在 Windows Docker 环境中,使用 GitLab Runner 构建镜像时,入门点行为不一致的问题可能会困扰开发人员。本文旨在深入探讨这个问题,提供一种可靠的方法来确保 GitLab Runner 中 Windows Docker 入门点的一致行为。

问题

当创建基于 chocolatey/choco 镜像并使用 winamd64/docker:windowsservercore Runner 构建时,包含 Nvidia Cuda 的镜像可以成功运行脚本,而没有 Cuda 的镜像则不能。虽然两个镜像都使用相同的 entrypoint.cmd,但只有 Cuda 镜像能执行 GitLab 流水线中的脚本。

解决方案

为了解决这个问题,需要对 Docker 文件和 entrypoint.cmd 脚本进行以下修改:

  • Docker 文件:
    • 添加 COPY ./script.ps1 ./script.ps1,其中 script.ps1 是要运行的 PowerShell 脚本。
    • ENTRYPOINT 更改为 ENTRYPOINT ["./entrypoint.cmd"]
  • entrypoint.cmd:
    • 替换 %*.\script.ps1 "$@"

更新后的 Docker 文件和 entrypoint.cmd 如下:

Docker 文件:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
COPY entrypoint.cmd entrypoint.cmd
COPY ./script.ps1 ./script.ps1
ENTRYPOINT ["./entrypoint.cmd"]

entrypoint.cmd:

.\script.ps1 "$@"

结论

通过实施这些修改,可以确保无论镜像是否包含 Cuda,GitLab 流水线中的 Windows Docker 入门点都会产生一致的行为。这简化了构建过程,消除了不一致性和困惑。

常见问题解答

  • 问:为什么我需要将脚本复制到镜像中?
    • 答:在镜像构建时将脚本复制到镜像中,确保 GitLab Runner 可以访问脚本并执行它。
  • 问:为什么 ENTRYPOINT 需要更改?
    • 答:更改 ENTRYPOINT 允许显式指定 entrypoint.cmd 脚本作为镜像的入口点。
  • 问:我可以使用其他脚本语言吗?
    • 答:是的,你可以使用任何与 PowerShell 兼容的脚本语言,例如 Bash 或 Python。
  • 问:为什么 entrypoint.cmd 脚本的命令更改了?
    • 答:更改后的命令确保脚本传递的参数被正确解析和执行。
  • 问:这些更改适用于所有 Windows Docker 镜像吗?
    • 答:这些更改适用于所有在 Windows Docker 环境中使用 GitLab Runner 构建的镜像。