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
相关产品推荐
相关产品推荐

