399 字
2 分钟
记一次巨离谱的调试
调试一上午,发现是打包 Docker 时候的一个小问题导致的。
🐛 问题描述
一台服务器上打包的 Docker 镜像,在另一台服务器上部署后,容器无法访问外部网络。
🔍 排查过程
初步怀疑:防火墙 这台服务器的
iptables配置了DOCKER-USER链的相关防火墙。联想到之前也因为防火墙导致过类似问题,所以这次第一反应还是认为是防火墙导致的。无效的尝试 于是开始疯狂在防火墙上找问题:
- 重启了 N 遍防火墙和 Docker 服务,不行。
- 甚至在
DOCKER-USER链的最上层添加0.0.0.0/0的ACCEPT规则,还是不行。
转折点 在几近崩溃时,突然想到一个问题:这个
docker-compose下的其他容器是否正常? 测试后发现,哎~其他容器的网络是正常的,唯独这个新镜像的容器不行!定位“元凶” 问题基本锁定在镜像本身。遂回头查看
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
😮💨 总结
一上午的时间,就因为这么一个小小的疏忽流逝了。
