Docker 启动时容器不考虑 CLI 环境变量值覆盖
Docker CLI env var value override not respected by container on startup
我正在使用以下 Docker 文件构建映像。图像编译得很好。
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"]
当我运行镜像时,我经常want/need更改dockerfile中声明的TOMCAT_ENV环境变量的值。但是,当我 运行 命令如:
docker run -p 8080:8080 -d -e TOMCAT_ENV=dev --name tc tomcat
不遵守命令行中提供的覆盖值,使用默认值 "local"。
我正在使用 Docker 1.7.0.
如果您对 Tomcat 了解一点,您会发现我有点笨拙地尝试为管理员 UI 建立登录名,并尝试 assemble setenv.sh 文件而不从文件系统添加文件。也许我应该用不同的方式来做这件事——如果你知道 "better" 的方式,请告诉我。我问这个问题的目的是要遵守此变量的 运行时间覆盖设置。
提前致谢。
TOMCAT_ENV
环境变量在构建期间用于创建 setenv.sh
。它看起来像这样:
ATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv=local -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties"
您正在运行时更改此变量,但此时 setenv.sh
已经创建并且环境设置为 local
。
如果您想在运行时更改环境,您不应将变量 TOMCAT_ENV
的值写入 setenv.sh
,而是对变量的引用。您可以通过在 $TOMCAT_ENV
前加上斜杠 $TOMCAT_ENV
:
来转义 Dockerfile 中的变量来做到这一点
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"
我正在使用以下 Docker 文件构建映像。图像编译得很好。
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"]
当我运行镜像时,我经常want/need更改dockerfile中声明的TOMCAT_ENV环境变量的值。但是,当我 运行 命令如:
docker run -p 8080:8080 -d -e TOMCAT_ENV=dev --name tc tomcat
不遵守命令行中提供的覆盖值,使用默认值 "local"。
我正在使用 Docker 1.7.0.
如果您对 Tomcat 了解一点,您会发现我有点笨拙地尝试为管理员 UI 建立登录名,并尝试 assemble setenv.sh 文件而不从文件系统添加文件。也许我应该用不同的方式来做这件事——如果你知道 "better" 的方式,请告诉我。我问这个问题的目的是要遵守此变量的 运行时间覆盖设置。
提前致谢。
TOMCAT_ENV
环境变量在构建期间用于创建 setenv.sh
。它看起来像这样:
ATALINA_OPTS="$CATALINA_OPTS -Xms512m -Xmx1024m -Denv=local -Dlogging_override=file:///logging_override.xml -Doverride_file=/override.properties"
您正在运行时更改此变量,但此时 setenv.sh
已经创建并且环境设置为 local
。
如果您想在运行时更改环境,您不应将变量 TOMCAT_ENV
的值写入 setenv.sh
,而是对变量的引用。您可以通过在 $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"