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

时间:2018-01-11 07:27:30

标签: docker dockerfile

这是我的码头图片。我想覆盖下面设置的默认环境变量,这些变量来自最后提到的docker run命令中传递的内容

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"]

在本地运行:

docker run -p 8080:8080 -e dummy_url=http:google.com -e database=jdbc://mysql allimages/myimage:latest

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

2 个答案:

答案 0 :(得分:3)

  

我想覆盖下面设置的默认环境变量,这些变量是在最后提到的docker run命令中传递的内容

这意味着当运行图像作为容器(docker run),而不是构建图像时,覆盖图像文件(PowerShell -ExecutionPolicy Bypass -File)( docker build及其--build-args option及其ARG Dockerfile条目。

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

那是:

catalina.sh run $@

您可以修改该Dockerfile to COPY该脚本并将其调用:

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[@]}"

然后,只有这样,才能运行docker run的COPY myscript.sh /usr/local/ ... ENTRYPOINT ["/usr/local/myscript.sh"] 选项。

答案 1 :(得分:2)

您在构建映像时执行的操作以及启动容器时执行的操作会让您感到困惑。 在构建映像时,在运行RUN时执行dockerfile中的docker build ...命令

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时,ENTRYPOINT ["catalina.sh", "run"]将被执行 环境价值dummy_url=http:google.comdatabase=jdbc://mysql

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

  1. $dummy_url >> /usr/local/tomcat/conf/test.properties$database >> /usr/local/tomcat/conf/test.properties移至catalina.sh脚本的开头。
    1. 在构建图像时覆盖值:
    2. 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 ...

      覆盖值