如何在Windows Docker容器的自托管GitHub Actions Runner中运行前后置作业脚本
在Windows Docker容器中配置GitHub Actions Runner作业前后置脚本
问题出在Docker环境中环境变量的传递逻辑:setx设置的变量不会在当前CMD会话立即生效,且容器重启后未持久化的变量会丢失,另外GitHub Actions Runner进程需要在启动时就加载到这些钩子变量才能生效。以下是几种可行的解决方案:
1. 自定义Docker镜像时注入环境变量
如果是自己构建Runner镜像,直接在Dockerfile中用ENV指令定义钩子变量,确保容器启动时所有进程都能读取到:
# 假设基于官方Windows Runner镜像 FROM my-github-actions-runner:windows # 设置作业开始前钩子脚本路径 ENV ACTIONS_RUNNER_HOOK_JOB_STARTED="C:\actions-runner-resources\scripts\pre-post-build\pre-run-script.ps1" # 设置作业完成后钩子脚本路径 ENV ACTIONS_RUNNER_HOOK_JOB_COMPLETED="C:\actions-runner-resources\scripts\pre-post-build\post-run-script.ps1" # 其他镜像构建步骤...
构建镜像后启动容器,Runner启动时会自动读取这些环境变量并触发对应脚本。
2. 启动容器时通过参数传递环境变量
如果使用现成的Runner镜像,启动容器时通过-e参数直接注入钩子变量:
docker run ` -e ACTIONS_RUNNER_HOOK_JOB_STARTED="C:\actions-runner-resources\scripts\pre-post-build\pre-run-script.ps1" ` -e ACTIONS_RUNNER_HOOK_JOB_COMPLETED="C:\actions-runner-resources\scripts\pre-post-build\post-run-script.ps1" ` -v C:\host-resources:C:\actions-runner-resources ` # 确保脚本目录挂载到容器内 your-runner-image-name
这种方式不需要修改镜像,变量会直接注入容器的全局环境中。
3. 修改Runner启动脚本(容器已运行时)
如果容器已经在运行,进入容器后修改Runner的启动脚本,在启动Runner前手动设置环境变量:
- 进入容器的CMD会话:
docker exec -it your-container-name cmd - 找到Runner的启动目录(通常是
C:\actions-runner),编辑启动脚本(比如start-runner.cmd),添加以下内容在启动命令之前:set ACTIONS_RUNNER_HOOK_JOB_STARTED=C:\actions-runner-resources\scripts\pre-post-build\pre-run-script.ps1 set ACTIONS_RUNNER_HOOK_JOB_COMPLETED=C:\actions-runner-resources\scripts\pre-post-build\post-run-script.ps1 - 重启Runner服务或重新执行启动脚本:
.\run.cmd
验证要点
- 确保脚本路径在容器内真实存在,可通过
dir C:\actions-runner-resources\scripts\pre-post-build验证。 - 检查Runner进程是否有脚本的执行权限,Windows容器中可右键脚本查看“安全”选项卡,确保Runner用户有读取和执行权限。
- 启动Runner前,可通过
echo %ACTIONS_RUNNER_HOOK_JOB_STARTED%确认变量已正确设置。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

