容器在启动时不遵守Docker CLI环境变量值覆盖

容器在启动时不遵守Docker CLI环境变量值覆盖,docker,dockerfile,Docker,Dockerfile,我正在使用下面的Dockerfile构建一个映像。图像编译得很好 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:/

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

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"]
不考虑命令行上提供的重写值,使用默认值“local”

我正在使用Docker 1.7.0

如果您对Tomcat稍有了解,您会发现我在尝试建立Manager UI的登录名,并尝试组装setenv.sh文件,而不添加文件系统中的文件。也许我应该用另一种方式来做——如果你知道一种“更好”的方式,请教育我。我问这个问题的目的是要尊重这个变量的运行时覆盖设置


提前感谢。

在构建期间使用
TOMCAT_ENV
环境变量来创建
setenv.sh
。它看起来像这样:

ATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv=local -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties"
CATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv$TOMCAT_ENV -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties"
您正在运行时更改此变量,但此时已创建了
setenv.sh
,并且环境设置为
local

如果要在运行时更改环境,则不应将变量
TOMCAT_ENV
的值写入
setenv.sh
,而应写入对该变量的引用。您可以通过在Dockerfile中转义变量来实现这一点,方法是在
\$TOMCAT\u ENV
前面加一个斜杠到
\$TOMCAT\u 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
如下所示:

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

谢谢你找到我明显遗漏的东西。给将来读到这篇文章的人的便条;
setenv.sh
仍将包含
$TOMCAT_ENV
变量。使用
ps
检查过程,它将显示正确的插值。