399 字
2 分钟
记一次巨离谱的调试

调试一上午,发现是打包 Docker 时候的一个小问题导致的。

🐛 问题描述#

一台服务器上打包的 Docker 镜像,在另一台服务器上部署后,容器无法访问外部网络。

🔍 排查过程#

  1. 初步怀疑:防火墙 这台服务器的 iptables 配置了 DOCKER-USER 链的相关防火墙。联想到之前也因为防火墙导致过类似问题,所以这次第一反应还是认为是防火墙导致的。

  2. 无效的尝试 于是开始疯狂在防火墙上找问题:

    • 重启了 N 遍防火墙和 Docker 服务,不行。
    • 甚至在 DOCKER-USER 链的最上层添加 0.0.0.0/0ACCEPT 规则,还是不行。
  3. 转折点 在几近崩溃时,突然想到一个问题:这个 docker-compose 下的其他容器是否正常? 测试后发现,哎~其他容器的网络是正常的,唯独这个新镜像的容器不行!

  4. 定位“元凶” 问题基本锁定在镜像本身。遂回头查看 Dockerfile 文件,发现了这几行:

    ENV http_proxy=http://10.10.0.20:7897
    ENV https_proxy=http://10.10.0.20:7897
    ENV no_proxy=localhost,127.0.0.1
    

    这个代理 10.10.0.20:7897 仅在打包服务器上可用,在部署服务器上是无法访问的。而这几个环境变量在打包后没有被置空,被一起打进了镜像里!

💡 解决方案#

问题找到了,解决就很简单了。尝试进入容器内部,使用 unset 命令清除了这几个环境变量:

unset http_proxy
unset https_proxy
unset no_proxy

😮‍💨 总结#

一上午的时间,就因为这么一个小小的疏忽流逝了。

记一次巨离谱的调试
https://blog.zzboy.tk/posts/记一次巨离谱的调试/
作者
小朱朱
发布于
2025-10-24
许可协议
CC BY-NC-SA 4.0