其实算不上是坑,还是自己没有理解深刻。docker数据卷docker run -it -v中, -v 宿主机目录:容器目录。意为将宿主机目录与容器目录进行挂载,宿主机的目录与docker容器目录保持一致。但是记住的是-v 宿主机目录:容器目录,是以宿主机目录为准!而我的需求是要以容器内部为准!想当然的认为是以容器内或哪一侧有文件以哪个为准了。那怎么才能以容器内为准呢!(不能以容器内为准,但有其他解决方案)

问题显现

        最近在做一个项目,镜像为自己export出的镜像,即在我们自己的镜像中,融合了我们的业务代码(前后台分离build文件和jar包)和nginx组件。故我的想法是需要将我的jar包业务中对应的application.yml文件和nginx目录nginx/conf/下的文件挂载到宿主机上,这样再查看文件和修改文件时会方便一些。

        即我的需求是将容器内部的配置文件挂载到宿主机上,而不是将宿主机目录挂载到容器内部。由于docker run -it -v 数据卷对应的是以宿主机目录为准,这就导致我每次docker run -it -v 去启动容器后,进入容器发现,我的业务配置文件application.yml和nginx配置文件nginx.conf都不存在了。

如何解决

        既然我的需求是将容器内部的文件挂载到外部,即以容器内部的文件为主。那么就需要在自定义镜像包的时候,将我们所需要的配置文件复制到一个备份目录中!在docker -run -it -v 时候执行指定镜像中的脚本文件,在脚本文件中将备份目录的配置文件cp到我们所要数据卷的目录里。

docker run --privileged=true -it --name $CONTAINERNAME -p 4500:8086 -p 4501:8088  -v $CONFTMP:/usr/local/cms/config/ -v $NGINXTMP:/usr/local/nginx/conf/ --restart always  $IMAGENAME  sh '/usr/local/bin/docker_cp_config.sh'

##--privileged=true 以最高权限root操作容器
##--restart always  重启docker后该容器也随之重启
## sh '/usr/local/bin/docker_cp_config.sh' 在创建容器后,在容器内执行docker_cp_config.sh脚本

在我们创建的容器内执行docker_cp_config脚本将对应的备份文件cp到nginx目录和java目录下。

这样就能保证我们数据卷之后的文件是以我们容器内的为准了。