没有在虚拟机中获得真正的文件更新

Not getting real file update in vm

我玩 docker 有一段时间了。最近遇到一个"bug"无法查明原因的问题

我目前使用 windows 8.1 并安装了 docker 工具箱,其中包括 docker 1.8.2、docker-machine 0.4.1 和 virtualbox 5.0.4(大概这些是重要的)。我以前是用pure boot2docker.

我不太确定发生了什么,所以描述可能含糊不清且没有帮助,如果您需要任何说明,请向我询问。我们开始吧:

当我写入一些位于共享文件夹中的文件时,vm 仅获取文件长度更新,但无法获取新内容。

以我的app.py为例(我一直在玩flask)

app.py:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from werkzeug.contrib.fixers import LighttpdCGIRootFix

import os

app = Flask(__name__)
app.config.from_object(os.getenv('APP_SETTINGS'))
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

db = SQLAlchemy(app)


@app.route('/')
def hello():
    return "My bio!"


if __name__ == '__main__':
    app.run(host='0.0.0.0')

当我在虚拟机中 cat 时:

现在,让我们将其更新为以下内容,注意多余的感叹号:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from werkzeug.contrib.fixers import LighttpdCGIRootFix

import os

app = Flask(__name__)
app.config.from_object(os.getenv('APP_SETTINGS'))
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

db = SQLAlchemy(app)


@app.route('/')
def hello():
    return "My bio!!!!!!!"


if __name__ == '__main__':
    app.run(host='0.0.0.0')

当我再次捕捉它时:

注意两件事:

  1. 没有多余的感叹号
  2. 移动了EOF符号,EOF符号前出现的空格个数正好是感叹号的个数

我怀疑 OS 以某种方式获取了文件大小的变化,但未能获取新内容。当我从文件中删除字符时,EOF 符号也会移动,cat 输出会被我删除的字符数截断。

不仅cat 无法获取更改,vm 中的所有程序都可以。因此,当它发生时我无法开发任何东西。我所做的更改根本不会影响任何东西。而且我必须杀死虚拟机并再次启动它才能获得我所做的任何更改,效率不高。

任何帮助将不胜感激!感谢您阅读冗长的问题!

我假设您使用类似

的方式将 app.py 安装为文件
-v /host/path/to/app.py:/container/path/to/app.py

遗憾的是,容器将无法识别以这种方式装载的文件的更改。 尝试将文件放在文件夹中,然后 挂载文件夹 。然后对该文件的更改将在容器中可见。

假设 app.py 位于 $(pwd)/work,尝试 运行 容器

-v $(pwd)/work:/work

并将命令 运行 调整为您的代码 /work/app.py

看起来这是一个已知问题。

https://github.com/gliderlabs/pagebuilder/issues/2

链接到

https://forums.virtualbox.org/viewtopic.php?f=3&t=33201

感谢Matt Aitchison for replying to my github issue at gliderlabs/docker-alpine

sync; echo 3 > /proc/sys/vm/drop_caches 是临时修复。

永久性修复似乎不会很快出现...