这是我的码头图片。我想覆盖下面设置的默认环境变量,这些变量来自最后提到的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。任何想法都将不胜感激。
答案 0 :(得分:3)
我想覆盖下面设置的默认环境变量,这些变量是在最后提到的docker run命令中传递的内容
这意味着当运行图像作为容器(docker run
),而不是构建图像时,覆盖图像文件(PowerShell -ExecutionPolicy Bypass -File
)( docker build
及其--build-args
option及其ARG
Dockerfile条目。
这意味着您在本地创建了一个脚本文件:
/usr/local/tomcat/conf/test.properties
/usr/local/tomcat/conf/test.properties
(另请参阅" Store Bash script arguments $@ in a variable"来自" Accessing bash command line args $@
vs $*
")那是:
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.com
和database=jdbc://mysql
。
您可以使用以下命令允许test.properties中的值为ovveriden:
$dummy_url >> /usr/local/tomcat/conf/test.properties
和$database >> /usr/local/tomcat/conf/test.properties
移至catalina.sh
脚本的开头。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 ...