You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

acme.sh定时续期证书后无法重启Docker中Nginx容器问题求助

解决思路

1. 优先排查环境变量与路径问题

cron的执行环境和用户登录shell完全独立,你用到的$MYHOMEDIR这类自定义变量大概率不会被cron识别,而且docker/docker compose的路径可能不在cron的PATH配置里。

  • 把所有路径替换为绝对路径:
    • 确认acme.sh的绝对路径:直接用/home/你的用户名/.acme.sh/acme.sh,或者通过which acme.sh命令查询
    • 确认docker和docker compose的绝对路径:用which docker、which docker-compose查询(部分系统里是docker-compose而非docker compose)
    • 将docker compose命令中的yaml文件路径也换成绝对路径,比如/home/xxx/docker/my-app/docker-compose.yaml

修改后的cron命令示例:

0 0 * * * /home/你的用户名/.acme.sh/acme.sh --cron --home /home/你的用户名/.acme.sh --renew-hook "/usr/bin/docker compose -f /home/xxx/docker/my-app/docker-compose.yaml restart >> /var/log/acme-renew.log 2>&1"

2. 检查Docker操作权限

执行cron任务的用户可能没有操作Docker容器的权限:

  • 确认该用户在docker用户组内:执行groups 用户名查看,若不在则执行sudo usermod -aG docker 用户名,重新登录后生效
  • 如果需要用sudo执行Docker命令,需给该用户配置免密sudo:在/etc/sudoers中添加用户名 ALL=(ALL) NOPASSWD: /usr/bin/docker,此时hook命令改为sudo /usr/bin/docker compose ...

3. 通过日志定位具体错误

在hook命令末尾添加日志重定向(如上面示例的>> /var/log/acme-renew.log 2>&1),执行后查看日志文件,能直接获取失败原因——比如找不到Docker命令、yaml文件路径错误、权限不足等。

4. 手动测试验证逻辑

  • 先单独执行hook中的Docker命令,确认能正常重启容器:/usr/bin/docker compose -f /绝对路径/docker-compose.yaml restart
  • 手动触发acme.sh的强制续订测试,验证hook是否执行:/home/你的用户名/.acme.sh/acme.sh --cron --force --home /home/你的用户名/.acme.sh,随后检查容器状态和日志

5. 改用独立脚本作为hook

如果上述方法仍无效,把重启容器的逻辑写成独立脚本,比如/home/你的用户名/restart-nginx.sh:

#!/bin/bash
/usr/bin/docker compose -f /home/xxx/docker/my-app/docker-compose.yaml restart

给脚本添加执行权限:chmod +x /home/你的用户名/restart-nginx.sh
然后修改cron命令的hook为调用该脚本:

0 0 * * * /home/你的用户名/.acme.sh/acme.sh --cron --home /home/你的用户名/.acme.sh --renew-hook "/home/你的用户名/restart-nginx.sh >> /var/log/acme-renew.log 2>&1"

内容的提问来源于stack exchange,提问作者Werner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:00:58