You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在容器内调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:12:50