OpenWrt Docker拉取镜像超时失败context deadline exceeded"错误
最近在折腾OpenWrt上的Docker时,遇到了个让人抓狂的灵异事件:当我兴冲冲敲下Docker pull debian时,终端突然甩出个"context deadline exceeded"的玄学报错。这感觉就像去超市买泡面,结果收银台说"地球不营业了"一样离谱。
root@openwrt:\~ # docker pull debian Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
被AI带跑偏的那些年
作为一个倔强的技术宅,我当场开启搜索引擎狂暴模式。网上各路AI大神给出了五花八门的方案:
1. 修改/etc/docker/daemon.json
这文件在OpenWrt里就像薛定谔的猫——你永远不知道它存不存在。我硬着头皮往里塞了堆自己都看不懂的配置,结果docker直接进入装死模式。
2. 配置http-proxy.conf
跟着教程在/etc/systemd/system里新建文件夹时突然醒悟——OpenWrt压根不用systemd!这操作就像给自行车装飞机引擎,纯属行为艺术。
3. 暴力修改init.d脚本
在dockerd启动脚本里简单粗暴地export HTTP_PROXY=...,结果环境变量像被黑洞吞噬了一样毫无反应。此时我仿佛听见Docker在说:"就这?"
- OpenWrt docker pull失败
OpenWrt的祖传秘籍
在经历了九九八十一次失败后,终于发现OpenWrt的隐藏设定——它用procd服务管理器来调教进程。就像武侠小说里的任督二脉,需要用特定姿势注入环境变量:
procd_set_param env HTTP_PROXY=http://代理地址:端口 procd_set_param env HTTPS_PROXY=http://代理地址:端口
这个操作的精妙之处在于:
1. 用OpenWrt亲爹认证的procd服务管理器传参
2. 环境变量会像疫苗一样精准注入到dockerd进程
3. 既不用碰systemd也不玩daemon.json的玄学
改脚本的正确姿势,最终有效方案
修改 /etc/init.d/dockerd 使用 procd_set_param env 设置环境变量
对比原始脚本和修改后的版本,重点就是新增的这两行"神秘代码":
# 原脚本 procd_open_instance procd_set_param stderr 1 # 修改后 procd_open_instance procd_set_param env HTTP_PROXY=... procd_set_param env HTTPS_PROXY=... procd_set_param stderr 1
改完后记得用service dockerd restart重启服务,这时候再尝试docker pull,看着镜像进度条唰唰往前走,仿佛听到了天籁之音。
血泪总结
1. 认清系统本质:OpenWrt不是普通Linux,别拿Ubuntu的经验硬套
2. 服务管理器选对姿势:procd和systemd是平行世界的存在
3. 环境变量要看场合:直接export对后台服务基本无效
4. AI建议要验货:网上的方案记得先看适用场景
最后友情提示:如果公司网络设了防火墙,建议先找网管喝个茶。毕竟用代理虽然能解决问题,但被抓包了可别说是我教的啊!(狗头保命)
点击链接加入群聊四群:722808830
点击链接加入群聊三群:751529538(已满)
点击链接加入群聊二群:376877156(已满)
点击链接加入群聊一群:622891808(已满)
饿了么红包
本站附件分享,如果附件失效,可以去找找看