问题

使用 Docker Volumes 时,有时需要挂载一个宿主机目录或者文件,提供数据可持续或者容器内部服务配置文件。

使用命令 docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash 挂载文件(test.txt 默认权限 644)时,通过 vim 修改宿主 test.txt 文件,但是容器中 test.txt 没有修改。这是为什么?

问题分析

Docker 中,mount volume 的原理是借用了 Linux Namespace 中的 Mount NameSpace,隔离系统中不同进程的挂载点视图,实际文件是没有变化。比如上面的例子,在container中,bash 实际就是一个运行在宿主机上的进程,被Docker用Linux分别隔离了 Mount NamespaceUTS NamespaceIPC NamespacePID NamespaceNetwork NamespaceUser Namespace,使得它看上去好像运行在了一个独立的相对隔离的系统上,但实际它的一切资源都是宿主机在不同Namespace中的一个投影,文件也不例外。

为什么宿主机上修改 test.txt 文件,而容器中 test.txt 文件没有变化?

Linux中,证明文件是否相同的根本途径是,判断其 inode,如果两个文件的inode相同,两个文件必定为同一文件,从而两个文件的内容也必然相同。

验证问题

1、在宿主机上创建一个 /root/test.txt 文件,使用命令 stat 查看 inode 值,如下图:


2、使用命令 docker run -it --rm -v /root/test.txt:/root/test.txt debian:10 bash 临时启动一个容器,把宿主机文件 /root/test.txt 挂载到容器中。

3、另开一个终端,使用 vi 命令修改 /root/test.txt 文件,编辑完后保存,再次使用 stat 命令查看 /root/test.txt 文件 inode 值。从下图已经发现,inode 值已经改变。


4、登陆容器查看 /root/test.txt 文件  inode 值。如下图,inode 值还是 vi 修改前的值。而不是修改后的值。这也就解释为什么宿主机上修改了文件而容器中文件没有更新的原因。因为容器与宿主机使用的不是同一个文件。


简述 vi 或者 vim 修改文件过程

Linux 默认情况下,vim为了防止在你修改文件的过程中,由于磁盘或者系统出现问题而导致当前被修改的文件的损坏,它做了类似如下逻辑:

  • 1、复制出一个需要修改文件的副本,命名为在原来文件的基础上增加 ".swp" 后缀以及 "." 前缀。
  • 2、修改内容保存到有 .swp 后缀的文件,并 flush 到磁盘
  • 3、执行 :wq 就会交换原文件和 swp 文件的名称
  • 4、删除临时 swp 文件

从上面可以看出,原来的文件已经被删除,但是容器还是会一直记录以前的文件,只有当 restart 容器时,容器才会重新读取新的文件。宿主机上修改的内容才会更新。

解决方法

方法一

使用 echo 修改文件,而不是使用 vim 或者 vi

方法二

修改 vim 配置。执行 vim 命令,输入 :scriptnames 查看 vim 配置文件路径,这边配置文件路径是 /etc/vimrc ,在配置文件最后添加如下两行。

set backup

这样可以解决问题,不过也有一个很大的副作用,那就是每次用vim编辑文件保存之后,vim会生成一个类似该被修改文件,但末尾增加了一个"~"后缀,用以保存修改之前的文件内容。此方法不推荐

方法三

修改文件权限,文件默认权限是 644,把权限修改为 666。修改完权限后,再次通过 vim 修改并保存后,原文件的 inode 不会发生变化。(推荐此方法)

$ chmod 666 /root/test.txt

方法四

挂载目录,不要挂载文件。挂载目录不会出现宿主机文件更新,而容器中文件没有更新。(推荐此方法)

参考链接

  • https://forums.docker.com/t/modify-a-file-which-mount-as-a-data-volume-but-it-didnt-change-in-container/2813/13
  • https://www.cnblogs.com/lylex/p/12781007.html

热门文章推荐

  • 分享Linux内存占用几个案例
  • 如何实现rsync多并发同步?
  • 我们如何用 K8S 搞定 1000 个应用的测试环境
  • Kubernetes YAML 生成器
  • Kubernetes故障排查指南-分析容器退出状态码
  • IT运维面试问题总结-运维工具、开源应用(Ceph、Docker、Apache、Nginx等)

最后

  • 欢迎您加我微信【ypxiaozhan01】,拉您进技术群,一起交流学习...
  • 欢迎您关注【YP小站】,学习互联网最流行的技术,做个专业的技术人...


【文章让您有收获,

docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...相关推荐

  1. 启动容器后,即便映射了端口,使用docker ps 命令查看,ports列也是空

    问题 启动容器后,即便映射了端口,使用docker ps 命令查看,ports列也是空的,如下图 可能是docker网络没有配置好 简单排查问题 1.查看容器的网络配置 docker inspect ...

  2. docker开放的端口_关于docker自动开放端口解决方案

    在docker中只要有容器映射了端口docker就会自动加iptables iptables -L -n Chain DOCKER (8 references) target prot opt sou ...

  3. docker 镜像修改的配置文件自动还原_基于Docker搭建Redis一主两从三哨兵

    作者丨oscarwin来源:https://juejin.im/post/5d26b03de51d454fa33b1960 这段时间正在学习Redis和容器相关的内容,因此想通过docker搭建一套r ...

  4. docker 容器运行 golang程序_「Docker」 - 运行 amp; 管理容器

    容器是基于容器技术所建立和运行的轻量级应用运行环境,它是Docker封装和管理应用程序或微服务的「集装箱」,在Docker中,容器是最核心的部分. 一.容器的创建和启动 Docker容器的生命周期里分 ...

  5. centos7 docker端口_使用Docker部署Python应用

    0 引言 在linux系统部署Python应用需要安装较多依赖,在内网环境下十分繁琐,而且有时候还需要在其他服务器运行,则需要重复搭建环境和部署应用,因此本文介绍利用docker容器技术来部署.鉴于本 ...

  6. Docker学习与和应用(二)_使用Docker

    在前一篇文章 Docker学习与和应用(一)_初步认识中,我们初步介绍了Docker解决了什么问题,Docker容器化技术与传统的虚拟化方式的区别,以及简要介绍了Docker的几大核心概念:镜像.容器 ...

  7. docker 安装mysql 实战文档_在docker上安装运行mysql实例

    ps:实验环境是:CentOS Linux release 7.3  64位 1.获取mysql镜像 从docker hub的仓库中拉取mysql镜像 docker pull mysql 查看镜像 d ...

  8. k8s一个容器多个镜像_从零开始学K8s: 6.运行一个简单的容器

    如果觉得本文对您有帮助,可以关注.转发.点赞,您的支持是我持续创作的最大动力! 如果要在Kubernetes中运行应用程序,需要先将它们打包到容器镜像中.本文以Docker为例来进行具体讲解. 1.安 ...

  9. vue前端服务器端口_解密智联招聘的大前端架构 Ada

    作者 | 智联大前端 Ada 是智联招聘自主研发的演进式大前端架构.于 2017 年正式投入使用后,又经过三年持续演进,全面覆盖了从研发到运维的各个方面,具备跨技术栈工程化体系.交互式图形界面开发工具 ...

最新文章

  1. 垃圾回收 内存管理 python
  2. 什么行业需要java_java开发可以从事什么行业
  3. 1 State Hook
  4. Linux守护进程的创建(结合nginx框架)
  5. runtime的意义
  6. python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结
  7. python标准输入输出语句_Python“门卫”之输入输出
  8. 【转】XP系统电脑开机自动登陆系统
  9. 计算机苏教版初一教案,文笔精华(苏教版七年级) 教案教学设计
  10. javaee 中不同页面传参方法
  11. html脚本怎么触发,在HTML中使用“onkeypress”触发视频,但是只有脚本中的最后一个代码会触发视频并且不确定为什么...
  12. git如何添加远程主机_Git由浅入深之远端主机(git remote)
  13. 在IDEA中使用Linux命令
  14. 计算机被管理员限制怎么解除,Win10系统管理员账户被禁用如何解除?
  15. python实现按下特定键截屏
  16. Algorithm:矩阵中“块”的个数
  17. 菜鸟教程出app了!青结
  18. 有余记账(h5记账类项目)
  19. 关闭/删除“设备和驱动器”里的图标(如迅雷下载、WPS网盘)
  20. 第三方微信+支付宝个人免签支付源码

热门文章

  1. HTML第八章ppt,html教程第八章(JavaSript核心语言对象).ppt
  2. python多版本共存 ubuntu_Linux下python3与python3的多版本共存
  3. 连接数_全国建成5G基站超48万个 5G终端连接数已过亿
  4. php 加七天减七天,php实战第七天_PHP教程
  5. python按字节读取_Python read函数按字节(字符)读取文件的实现
  6. 哇,居然可以用这种烙铁头拆元器件!!!
  7. 华为耳机5根线怎么接线图解_联通宽带突然无法上网怎么急救处理?
  8. HDLBits答案(15)_Verilog有限状态机(2)
  9. Nexys4 DDR + OV7670 摄像头实时监控系统
  10. dns的服务器地址是多少当前位置,dns的服务器地址设置为多少