Python通过subprocess调用Docker Redis实现Flask接口锁机制

Aria
Aria
发布时间:2026-10-14| 5人浏览过
原创

本文详解如何利用Python的subprocess模块在Flask框架中操作Docker容器内的Redis。通过封装命令执行函数,实现获取、设置及删除Redis键值对的功能,进而构建接口级别的加锁与解锁逻辑。重点解析了docker exec命令中-it参数的潜在风险,确保后台服务稳定运行。

利用subprocess模块执行Docker命令

在Python中操作Docker容器内的Redis,可以通过subprocess模块执行系统命令来实现。该模块允许程序调用外部命令并获取输出结果,是连接Python应用与容器化基础设施的桥梁。

命令执行函数封装


#encoding:utf-8
import subprocess
def cmd(command):
  subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
  subp.wait(2)
  if subp.poll() == 0:
    return subp.communicate()
  else:
    return None
获取redis键所对应的值

def get_output(command):
  subp = subprocess.getoutput(command)
  return subp

Flask接口获取Redis数据

在Flask框架中,可以通过定义路由接口来获取Docker容器内Redis存储的键值对。具体实现中,接收前端传入的参数,构造对应的docker exec命令,调用封装好的命令执行函数,从Redis中读取指定key的值,并返回相应的状态信息。

获取键值对接口实现


@ui_case_set.route("/get_code", methods=["GET"])
@allow_cross_domain
def get_code():
  set_id = request.values.get("id")
  if not set_id:
    return response_fail(msg="缺少参数用例集id")
  key_name = "key" + str(set_id)
  value_name = get_output("docker exec {0} redis-cli get {1}".format(DockerConfig.container_redis_name, key_name))
  if value_name:
    return response_fail(msg="此测试集正被{}编辑!".format("金刚"))
  else:
    return response_success(msg="可以进行编辑!")

Flask接口增删Redis数据

除了读取,Flask接口还需支持对Docker内Redis键值对的增加与删除操作,常用于实现资源锁机制。当需要上锁时,获取当前时间并设置过期时间存入Redis;当需要解锁时,直接删除对应的key。这些操作均通过subprocess调用redis-cli命令完成,确保状态同步。

加锁与解锁接口实现


@ui_case_set.route("/time_limit", methods=["POST"])
@allow_cross_domain
def set_time():
  # lock:为1:上锁, 为0时: 解锁
  set_id = request.json.get("id")
  locak = request.json.get("lock")
  # if not all([set_id, locak]):
  #   return response_fail(msg="参数不足")
  key_name = "key" + str(set_id)
  if locak == 1:
    value_name = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
    cmd("docker exec {0} redis-cli setex {1} 300 '{2}'".format(DockerConfig.container_redis_name, key_name, value_name))
    return response_success(content={"lock_status": 1}, msg="测试集{}上锁成功".format(set_id))
  else:
    cmd("docker exec {0} redis-cli del {1}".format(DockerConfig.container_redis_name, key_name))
    return response_success(content={"lock_status": 0}, msg="测试集{}解锁成功".format(set_id))

注意事项:避免使用-it参数

在调用docker exec命令时,务必避免使用“-it”参数。例如,执行“docker exec -it [容器名] redis-cli set key value”时,若加上“-it”,命令会尝试开启一个交互模式的终端。这在前台手动运行时可能正常,但在Python程序后台自动运行时会导致失败或挂起,因为后台进程无法提供交互所需的终端环境。

通过上述方法,可以在Python后端稳定地管理Docker容器中的Redis资源,实现接口级别的并发控制。正确理解并规避命令执行中的交互参数陷阱,是保证自动化脚本稳定运行的关键。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。