GitHub Actions中Docker容器无法访问互联网的问题排查
GitHub Actions中Docker容器无法ping通外部IP的问题解决
问题描述
我希望在GitHub Actions运行的容器内部ping某个外部IP,编写了如下GitHub Actions工作流和docker-compose文件:
GitHub Actions工作流
name: PING on: push: jobs: ping: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Ping Internet run: docker-compose -f test/docker-compose.yml up --force-recreate --build --abort-on-container-exit
docker-compose文件
version: '3.1' services: pinger: privileged: true image: alpine:3.17 command: ping -c 16 -s 64 8.8.8.8 networks: default: ipv4_address: 10.0.0.5 networks: default: driver: bridge ipam: config: - subnet: 10.0.0.0/24 gateway: 10.0.0.1
上述配置在本地运行完全正常,但在GitHub Actions环境中执行时,无法收到ping响应,容器无法访问互联网。
原因分析
- GitHub Actions的Ubuntu runner环境中,手动指定的
10.0.0.0/24子网可能与runner自身的网络存在冲突,导致容器无法正确路由到外部网络。 - 手动配置的网关
10.0.0.1在GitHub Actions环境中未被正确设置路由规则,无法将容器的流量转发至公网。
解决方法
方案1:移除自定义网络配置,使用Docker默认网络
修改docker-compose.yml,删除手动指定的网络和静态IP配置,让Docker自动分配网络资源:
version: '3.1' services: pinger: privileged: true image: alpine:3.17 command: ping -c 16 -s 64 8.8.8.8
Docker默认的bridge网络已适配GitHub Actions runner的网络环境,可直接访问公网。
方案2:使用host网络模式共享runner网络
如果需要保留自定义网络的部分特性,可将容器设置为host网络模式,让容器直接共享runner的网络栈:
version: '3.1' services: pinger: privileged: true image: alpine:3.17 command: ping -c 16 -s 64 8.8.8.8 network_mode: host
注意:host模式下无需再配置自定义网络和静态IP,容器将直接使用runner的网络配置访问外部。
补充说明
在GitHub Actions环境中,尽量避免手动指定子网和网关,除非明确知晓runner的网络拓扑结构。默认的Docker网络配置已完成公网访问的适配,无需额外调整。
内容的提问来源于stack exchange,提问作者pseusys
相关产品推荐
相关产品推荐

