Docker绑定安装目录中的文件未更新

时间:2018-11-29 21:36:58

标签: docker ubuntu device pyserial udev

我正在使用docker bind mount映射Ubuntu生成的主机/dev/serial/文件夹(该文件夹包含标识到串行设备(例如/dev/ttyUSB0)的符号链接。我正在使用的完整docker容器运行命令是

docker run -d --restart always --privileged=true -v /dev/serial:/dev/serial DOCKER_IMAGE_NAME

这在第一次运行时效果很好,但是如果串行设备断开连接并重新连接,则会重新创建符号链接。此更改不会传播到docker容器中,而是在docker容器中找到一个空的/dev/serial文件夹。我测试了在主机上以及此目录中的docker容器内手动创建文件的方法,奇怪的是,在两种情况下,一个都没有更新。

音量显示为

{
    "Type": "bind",
    "Source": "/dev/serial",
    "Destination": "/dev/serial",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
}

编辑:Ubuntu在by-path文件夹下的两个目录by-id/dev/serial中创建符号链接。

2 个答案:

答案 0 :(得分:0)

绑定安装基于inode,并且在删除并重新创建文件后,绑定安装就会中断。在容器重新启动之前,这些更改不会传播到绑定安装,因此它将选择新的inode。

这种情况下的解决方案(删除并重新创建文件)是装入父目录,因此,在这种情况下,可以使用-v /dev:/dev进行装入。当然,这会将/ dev暴露给容器,因此请谨慎处理。

答案 1 :(得分:0)

早期版本的Docker存在问题。塞巴斯蒂安·范(Sebastian Van)清楚地解释了其原因

  

这看起来像是比赛条件;这里的问题是,使用-v:选项时,如果路径不存在,则docker将自动创建。此功能在某些时候被标记为已弃用(正是由于这些问题),但是认为更改太多是一项重大更改(请参阅moby / moby#21666,以及与该问题相关的问题)。

     

Windows版Docker(运行Linux容器时)在VM中运行docker守护程序。从本地(Windows)计算机共享的文件/目录已使用共享的挂载与VM共享,我怀疑启动容器时尚不存在挂载。

     

因此,在VM内找不到%USERPROFILE%/ docker_shared目录,因此守护程序会创建该路径(作为空目录)。稍后,当存在共享的挂载(来自Windows主机)时,将其挂载在VM内%USERPROFILE%目录的“顶部”,但此时容器已启动。

     

重新启动(泊坞窗停止,泊坞窗启动)可以解决这种情况,因为此时共享共享挂载可用,容器将挂载正确的路径。

关注主题:https://github.com/docker/for-win/issues/1192,以更好地理解。该问题已在Docker 2.0.4.0版(Edge通道)和更高版本的稳定版本中得到解决。