Dockerfile运行时传递version参数无法替换JMX文件名问题咨询
问题根因
- Dockerfile 未显式声明
VERSION等运行时环境变量,且当前 CMD 的命令形式容易导致变量解析时机异常,无法正确读取运行时注入的参数值 - 构建阶段定义的
ARG version等参数与运行时注入的环境变量属于完全独立的上下文,二者混淆也会导致取值异常
修复步骤
1. 修改 Dockerfile 配置
删除无用的构建阶段参数,新增环境变量声明,同时修改 CMD 为显式 shell 执行形式,确保变量在容器运行时被正确解析:
FROM alpine:3.12 # 删除原有无用的构建参数:environmentName、threadUsers、rampUpPeriod、loopCount、version ARG JMETER_VERSION="5.4.1" ENV JMETER_HOME /opt/apache-jmeter-${JMETER_VERSION} ENV JMETER_BIN ${JMETER_HOME}/bin ENV JMETER_DOWNLOAD_URL https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz # 新增运行时环境变量声明,可设置默认值,docker run 传-e参数会覆盖默认值 ENV ENVIRONMENTNAME="" ENV THREADUSERS="" ENV RAMPUPPERIOD="" ENV LOOPCOUNT="" ENV VERSION="" # Install extra packages ARG TZ="Asia/Kolkata" ENV TZ ${TZ} RUN apk update \ && apk upgrade \ && apk add ca-certificates \ && update-ca-certificates \ && apk add --update openjdk8-jre tzdata curl unzip bash \ && apk add --no-cache nss \ && rm -rf /var/cache/apk/* \ && mkdir -p /tmp/dependencies \ && curl -L --silent ${JMETER_DOWNLOAD_URL} > /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz \ && mkdir -p /opt \ && tar -xzf /tmp/dependencies/apache-jmeter-${JMETER_VERSION}.tgz -C /opt \ && rm -rf /tmp/dependencies ENV PATH $PATH:$JMETER_BIN WORKDIR ${JMETER_HOME} # 修改CMD为显式shell执行形式,确保变量运行时解析 CMD ["sh", "-c", "sh /opt/apache-jmeter-5.4.1/bin/entrypoint.sh && jmeter -JCookieManager.save.cookies=true -JEnvName=${ENVIRONMENTNAME} -JthreadUsers=${THREADUSERS} -JrampUpPeriod=${RAMPUPPERIOD} -JloopCount=${LOOPCOUNT} -n -t /opt/apache-jmeter-5.4.1/bin/API${VERSION}Name.jmx -l /opt/apache-jmeter-5.4.1/bin/demoresults.jtl -e -o /opt/apache-jmeter-5.4.1/bin/demoresults -f"]
2. 验证启动脚本参数
执行sh脚本时确保传入了第五个version参数,示例调用方式:
./你的脚本名.sh 环境名 线程数 爬升时间 循环次数 5
其中最后一个参数5就是version的取值,会通过docker run -e注入到容器内。
可选调试方案
如果仍有问题,可以在CMD开头加入变量打印命令,运行容器后查看日志确认参数是否正确注入:
CMD ["sh", "-c", "echo VERSION取值为: ${VERSION} && sh /opt/apache-jmeter-5.4.1/bin/entrypoint.sh && jmeter -JCookieManager.save.cookies=true -JEnvName=${ENVIRONMENTNAME} -JthreadUsers=${THREADUSERS} -JrampUpPeriod=${RAMPUPPERIOD} -JloopCount=${LOOPCOUNT} -n -t /opt/apache-jmeter-5.4.1/bin/API${VERSION}Name.jmx -l /opt/apache-jmeter-5.4.1/bin/demoresults.jtl -e -o /opt/apache-jmeter-5.4.1/bin/demoresults -f"]
内容的提问来源于stack exchange,提问作者benevolent
相关产品推荐
相关产品推荐

