要求:当新版本的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
b中有“a”和“d”,c已经消失了。
Q1:当使用数据卷容器作为其他容器的共享存储时,如何仅替换不同文件,而不是整个目录。
Q2:还有其他更好的解决方案来满足我的要求
答案 0 :(得分:0)
Q1:按原样使用卷,这是不可能的。将卷装入容器中的目录时,该目录中的所有内容都将被数据卷替换。 Docker不是映射文件,它将卷安装在容器文件系统中的某个点上。
Q2:您是否将ENV或ARG作为在运行时设置值的方法进行了探索?