在启动时,容器没有遵守Docker CLI env var value覆盖

我正在使用下面的Dockerfile来构build一个图像。 图像编译得很好。

FROM java:8u40-jdk ENV CATALINA_HOME="/usr/local/tomcat" ENV PATH=$CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOME ENV TOMCAT_MAJOR 8 ENV TOMCAT_VERSION 8.0.20 ENV TOMCAT_DL_URL http://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz ENV TOMCAT_ENV local RUN set -x \ && curl -fSL "$TOMCAT_DL_URL" -o tomcat.tar.gz \ && tar -xvf tomcat.tar.gz --strip-components=1 \ && rm bin/*.bat \ && rm tomcat.tar.gz ### remove the closing tag, then use the echo|tee pattern to build it back in RUN sed -i 's|</tomcat-users>| |' $CATALINA_HOME/conf/tomcat-users.xml RUN echo "<role rolename=\"admin\" />" | tee -a $CATALINA_HOME/conf/tomcat-users.xml \ && echo "<user username=\"${MANAGER_USER:-admin}\" password=\"${MANAGER_PW:-password}\" roles=\"standard,manager,admin,admin-gui,manager-gui,manager-status,manager-script\"/>" | tee -a $CATALINA_HOME/conf/tomcat-users.xml \ && echo "</tomcat-users>" | tee -a $CATALINA_HOME/conf/tomcat-users.xml ### setup setenv.sh RUN echo "CATALINA_PID=\"\$CATALINA_HOME/bin/catalina.pid\"" | tee $CATALINA_HOME/bin/setenv.sh RUN echo "CATALINA_OPTS=\"\$CATALINA_OPTS -Xms512m -Xmx1024m -Denv=$TOMCAT_ENV \ -Dlogging_override=file://$CATALINA_HOME/logging_override.xml \ -Doverride_file=$CATALINA_HOME/override.properties\"" | \ tee -a $CATALINA_HOME/bin/setenv.sh \ && chmod 755 $CATALINA_HOME/bin/setenv.sh EXPOSE 8080 CMD ["catalina.sh", "run"] 

当我运行图像时,我经常需要/需要更改在dockerfile中声明的TOMCAT_ENV环境variables的值。 但是,当我运行一个命令如:

 docker run -p 8080:8080 -d -e TOMCAT_ENV=dev --name tc tomcat 

在命令行上提供的重写值不受尊重,并使用默认值“local”。

我使用的是Docker 1.7.0。

如果你对Tomcat有一点了解,你可以看到我有点笨拙的试图build立一个Manager UI的login,并试图组装一个setenv.sh文件,而不用从文件系统添加一个文件。 也许我应该以不同的方式来做 – 如果你意识到“更好”的方式,请教育我。 我问这个问题的目标是要尊重这个variables的运行时覆盖设置。

提前致谢。

TOMCAT_ENV使用TOMCAT_ENV环境variables来创buildsetenv.sh 。 它看起来像这样:

 ATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv=local -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties" 

您正在运行时更改此variables,但此时已创buildsetenv.sh ,并将环境设置为local

如果您想在运行时更改环境,则不应将variablesTOMCAT_ENV的值写入TOMCAT_ENV ,而应该写入variables的引用。 你可以通过在$TOMCAT_ENV预先写入$TOMCAT_ENV来转义你的Dockerfile中的variables来完成这个\$TOMCAT_ENV\$TOMCAT_ENV

 RUN echo "CATALINA_OPTS=\"\$CATALINA_OPTS -Xms512m -Xmx1024m - Denv=\$TOMCAT_ENV \ -Dlogging_override=file://$CATALINA_HOME/logging_override.xml \ -Doverride_file=$CATALINA_HOME/override.properties\"" | \ tee -a $CATALINA_HOME/bin/setenv.sh \ && chmod 755 $CATALINA_HOME/bin/setenv.sh 

现在你的setenv.sh看起来像这样:

 CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv$TOMCAT_ENV -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties"