首页 > 解决方案 > 将参数传递给 dockerfile

问题描述

我在将参数从 shell 脚本文件传递给 docker 文件时遇到问题。.
PFB buils.sh 文件和 dokefile。
构建.sh

"environmentName=$1
threadUser=$2
rampUpPeriod=$3
loopCount=$4

echo ${environmentName}
echo ${threadUser}
echo ${rampUpPeriod}
echo ${loopCount}
docker build --build-arg environmentName=${environmentName} --build-arg threadUsers=${threadUser} --build-arg rampupPeriod=${rampUpPeriod} --build-arg environmentName=${loopCount} -t jmeterimage -f Dockerfile.txt .
docker run -d --name jmimages -t jmeterimage"

dockerfile

"FROM alpine:3.12

ARG environmentName
ARG threadUsers
ARG rampUpPeriod
ARG loopCount

RUN echo ${environmentName}
RUN echo ${threadUsers}
RUN echo ${rampUpPeriod}
RUN echo ${loopCount}

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
ENV ENVIRONMENTNAME=${environmentName}
ENV THREADUSERS=${threadUsers}
ENV RAMPUPPERIOD=${rampUpPeriod}
ENV LOOPCOUNT=${loopCount}

# Install extra packages
# Set TimeZone, See: https://github.com/gliderlabs/docker-alpine/issues/136#issuecomment-612751142
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

# TODO: plugins (later)
# && unzip -oq "/tmp/dependencies/JMeterPlugins-*.zip" -d $JMETER_HOME
RUN mkdir -p jmeterpackage
ADD API1.jmx  /opt/apache-jmeter-5.4.1/bin
ADD API2.jmx /opt/apache-jmeter-5.4.1/bin
ADD entrypoint.sh /opt/apache-jmeter-5.4.1/bin

RUN echo ${ENVIRONMENTNAME}
RUN echo ${RAMPUPPERIOD}
RUN echo ${THREADUSERS}
RUN echo ${LOOPCOUNT}


# Set global PATH such that "jmeter" command is found
ENV PATH $PATH:$JMETER_BIN

# Entrypoint has same signature as "jmeter" command

WORKDIR ${JMETER_HOME}
CMD 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/API1.jmx -l /opt/apache-jmeter-5.4.1/bin/demoresults.jtl -e -o /opt/apache-jmeter-5.4.1/bin/demoresults -f"

sh build.sh stg 3 2 1 - 这是我用来运行 shell 脚本的命令。
当我将值stg传递给 dockerfile 时,它​​变为 1 并且第二个参数被正确传递。第三和第四个参数作为空白传递。下面是我得到的日志。

"#6 [ 2/15] RUN echo 1
#6 sha256:c73ec3a806b043a5f29ece2762a7861c5a67361cc3db219b24b1c25fc2844d90
#6 0.150 1
#6 DONE 0.2s

#7 [ 3/15] RUN echo 3
#7 sha256:fde70880b2cd7fd755fd87cfbb0d60f43830f4b7419312547bfec1348437d233
#7 0.163 3
#7 DONE 0.2s

#8 [ 4/15] RUN echo ${rampUpPeriod}
#8 sha256:683be9c5c76e083af4d6499440d369767a546e876d6bcda945c9b68cf60f55ee
#8 0.205
#8 DONE 0.2s

#9 [ 5/15] RUN echo ${loopCount}
#9 sha256:f11f49c49c273bdbcd1e0dcbe4944a2bd0874ffd6b52a3fd8c4dd45092b00d44
#9 0.207
#9 DONE 0.2s
"

标签: dockerjmeter

解决方案


您的构建命令中有两个小问题:

--build-arg rampupPeriod=${rampUpPeriod} 
--build-arg environmentName=${loopCount}
  • 参数区分大小写。所以rampupPeriod必须rampUpPeriod
  • 您使用了错误的变量名loopCount

推荐阅读