首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker镜像中传递docker运行时环境变量

在docker镜像中传递docker运行时环境变量
EN

Stack Overflow用户
提问于 2018-01-11 15:27:30
回答 2查看 15.7K关注 0票数 9

这是我的码头图片。我想覆盖下面从最后提到的docker run命令中传递的默认环境变量

代码语言:javascript
复制
FROM ubuntu:16.04

ADD http://www.nic.funet.fi/pub/mirrors/apache.org/tomcat/tomcat-8/v8.0.48/bin/apache-tomcat-8.0.48.tar.gz /usr/local/
RUN cd /usr/local && tar -zxvf apache-tomcat-8.0.48.tar.gz && rm apache-tomcat-8.0.48.tar.gz
RUN mv /usr/local/apache-tomcat-8.0.48 /usr/local/tomcat
RUN rm -rf /usr/local/tomcat/webapps/*

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV CATALINA_HOME /usr/local/tomcat
ENV CATALINA_BASE /usr/local/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

ENV dummy_url defaulturl
ENV database databasedefault

COPY my.war /usr/local/tomcat/webapps/

RUN echo >> /usr/local/tomcat/conf/test.properties
RUN echo dummy_url =$dummy_url >> /usr/local/tomcat/conf/test.properties
RUN echo database =$database >> /usr/local/tomcat/conf/test.properties

ENTRYPOINT ["catalina.sh", "run"]

要在本地运行:

代码语言:javascript
复制
docker run -p 8080:8080 -e dummy_url=http:google.com -e database=jdbc://mysql allimages/myimage:latest

在我添加的文件- test.properties中,dummy_url和数据库似乎没有被覆盖。任何想法都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-12 01:15:40

我想覆盖下面设置的默认环境变量,不管在最后提到的docker run命令中传递了什么

这意味着在将镜像作为容器(/usr/local/tomcat/conf/test.properties)运行时覆盖镜像文件(docker run),而不是构建镜像(docker build及其--build-args option及其ARG Dockerfile条目)。

这意味着您将在本地创建一个脚本文件,该文件:

这就是:

代码语言:javascript
复制
myscript.sh

#!/bin/sh
echo dummy_url=$dummy_url >> /usr/local/tomcat/conf/test.properties
echo database=$database >> /usr/local/tomcat/conf/test.properties
args=("$@")
catalina.sh run "${args[@]}"

您将修改该脚本的Dockerfile to COPY并将其命名为:

代码语言:javascript
复制
COPY myscript.sh /usr/local/
...
ENTRYPOINT ["/usr/local/myscript.sh"]

然后,也只有到那时,docker run的-e选项才会起作用。

票数 5
EN

Stack Overflow用户

发布于 2018-01-11 16:26:02

您混淆了构建镜像时执行的内容和启动容器时执行的内容。运行docker build ...时,构建镜像时会执行dockerfile中的RUN命令

代码语言:javascript
复制
RUN echo dummy_url =$dummy_url >> /usr/local/tomcat/conf/test.properties
RUN echo database =$database >> /usr/local/tomcat/conf/test.properties

因此,当执行上面的代码时,文件test.properties将包含Dockerfile文件中指定的默认值。

当您执行docker run -p 8080:8080 -e dummy_url=http:google.com -e database=jdbc://mysql allimages/myimage:latest时,将使用env值dummy_url=http:google.comdatabase=jdbc://mysql来执行ENTRYPOINT ["catalina.sh", "run"]

您可以使用以下命令来允许test.properties中的值为ovveriden:

  1. $dummy_url >> /usr/local/tomcat/conf/test.properties$database >> /usr/local/tomcat/conf/test.properties移到catalina.sh脚本的开头。

构建镜像时,

  1. 会覆盖这些值:

代码语言:javascript
复制
ARG dummy_url_arg
ARG database_arg

ENV dummy_url $dummy_url_arg
ENV database $database_arg

COPY my.war /usr/local/tomcat/webapps/

RUN echo >> /usr/local/tomcat/conf/test.properties
RUN echo dummy_url =$dummy_url >> /usr/local/tomcat/conf/test.properties
RUN echo database =$database >> /usr/local/tomcat/conf/test.properties

ENTRYPOINT ["catalina.sh", "run"]

构建时,图像使用docker build --build-arg dummy_url_arg=http:google.com --build-arg database_arg=jdbc://mysql allimages/myimage:latest ...覆盖这些值

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48201823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档