自托管GitHub Actions Runner构建Docker时卡在Poetry私有依赖安装
问题排查与解决方案
针对你在ARC自托管Runner上构建Docker镜像时,卡在poetry install拉取私有GitHub依赖的问题,结合托管Runner正常的对比,给出以下排查和修复步骤:
1. 修正SSH密钥文件权限
SSH要求私钥文件权限必须是600(仅所有者可读可写),你当前工作流中生成的ssh-private-key文件权限可能不符合要求,导致Docker build时无法正常使用密钥。修改工作流中的密钥生成步骤:
- run: | echo "${{ secrets.SSH_PRIVATE_KEY }}" > ssh-private-key chmod 600 ssh-private-key
2. 确保Buildx使用容器驱动(适配Dind模式)
在Dind(Docker-in-Docker)环境下,默认的Buildx驱动可能无法正常转发SSH代理,需要显式指定docker-container驱动:
- uses: docker/setup-buildx-action@v3 with: driver: docker-container
3. 完善Dockerfile中的SSH环境配置
你当前的Dockerfile中已添加ssh-keyscan,但可进一步完善目录和文件权限,同时增加SSH连接测试定位问题:
FROM python:3.12 ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 WORKDIR /app RUN python -m pip install poetry RUN poetry config virtualenvs.create false COPY pyproject.toml /app # 修正.ssh目录和known_hosts权限 RUN --mount=type=ssh mkdir -p ~/.ssh && chmod 700 ~/.ssh RUN --mount=type=ssh ssh-keyscan github.com > ~/.ssh/known_hosts && chmod 644 ~/.ssh/known_hosts # 测试SSH连接到GitHub(调试用,后续可移除) RUN --mount=type=ssh ssh -T git@github.com || echo "SSH连接测试完成" # 启用Poetry的SSH调试日志,方便定位卡住原因 RUN poetry config git.ssh.command "ssh -v" RUN --mount=type=ssh poetry install --no-interaction CMD ["python", "app.py"]
添加ssh -v后,Poetry会输出详细的SSH克隆日志,可直观看到是连接超时、密钥验证失败还是其他环节出问题。
4. 检查自托管Runner的网络连通性
自托管Runner所在的K8s集群可能存在网络限制,导致无法访问GitHub的SSH端口(22):
- 进入Runner Pod执行连通性测试:
如果无法连通,需调整集群防火墙或网络策略,放行对kubectl exec -n arc-runners <runner-pod-name> -- telnet github.com 22github.com:22的访问。 - 同时检查DNS解析是否正常:
kubectl exec -n arc-runners <runner-pod-name> -- nslookup github.com
5. 调整Runner资源配置
如果自托管Runner的CPU/内存资源不足,也会导致poetry install过程卡住。对比GitHub托管Runner(ubuntu-latest默认2核4G),调整Helm安装时的资源限制:
helm install "${INSTALLATION_NAME}" \ --namespace "${NAMESPACE}" \ --create-namespace \ --set githubConfigUrl="${GITHUB_CONFIG_URL}" \ --set containerMode.type=dind \ --set githubConfigSecret="${GITHUB_APP_SECRET}" \ --set runner.resources.requests.cpu=2 \ --set runner.resources.requests.memory=4Gi \ --set runner.resources.limits.cpu=2 \ --set runner.resources.limits.memory=4Gi \ oci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set
6. 确认私有仓库的SSH权限
确保你的SSH密钥对应的GitHub账号拥有<org>/core.git仓库的读取权限,可在本地用该密钥测试克隆:
git clone git@github.com:<org>/core.git
内容的提问来源于stack exchange,提问作者Nguyễn Đức Huy
相关产品推荐
相关产品推荐

