如何在容器内调用docker-compose down实现系统自动关闭?
实现Flask网关触发docker-compose down的方案
1. 在Flask网关中添加SHUTDOWN处理端点
在你的Flask应用里新增一个PUT端点,当收到携带SHUTDOWN内容的请求时,调用subprocess执行docker-compose down命令。注意要指定正确的docker-compose.yml路径(如果不在容器当前工作目录,需加-f参数)。
示例代码:
from flask import Flask, request import subprocess import os app = Flask(__name__) # 权限验证密钥,建议通过环境变量传入,不要硬编码 API_SECRET = os.getenv("SHUTDOWN_API_KEY", "your-strong-random-key") @app.route('/shutdown', methods=['PUT']) def handle_shutdown(): # 先做权限校验 api_key = request.headers.get('X-API-Key') if api_key != API_SECRET: return "Unauthorized", 401 # 检查请求体内容 if request.data.decode('utf-8').strip() != "SHUTDOWN": return "Invalid request content", 400 # 执行docker-compose down命令 try: # 如果yml文件不在当前目录,添加-f参数,比如['docker-compose', '-f', '/app/docker-compose.yml', 'down'] result = subprocess.run( ['docker-compose', 'down'], capture_output=True, text=True, check=True ) return f"System shutdown initiated: {result.stdout}", 200 except subprocess.CalledProcessError as e: return f"Shutdown failed: {e.stderr}", 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
2. 配置容器权限,支持执行docker-compose
容器默认无权操作宿主机Docker服务,需通过挂载宿主机的Docker套接字和docker-compose二进制文件实现:
在你的docker-compose.yml中,给网关服务添加volumes配置:
services: gateway: build: ./gateway ports: - "5000:5000" volumes: # 挂载Docker套接字,让容器能调用宿主机Docker服务 - /var/run/docker.sock:/var/run/docker.sock # 挂载宿主机的docker-compose二进制到容器内 - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose environment: - SHUTDOWN_API_KEY=your-strong-random-key # 传入权限密钥
注意:挂载Docker套接字会让容器获得宿主机root级别的权限,务必做好安全防护。
3. 核心安全提醒
- 强制权限验证:绝对不能开放无认证的shutdown端点,API密钥要设为强随机字符串,且通过环境变量传递,避免硬编码。
- 限制请求来源:可额外添加IP白名单,只允许指定IP访问该端点。
- 日志记录:建议记录每次调用请求的IP、时间、执行结果,方便后续排查问题。
4. 测试验证
用curl发送测试请求:
curl -X PUT -H "X-API-Key: your-strong-random-key" -d "SHUTDOWN" http://localhost:5000/shutdown
发送后检查所有容器是否正常停止。
内容的提问来源于stack exchange,提问作者chrysa
相关产品推荐
相关产品推荐

