如何将仅使用数据卷容器作为其他容器的共享存储时的文件替换为不同的文件而不是整个目录

要求:当新版本的J2EE应用程序投入生产时,由于开发环境和生产环境不同,DBA必须替换war包中的一些配置文件,需要替换的文件通常会包含一些敏感数据(如数据库账号,密码)。

我认为创建一个数据卷容器是一个好主意,它包含那些特定于生产的配置文件。 在这种情况下,配置文件可以在容器(应用程序)之间共享

假设我有和J2EE应用程序一起运行,使用tomcat 8的docker,dockerfile如下:

FROM tomcat:8 WORKDIR $CATALINA_HOME RUN midair -p /etc/foo RUN touch /etc/foo/a RUN touch /etc/foo/b RUN touch /etc/foo/c RUN touch /etc/foo/d RUN echo "a" >> /etc/foo/a RUN echo "b" >> /etc/foo/b RUN echo "c" >> /etc/foo/c RUN echo "d" >> /etc/foo/d CMD ["catalina.sh", "run"] 

在应用程序投入生产之前,DBA必须替换文件b和c,因此,我们有一个dockerfile如下:

 FROM centos:6.8 RUN mkdir -p /etc/foo RUN touch /etc/foo/a RUN touch /etc/foo/d RUN echo "sub a" >> /etc/foo/a RUN echo "sub d" >> /etc/foo/d COPY ./run.sh /root RUN chmod 755 /root/run.sh CMD ["/root/run.sh"] 

为了测试数据卷容器是否满足我的要求,运行以下命令:

 docker create -v /etc/foo --name configstore centos:6.8 /bin/bash docker run -d --volumes-from configstore --name testsubcontainer tomcat:8 

最后我发现“tomcat”容器在/etc/foo中有“a”和“d”,而c已经不存在了。

问题1:如何将仅使用数据卷容器作为其他容器的共享存储时的文件替换为不同的文件而不是整个目录。

Q2:还有其他更好的解决方案来满足我的要求吗?

问题1:按照原样使用卷,这是不可能的。 将卷装载到容器中的目录时,该目录内的所有内容都将被数据卷替换。 Docker不是映射文件,而是将卷挂载到容器文件系统中的某个点上。

问题2:您是否研究过ENV或ARG作为在运行时设置值的方法?