Docker Compose依赖容器未重启问题排查与解决咨询
问题
- Docker同时启动gluetun和linuxserver-deluge两个容器
- gluetun容器需要15-20秒才能建立VPN连接
- 期间deluge启动后因无法连接网络直接退出,错误码为128或137
- gluetun正常运行,但deluge处于停止状态,没有自动重启
- 尝试添加
depends_on选项但无效果 - 运行环境:Synology DSM 7.1,通过Portainer管理
现有Docker Compose配置
初始配置
version: "3" services: gluetun: image: qmcgaw/gluetun container_name: gluetun_vpn cap_add: - NET_ADMIN environment: - VPN_SERVICE_PROVIDER=some provider - ... other variables ports: #uncomment ports below for additional applications - ... port mapping volumes: - /volume1/docker/gluetun:/gluetun network_mode: bridge restart: unless-stopped linuxserver-deluge: image: ghcr.io/linuxserver/deluge container_name: deluge_gluetun network_mode: service:gluetun # run on the vpn network environment: - ... env variables volumes: - ... folder mapping restart: always
添加depends_on后的配置
version: "3" services: gluetun: image: qmcgaw/gluetun container_name: gluetun_vpn cap_add: - NET_ADMIN environment: - VPN_SERVICE_PROVIDER=some provider - ... other variables ports: #uncomment ports below for additional applications - ... port mapping volumes: - /volume1/docker/gluetun:/gluetun network_mode: bridge restart: unless-stopped linuxserver-deluge: image: ghcr.io/linuxserver/deluge container_name: deluge_gluetun network_mode: service:gluetun # run on the vpn network environment: - ... env variables volumes: - /volume1/docker/deluge:/config - /volume1/Downloads:/data/torrents depends_on: - gluetun restart: always
解决方案
为什么Docker不重启deluge容器?
restart: always默认会在容器退出时重启,但如果容器频繁快速失败(几秒内就退出),Docker会触发退避延迟机制,暂时停止重启以避免资源耗尽- 错误码128/137表示容器被强制终止,这里是因为deluge启动时gluetun还没建立网络,进程无法初始化就退出,这种快速失败触发了Docker的重启冷却
具体解决办法
1. 利用gluetun健康检查+依赖条件(推荐)
Gluetun支持健康检查来检测VPN连接状态,结合Compose 3.9+的depends_on条件参数,让deluge等gluetun完全就绪后再启动:
修改后的配置示例:
version: "3.9" services: gluetun: image: qmcgaw/gluetun container_name: gluetun_vpn cap_add: - NET_ADMIN environment: - VPN_SERVICE_PROVIDER=some provider - ... other variables ports: - ... port mapping volumes: - /volume1/docker/gluetun:/gluetun network_mode: bridge restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "https://ipinfo.io/ip"] interval: 10s timeout: 5s retries: 5 linuxserver-deluge: image: ghcr.io/linuxserver/deluge container_name: deluge_gluetun network_mode: service:gluetun environment: - ... env variables volumes: - /volume1/docker/deluge:/config - /volume1/Downloads:/data/torrents depends_on: gluetun: condition: service_healthy restart: always
2. 给deluge添加启动延迟脚本
如果无法升级Compose版本,可在deluge启动命令中加入固定延迟,确保gluetun有足够时间建立连接:
linuxserver-deluge: # 其他配置保持不变 command: /bin/sh -c "sleep 30 && /init" restart: always
注:
sleep 30可根据实际连接时间调整,建议设为比gluetun最长连接时间多5-10秒
3. 关闭Docker重启冷却(不推荐)
通过修改Docker配置强制无冷却重启,但可能造成资源浪费,仅作临时应急:
- 编辑Docker配置文件(通常是
/etc/docker/daemon.json),添加:
{ "restart-max-attempts": -1, "restart-windows": 0 }
- 重启Docker服务:
systemctl restart docker
关键说明
- 默认的
depends_on只保证容器启动顺序,不等待服务就绪,所以之前的配置无效 - 用gluetun健康检查是最可靠的方案,能精准判断VPN网络是否可用
- 启动延迟脚本是简单 workaround,但如果gluetun连接时间不稳定可能失效
内容的提问来源于stack exchange,提问作者Alexander M.
相关产品推荐
相关产品推荐

