如何在CloudWatch告警触发EC2重启后执行Docker-Compose等命令
解决AWS EC2重启后自动执行Docker Compose命令的方案
以下是几种可靠的实现方式,适用于CloudWatch告警触发实例重启后的场景:
方法一:使用Systemd服务(推荐)
这是当前主流Linux发行版(如Amazon Linux 2、Ubuntu 20.04+、CentOS 8+)的标准方案,稳定性最高。
创建启动脚本
创建一个包含所需命令的脚本文件,比如/opt/start-docker-containers.sh:#!/bin/bash # 重定向日志到文件,方便排查问题 exec > /var/log/start-docker-containers.log 2>&1 # 切换到docker-compose.yml所在的绝对路径 cd /home/ec2-user/my-docker-project # 启动容器(使用docker-compose的绝对路径,避免环境变量问题) /usr/local/bin/docker-compose up -d给脚本添加执行权限:
chmod +x /opt/start-docker-containers.sh创建Systemd服务配置文件
在/etc/systemd/system/目录下创建服务文件start-docker-containers.service:[Unit] Description=Auto-start Docker Compose containers on system boot Requires=docker.service After=docker.service network.target [Service] Type=oneshot ExecStart=/opt/start-docker-containers.sh RemainAfterExit=yes [Install] WantedBy=multi-user.targetRequires=docker.service:确保Docker服务启动后再执行本脚本After=docker.service network.target:等待Docker和网络服务就绪后运行
启用并激活服务
# 重新加载systemd配置 systemctl daemon-reload # 设置开机自启 systemctl enable start-docker-containers.service # 立即测试执行 systemctl start start-docker-containers.service
方法二:使用rc.local(适用于旧版Linux系统)
如果你的EC2实例使用的是传统init系统(如CentOS 7、Ubuntu 16.04),可以用rc.local实现:
确保rc.local可执行
chmod +x /etc/rc.local添加启动命令
编辑/etc/rc.local,在exit 0之前添加以下内容(注意使用绝对路径):# 后台启动Docker Compose容器 cd /home/ec2-user/my-docker-project && /usr/local/bin/docker-compose up -d &
关键注意事项
- 确保Docker服务本身已设置开机自启:
systemctl enable docker.service,否则脚本执行时Docker未就绪会失败 - 所有路径尽量使用绝对路径,避免系统启动时环境变量缺失导致命令找不到
- 可以通过查看日志文件(如
/var/log/start-docker-containers.log)排查启动失败的问题
内容的提问来源于stack exchange,提问作者Kevin G
相关产品推荐
相关产品推荐

