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

justb4/jmeter容器Bash入口脚本报错:找不到bash及语法错误

Docker Compose部署JMeter等待AWS CLI下载完成时的脚本错误排查

问题场景

我通过Docker Compose部署justb4/jmeter服务,业务逻辑是让aws-cli容器先下载JMX测试文件,JMeter容器需等待下载完成后再执行测试。我采用共享卷中的标识文件实现等待逻辑:aws-cli下载完成后在共享卷创建download_done.txt,JMeter容器通过while循环检测该文件是否存在,待文件出现后再运行JMeter测试。

报错信息

JMeter容器的Bash入口脚本运行失败,出现以下错误:

  • #!/bin/bash: not found
  • syntax error: unexpected end of file (expecting "do")

现有配置文件

Docker Compose配置

services:
  jmeterclidemo:
    image: ${DOCKER_REGISTRY-}jmeterclidemo
    build:
      context: .
      dockerfile: JmeterCLIDemo/Dockerfile
    ports:
      - "5001:80"
      - "5000:443"
  awscli:
    image: amazon/aws-cli:latest
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
    entrypoint: /app/aws-script/entrypoint.sh
    volumes:
      - ./aws-script:/app/aws-script
      - test-scripts:/app/test-scripts
      - results:/app/results
      - flag:/app/flag

  jmeter:
    image: justb4/jmeter:latest
    volumes: 
      - test-scripts:/jmeter/test-scripts
      - results:/jmeter/results
      - flag:/jmeter/flag
      #- ./test-scripts:/jmeter/test-scripts
      - ./results:/jmeter/results
    entrypoint: ["sh", "-c","/jmeter/test-scripts/entrypoint.sh"]
    depends_on: 
      - jmeterclidemo
      - awscli

JMeter入口脚本

#!/bin/bash
echo "execution started"
while [ ! -e "/app/flag/download_done.txt" ];
do
    :
done;

jmeter -n -t /jmeter/test-scripts/TestFileGet.jmx -l /jmeter/results/TestFileGetByID-detail.jtl 
echo "execution completed successfully."

touch "/app/flag/upload_start.txt"
exit 0;

问题修复方案

1. 换行符问题导致#!/bin/bash: not found

脚本如果是在Windows环境下编辑的,会带有CRLF换行符,而Linux容器仅识别LF换行符,导致shebang行被误解析。

  • 修复:将脚本转换为UNIX LF换行符。可以用Notepad++的「编辑→行尾符→UNIX(LF)」选项修改,或在Linux终端执行dos2unix entrypoint.sh转换。

2. 路径错误(核心问题)

脚本中写的/app/flag/download_done.txt路径有误:JMeter容器的flag卷挂载路径是/jmeter/flag,而非/app/flag,这会导致循环永远无法检测到文件,同时可能触发语法解析错误。

  • 修复:将脚本中所有/app/flag/替换为/jmeter/flag/,修正后的脚本:
#!/bin/bash
echo "execution started"
while [ ! -e "/jmeter/flag/download_done.txt" ];
do
    sleep 2  # 加入延迟,避免频繁检测占用资源
done;

jmeter -n -t /jmeter/test-scripts/TestFileGet.jmx -l /jmeter/results/TestFileGetByID-detail.jtl 
echo "execution completed successfully."

touch "/jmeter/flag/upload_start.txt"
exit 0;

3. 脚本执行权限问题

如果容器内脚本没有执行权限,也会导致运行失败。

  • 修复:给本地脚本添加执行权限:chmod +x entrypoint.sh;或者修改Docker Compose的entrypoint,临时赋予权限后再执行:
entrypoint: ["sh", "-c", "chmod +x /jmeter/test-scripts/entrypoint.sh && /jmeter/test-scripts/entrypoint.sh"]

4. 循环语法优化

原循环用:作为空指令,建议加入sleep延迟,减少CPU占用,如上面修正后的脚本所示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:44:58