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

