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

时间:2017-07-24 16:02:41

标签: docker

要求:当新版本的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:还有其他更好的解决方案来满足我的要求

1 个答案:

答案 0 :(得分:0)

Q1:按原样使用卷,这是不可能的。将卷装入容器中的目录时,该目录中的所有内容都将被数据卷替换。 Docker不是映射文件,它将卷安装在容器文件系统中的某个点上。

Q2:您是否将ENV或ARG作为在运行时设置值的方法进行了探索?