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
相关产品推荐
相关产品推荐

