如何在EC2成功拉取Docker镜像后触发Shell脚本?
在EC2实例上Docker镜像拉取成功后触发Shell脚本的实现方案
当然有可行的方案,下面给你几个实用的实现方式,都是基于你提到的docker events工具来做的:
方法一:编写Docker事件监控脚本
直接利用docker events监听镜像拉取成功的事件,一旦捕获到就执行你的目标脚本。
步骤1:创建监控脚本
新建一个docker_pull_monitor.sh文件,内容如下:
#!/bin/bash # 监听Docker镜像拉取成功的事件,过滤条件为类型是image、事件是pull docker events --filter 'type=image' --filter 'event=pull' | while read -r event_line; do # 从事件输出中提取镜像名称(可选,如果你需要给目标脚本传递镜像名参数) target_image=$(echo "$event_line" | awk '{print $NF}') echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到镜像 $target_image 拉取成功,开始执行目标脚本..." # 替换成你的实际脚本路径,这里可以传递镜像名作为参数 /home/ec2-user/your_script.sh "$target_image" # 如果需要日志记录,可以把输出重定向到日志文件 # /home/ec2-user/your_script.sh "$target_image" >> /var/log/docker_hook.log 2>&1 done
步骤2:赋予脚本执行权限
chmod +x docker_pull_monitor.sh /home/ec2-user/your_script.sh
步骤3:启动监控
可以用nohup让脚本后台持续运行:
nohup ./docker_pull_monitor.sh &
这样即使退出SSH会话,监控脚本也会继续运行。
方法二:用Systemd服务托管监控脚本(适合EC2生产环境)
如果你的EC2实例需要长期运行,推荐把监控脚本做成Systemd服务,这样系统重启后会自动恢复监控,更稳定。
步骤1:创建Systemd单元文件
新建/etc/systemd/system/docker-pull-hook.service文件,内容如下:
[Unit] Description=Monitor Docker image pull success and trigger script After=docker.service Requires=docker.service [Service] User=ec2-user # 替换成你的EC2用户名,比如ec2-user ExecStart=/home/ec2-user/docker_pull_monitor.sh Restart=always # 脚本意外退出时自动重启 RestartSec=5 # 重启间隔5秒 StandardOutput=journal+console # 日志输出到Systemd日志 [Install] WantedBy=multi-user.target
步骤2:启用并启动服务
# 重新加载Systemd配置 sudo systemctl daemon-reload # 设置开机自启并立即启动服务 sudo systemctl enable --now docker-pull-hook.service
查看服务状态与日志
# 查看服务运行状态 sudo systemctl status docker-pull-hook.service # 查看监控脚本的日志 journalctl -u docker-pull-hook.service -f
额外注意事项
- 如果只需要监听特定镜像的拉取事件,可以在
docker events命令中添加镜像过滤,比如--filter 'image=nginx:*',这样只会触发nginx镜像的拉取事件 - 可以扩展脚本,监听
pull_failed事件来处理拉取失败的场景,只需把--filter 'event=pull'改成--filter 'event=pull_failed' - 确保EC2实例的Docker服务正常运行,且执行监控脚本的用户有Docker操作权限(可以把用户加入docker组:
sudo usermod -aG docker ec2-user)
内容的提问来源于stack exchange,提问作者higuy
相关产品推荐
相关产品推荐

