You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker容器中异步执行Angular的ng build与ng lint命令,实现任一命令失败即终止所有进程?

异步执行Angular构建与Lint,任一失败即终止所有进程

这个需求太贴合实际了——既要并行执行节省时间,又不能让失败的环节被忽略,毕竟没人想发布lint不通过的代码。下面几个方案都能解决你的问题,你可以根据自己的Docker环境来选:

方案1:用Bash脚本监控进程(最通用,无额外依赖)

大多数Docker镜像默认带Bash,所以这个方案不需要额外安装工具,直接写个小脚本就行:

#!/bin/bash

# 后台启动两个命令,记录各自的进程ID
ng build --prod &
BUILD_PID=$!
ng lint &
LINT_PID=$!

# 定义清理函数:杀掉所有后台进程,避免残留
cleanup() {
  kill $BUILD_PID $LINT_PID 2>/dev/null
}

# 设置陷阱:当脚本收到退出信号时自动执行清理
trap cleanup EXIT

# 等待第一个完成的进程,获取它的退出码
wait -n $BUILD_PID $LINT_PID
EXIT_CODE=$?

# 如果第一个结束的进程失败了,直接退出(陷阱会自动杀掉另一个进程)
if [ $EXIT_CODE -ne 0 ]; then
  echo "⚠️  其中一个命令执行失败,正在终止所有相关进程..."
  exit $EXIT_CODE
fi

# 等剩下的进程完成,确保两个命令都成功
wait $BUILD_PID $LINT_PID
EXIT_CODE=$?

exit $EXIT_CODE

把这个脚本存成run-commands.sh,在Docker里执行bash run-commands.sh就行。它的逻辑是:

  • 同时启动构建和Lint任务
  • 一旦其中一个任务失败,立刻终止另一个
  • 只有两个任务都成功,脚本才会返回成功码

方案2:用GNU Parallel工具(简洁但需要额外安装)

如果你的Docker镜像可以安装GNU Parallel,那这个命令会非常简洁:

parallel --halt now,fail=1 ::: "ng build --prod" "ng lint"

--halt now,fail=1的意思是:只要有一个任务失败,立刻停止所有正在运行的任务

要在Docker里用这个工具,需要先安装它,比如在Debian/Ubuntu系的镜像里加:

RUN apt-get update && apt-get install -y --no-install-recommends parallel && rm -rf /var/lib/apt/lists/*

方案3:用Node.js脚本(适合已有Node环境的项目)

因为是Angular项目,肯定有Node环境,所以也可以写个Node脚本来控制进程:

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

// 启动构建进程,继承控制台输出
const build = spawn('ng', ['build', '--prod'], { stdio: 'inherit' });
// 启动Lint进程,继承控制台输出
const lint = spawn('ng', ['lint'], { stdio: 'inherit' });

// 处理进程退出的逻辑
const handleFailure = (failedCode, processToKill) => {
  if (failedCode !== 0) {
    console.log(`❌  命令执行失败(退出码:${failedCode}),正在终止另一个进程...`);
    processToKill.kill();
    process.exit(failedCode);
  }
};

// 监听构建进程的退出事件
build.on('exit', (code) => handleFailure(code, lint));
// 监听Lint进程的退出事件
lint.on('exit', (code) => handleFailure(code, build));

// 监听用户中断(比如Ctrl+C),清理子进程
process.on('SIGINT', () => {
  build.kill();
  lint.kill();
  process.exit(0);
});

把这个脚本存成run-parallel.js,在Docker里执行node run-parallel.js即可。这个方案不需要依赖额外的Shell工具,完全用Node生态解决问题。


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

火山引擎 最新活动