如何配置Docker Compose实现容器a重启时自动重启容器b?
解决容器A重启时自动重启容器B的方案
针对你的需求,这里提供几个实用的解决办法,不用纠结Dockerfile里访问docker-compose目录的问题:
方法一:在容器A内挂载Docker Socket,监听自身重启事件触发B重启
这个方法让容器A直接通过Docker API操作其他容器,步骤如下:
- 修改你的docker-compose.yml,给容器a添加Docker Socket挂载:
version: "3.8" services: b: image: b restart: "on-failure" ports: - "6002:6002" a: image: a restart: "on-failure" depends_on: - b volumes: - /var/run/docker.sock:/var/run/docker.sock # 挂载Docker Socket environment: - B_CONTAINER_NAME=${COMPOSE_PROJECT_NAME}_b_1 # 自动适配项目名传递B的容器名 c: image: c restart: "on-failure"
- 在容器A的启动脚本里添加监听逻辑,比如创建一个
restart_b.sh脚本:
#!/bin/bash # 获取自身容器ID MY_ID=$(cat /proc/self/cgroup | grep docker | sed 's/^.*docker\///' | tail -n1 | cut -c1-12) # 持续监听自身的启动事件,触发B重启 docker events --filter "container=$MY_ID" --filter "event=start" | while read -r _; do echo "容器A重启,触发容器B重启..." docker restart "$B_CONTAINER_NAME" done & # 执行原容器启动命令 exec "$@"
- 修改容器A的Dockerfile,把脚本复制进去并设置为入口:
FROM a COPY restart_b.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/restart_b.sh ENTRYPOINT ["restart_b.sh"] # 替换成原容器的CMD,比如原CMD是["app"]就加上这行 CMD ["app"]
这样每次容器A重启,脚本就会触发容器B重启。
方法二:在宿主机上运行监控脚本,监听A的重启事件
如果不想给容器A挂载Docker Socket(存在安全风险),可以在宿主机上跑一个监控脚本:
- 创建一个
monitor_a_restart.sh脚本:
#!/bin/bash # 替换成你的项目名 PROJECT_NAME="your_project_name" A_CONTAINER="${PROJECT_NAME}_a_1" B_CONTAINER="${PROJECT_NAME}_b_1" echo "开始监听容器A的重启事件..." docker events --filter "container=$A_CONTAINER" --filter "event=start" | while read -r _; do echo "检测到容器A重启,重启容器B..." docker restart "$B_CONTAINER" done
给脚本加执行权限:
chmod +x monitor_a_restart.sh可以把这个脚本做成systemd系统服务,确保开机自动运行,避免脚本退出后失效。
注意事项
- 挂载Docker Socket给容器会带来一定安全风险,容器A如果被攻破,攻击者可以直接控制宿主机上的所有容器,生产环境使用要谨慎。
- 如果服务有多个实例,容器名的序号会变化,这种情况可以给容器b加
labels: app=service-b标签,然后用docker restart $(docker ps -q -f label=app=service-b)来定位并重启容器。
内容的提问来源于stack exchange,提问作者user2853467
相关产品推荐
相关产品推荐

