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

Dockerfile无法运行Bash脚本,k6并行执行任务失效求助

解决方案

一、解决Bash未找到的问题

loadimpact/k6镜像基于Alpine Linux,默认未预装bash。同时原Dockerfile用RUN执行脚本是错误逻辑(RUN是构建阶段命令,测试任务应在容器启动时执行),修改后的Dockerfile如下:

FROM loadimpact/k6:0.34.1
# 安装bash
RUN apk add --no-cache bash
COPY ./src/lib /lib
COPY ./src/scenarios /scenarios
COPY ./src/k6-run-all.sh /k6-run-all.sh
# 给脚本添加执行权限
RUN chmod +x /k6-run-all.sh
WORKDIR /
ENTRYPOINT []
# 容器启动时用bash执行脚本
CMD ["bash", "/k6-run-all.sh"]

二、解决并行执行失效的问题

脚本存在缺少bash声明、循环逻辑错误、未等待后台进程、退出码收集不正确等问题,修改后的完整脚本:

#!/bin/bash
K6_RUN_OPTIONS=${K6_RUN_OPTIONS}
ENV_NAME=${ENV_NAME:-qa}
IS_TEST_RUN=${IS_TEST_RUN:-true}
SCENARIO_NAME=${SCENARIO_NAME:-"full-card-visa"}
GWC_PC_ID=${GWC_PC_ID}

OPTIONS_VARIANT=""
if $IS_TEST_RUN; then
   OPTIONS_VARIANT="-test"
fi

SCENARIO_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
SCENARIO_PATH="${SCENARIO_DIR}/scenarios"
SCENARIO="${SCENARIO_PATH}/${SCENARIO_NAME}"
echo "Executing scenario path $SCENARIO"

SCENARIO_NAME=${SCENARIO:${#SCENARIO_PATH}+1:${#SCENARIO}}
echo "Scenario Name: $SCENARIO_NAME"
echo "Run option: $SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT"

echo "pc ids provided in environment variable=" $GWC_PC_ID

# 初始化全局退出码
exit_code=0

if [ -z "$GWC_PC_ID" ]
then
   ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT k6 run $K6_RUN_OPTIONS "$SCENARIO/index.js"
   exit_code=$?
else
   # 用bash原生语法分割逗号字符串为数组,避免空格解析错误
   IFS=',' read -r -a PCIds <<< "$GWC_PC_ID"
   echo "Number of PC ids provided: ${#PCIds[@]}"

   # 遍历数组并行执行k6任务
   for pcId in "${PCIds[@]}"
   do
      ENV_NAME=$ENV_NAME RUN_OPTIONS=$SCENARIO_NAME-$ENV_NAME$OPTIONS_VARIANT GWC_PC_ID=$pcId k6 run $K6_RUN_OPTIONS "$SCENARIO/index.js" &
   done

   # 等待所有后台进程执行完成
   wait
   # 获取最后一个后台进程的退出码,若需检查所有进程可扩展逻辑
   exit_code=$?
fi

if [ $exit_code -ne 0 ]; then
   echo "Scenario $SCENARIO_NAME completed with error"
   exit $exit_code
fi
echo "All scenarios completed successfully"

关键修改说明:

  • 恢复#!/bin/bash开头,强制指定bash解释器
  • 改用bash原生的IFS分割语法处理逗号字符串,避免tr命令导致的空格解析问题
  • 添加wait命令,确保容器等待所有并行任务结束后再退出
  • 统一变量引用的引号格式,避免特殊字符解析错误
  • 优化退出码收集逻辑,确保任务失败时容器返回正确错误状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:30:55