在Gogs/webhooks界面中,当我点击测试交付按钮时,我得到了这个错误;
Delivery: Post http://localhost:8000/hook?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0IjoidG9tL2Ryb255IiwidHlwZSI6Imhvb2sifQ.UZdOVW2IdiDcLQzKcnlmlAxkuA8GTZBH634G0K7rggI: dial tcp [::1]:8000: getsockopt: connection refused
这是我的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
根本原因是Drone假设它的外部地址是localhost:8000,因为这就是从浏览器访问它的方式。因此,Drone将所有Gogs的webhook配置为使用localhost:8000/hook
作为回调URL。
这里的问题是Gogs和Drone在不同的网络上运行在不同的容器中。这意味着当Gogs试图将钩子发送到drone时,它将其发送到localhost:8000
并失败,因为drone在单独的桥上。
建议修复
建议的修复是使用DNS或IP地址与Drone和Gogs。如果您正在运行任何一个系统的生产安装,则不太可能使用本地主机,因此这似乎是合理的解决方案。
对于本地测试,你也可以使用Docker分配的本地IP地址。你可以使用Docker inspect找到你的Drone和Gogs的IP地址:
"Networks": {
"default": {
"IPAddress": "172.18.0.3"
}
}
为什么不自定义主机名?
使用自定义主机名,如http://gogs,是有问题的,因为drone使用默认的Docker网络设置为每次构建创建临时的Docker容器。这意味着您的构建环境将使用自己的隔离网络,并且无法解析http://gogs
因此,即使我们配置Drone和Gogs使用自定义主机名进行通信,构建环境将无法解析Gogs主机名来克隆您的存储库。