Docker CLI env var 值覆盖在启动时不受容器尊重

标签 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://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 环境变量的值。但是,当我运行以下命令时:

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

不考虑命令行上提供的覆盖值,并使用默认值“local”。

我使用的是 Docker 1.7.0。

如果您对 Tomcat 了解一点,您会发现我在尝试为管理器 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"

您正在运行时更改此变量,但此时已经创建了 setenv.sh 并且环境设置为本地

如果您想在运行时更改环境,则不应将变量 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 CLI env var 值覆盖在启动时不受容器尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31308517/

相关文章:

docker - docker-compose 可以在具有离散端口的服务之间共享 ip 吗?

Azure 混合 worker Docker

node.js - docker容器无法连接到本地主机mongodb

python - 在反向代理(traefik)后面使用 phyton 的 http.server 时获取 '404'

docker - 如何通过Dockerfile中的脚本动态设置环境变量?

docker-compose up 不构建

java - docker中带有参数的jar文件

docker - 如何在 Dockerfile CMD 中使用变量?

php - 使用自定义构建环境插件时对Dockerfile的权限被拒绝

mongodb - 使用 Docker-Compose 在 MongoDB 上导入数据