使用docker-compose部署Semaphore:Git仓库克隆失败问题
Docker部署Semaphore后容器内无法克隆GitHub仓库的网络问题排查与解决
问题背景
已通过docker-compose完成Semaphore部署,使用GitHub个人访问令牌(PAT)配置了目标仓库,Ansible主机上可正常克隆该仓库,但Semaphore容器内克隆操作失败。同时已为Semaphore前端配置Nginx反向代理。
现有网络配置
当前主机上的nftables规则如下(注意原规则存在语法错误,已修正网段位置):
# Enable IP forwarding sysctl -w net.ipv4.ip_forward=1 # Apply NAT rule for Docker custom network nft flush ruleset nft add table ip nat nft add chain ip nat POSTROUTING { type nat hook postrouting priority srcnat \; } nft add rule ip nat POSTROUTING ip saddr 172.18.0.0/16 oifname != "docker0" masquerade
克隆失败错误日志
1:57:45 PM Task 15 added to queue 1:57:45 PM Started: 15 1:57:45 PM Run TaskRunner with template: test-template 1:57:45 PM Preparing: 15 1:59:55 PM fatal: unable to access 'https://github.com/org/ansible-configs/': Failed to connect to github.com port 443 after 130064 ms: Could not connect to server 1:59:55 PM Cloning Repository https://github.com/org/ansible-configs 1:59:55 PM Cloning into 'repository_1_template_1'... 2:02:06 PM Failed updating repository: exit status 128 2:02:06 PM Failed to run task: exit status 128
排查方向与配置调整
1. 修复NAT规则语法错误
原规则中ip saddr与oifname之间缺失网段参数,导致NAT规则未生效。执行以下命令修正规则:
nft flush ruleset nft add table ip nat nft add chain ip nat POSTROUTING { type nat hook postrouting priority srcnat \; } nft add rule ip nat POSTROUTING ip saddr 172.18.0.0/16 oifname != "docker0" masquerade
根据操作系统不同保存规则,避免重启后丢失:
- Debian/Ubuntu:
nft list ruleset > /etc/nftables.conf - RHEL/CentOS:
nft list ruleset > /etc/sysconfig/nftables.conf
2. 验证容器基础网络连通性
进入Semaphore容器内部,分步测试网络:
- 测试网络出口:
ping 8.8.8.8,若不通则说明容器路由或NAT配置存在问题 - 测试GitHub端口连通性:
telnet github.com 443或curl -v https://github.com,确认是否能建立TCP连接
3. 检查Docker网络配置
通过docker inspect <semaphore-container-name>查看容器网络信息,确认:
- 容器所属网络的driver为默认的
bridge模式 - 容器IP属于
172.18.0.0/16网段
4. 排查防火墙出站规则
确认主机防火墙未拦截容器出站流量:
- 检查是否有拦截443端口的规则:
nft list ruleset | grep "tcp dport 443" - 若使用ufw,添加允许Docker网段流量的规则:
ufw allow from 172.18.0.0/16
5. 修正容器DNS配置
进入容器查看/etc/resolv.conf,若DNS服务器配置异常,可在docker-compose.yml中手动指定:
services: semaphore: # 其他配置项 dns: - 8.8.8.8 - 8.8.4.4
6. 验证PAT与仓库地址有效性
在容器内手动测试克隆,排除凭证或地址问题:
git clone https://<你的PAT令牌>@github.com/org/ansible-configs.git
确认PAT已拥有repo权限(私有仓库需此权限),仓库地址无拼写错误。
内容的提问来源于stack exchange,提问作者raghu_manne
相关产品推荐
相关产品推荐

