在Gogs / webhooks界面中,当我点击测试传递按钮时出现此错误;
交付:发布http://localhost:8000/hook?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0IjoidG9tL2Ryb255IiwidHlwZSI6Imhvb2sifQ.UZdOVW2IdiDcLQzKcnlmlAxkuA8GTZBH634G0K7rggI:拨打tcp [:: 1]:8000:getsockopt:连接被拒绝
这是我的docker-compose.yml文件
version: '2'
services:
gogs:
image: gogs/gogs
ports:
- 3000:3000
- 22:22
links:
- mysql
mysql:
image: mysql
expose:
- 3306
environment:
- MYSQL_ROOT_PASSWORD=1234
- MYSQL_DATABASE=gogs
drone:
image: drone/drone
links:
- gogs
ports:
- 8000:8000
volumes:
- ./drone:/var/lib/drone
- /var/run/docker.sock:/var/run/docker.sock
environment:
- REMOTE_DRIVER=gogs
- REMOTE_CONFIG=http://gogs:3000?open=true
# - PUBLIC_MODE=true
答案 0 :(得分:1)
根本原因是Drone假定其外部地址是localhost:8000,因为这是从浏览器访问它的方式。因此,无人机将所有Gogs webhook配置为使用localhost:8000/hook
作为回调URL。
这里的问题是Gogs和Drone在不同的网络上运行在不同的容器中。这意味着当Gogs尝试将钩子发送到无人机时,它会将其发送到localhost:8000
并因为无人机位于单独的桥上而失败。
推荐修复
建议的解决方法是在Drone和Gogs中使用DNS或IP地址。如果您正在运行任一系统的生产安装,则您不太可能使用localhost,因此这似乎是合理的解决方案。
对于本地测试,您还可以使用Docker分配的本地IP地址。您可以使用Docker inspect找到您的Drone和Gogs IP地址:
"Networks": {
"default": {
"IPAddress": "172.18.0.3"
}
}
为什么不自定义主机名?
使用自定义主机名(例如http://gogs)是有问题的,因为无人机使用默认的Docker网络设置为每个构建创建短暂的Docker容器。这意味着您的构建环境将使用其自己的隔离网络,并且无法解析http://gogs
因此,即使我们将Drone和Gogs配置为使用自定义主机名进行通信,构建环境也无法解析Gogs主机名来克隆您的存储库。