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

如何通过Node.js子进程获取Docker中MySQL的执行结果?

使用Node.js子进程获取MySQL容器的输出结果

前提准备

假设你已具备:

  • 定义MySQL容器的Dockerfile
  • 示例SQL脚本backup.sql
  • 原有的Shell命令执行流程(如启动容器、执行SQL、导出结果等)

实现方案

1. 导入内置模块

直接使用Node.js内置的child_process模块,无需额外安装依赖。

2. 核心实现示例

以下是几种常见场景的代码实现:

场景1:启动容器并执行SQL脚本,捕获执行结果

const { exec } = require('child_process');

// 替换为你的实际命令,比如启动容器并执行backup.sql
const execCmd = `docker exec -i your-mysql-container mysql -u root -pyour-password < backup.sql`;

exec(execCmd, (error, stdout, stderr) => {
  if (error) {
    console.error(`执行失败: ${error.message}`);
    return;
  }
  if (stderr) {
    console.error(`MySQL错误输出: ${stderr}`);
    return;
  }
  console.log(`SQL执行结果:\n${stdout}`);
});

场景2:执行MySQL查询并捕获输出

比如导出某个表的查询结果:

const { exec } = require('child_process');

const queryCmd = `docker exec your-mysql-container mysql -u root -pyour-password -e "SELECT * FROM your_db.your_table;"`;

exec(queryCmd, (error, stdout, stderr) => {
  if (error) {
    console.error(`命令执行出错: ${error.stack}`);
    return;
  }
  if (stderr) {
    console.error(`MySQL错误信息: ${stderr}`);
    return;
  }
  console.log(`查询结果:\n${stdout}`);
});

场景3:Promise风格实现(推荐,适配异步流程)

用util.promisify将exec转换为Promise形式,更贴合现代异步代码写法:

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);

async function fetchMysqlData() {
  try {
    const { stdout, stderr } = await execPromise(`docker exec your-mysql-container mysql -u root -pyour-password -e "SHOW DATABASES;"`);
    if (stderr) {
      console.error(`错误输出: ${stderr}`);
    }
    console.log(`数据库列表:\n${stdout}`);
  } catch (error) {
    console.error(`执行出错: ${error.message}`);
  }
}

fetchMysqlData();

3. 安全与优化提示

  • 避免硬编码密码,改用环境变量传递:-p${process.env.MYSQL_PASSWORD}
  • 若命令含特殊字符,建议用execFile拆分参数,避免命令注入风险:
const { execFile } = require('child_process');

execFile('docker', [
  'exec',
  'your-mysql-container',
  'mysql',
  '-u', 'root',
  `-p${process.env.MYSQL_PASSWORD}`,
  '-e', 'SELECT * FROM your_db.your_table;'
], (error, stdout, stderr) => {
  if (error) {
    console.error(`执行失败: ${error.message}`);
    return;
  }
  console.log(`查询结果:\n${stdout}`);
});

内容的提问来源于stack exchange,提问作者Amelia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:15