我和Docker玩了一段时间了。最近,我遇到了一个" bug"我无法确定原因/原因。
我目前在Windows 8.1上安装了docker工具箱,其中包括docker 1.8.2,docker-machine 0.4.1和virtualbox 5.0.4(这些是重要的,大概是)。我曾经和纯boot2docker在一起。
我不确定发生了什么,所以描述可能含糊不清,如果您需要,请询问我澄清。我们走了:
当我写一些位于共享文件夹中的文件时,vm只获取文件长度更新,但无法获取新内容。
让我以app.py为例(我一直在玩烧瓶)
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')
当我在vm中捕捉它时:
现在,让我们将其更新为以下内容,注意额外的感叹号:
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')
当我再次捕捉它时:
注意2件事:
我怀疑操作系统以某种方式获取了文件大小的变化,但未能选择新内容。当我从文件中删除字符时,EOF符号也会移动,并且cat输出会被我删除的字符确切地切断。
不仅cat
未能获得更改,vm中的所有程序都会执行。因此,当它发生时,我无法发展任何东西。我所做的改变根本不会影响任何事情。而且我必须杀死vm并再次将其旋转以获得我所做的任何更改,而不是那么有效。
任何帮助将不胜感激!感谢您阅读长篇问题!
答案 0 :(得分:1)
看起来这是一个已知问题。
https://github.com/gliderlabs/pagebuilder/issues/2
链接到
https://forums.virtualbox.org/viewtopic.php?f=3&t=33201
感谢Matt Aitchison在gliderlabs/docker-alpine
回复我的github问题 sync; echo 3 > /proc/sys/vm/drop_caches
是临时解决方案。
永久修复似乎不会很快到来......
答案 1 :(得分:0)
我假设您使用类似
之类的东西将app.py 挂载为文件Thread1 Thread2
C
A
A C
C A
S C
S R <---- Remove and add have to be performed without Thread1 serializing
S A <---- anything in between (atomically) - and it has to be done without
S S blocking other threads computations and serializations for long
S and not third thread must be allowed to start serializing in this
S in-between state
S
可悲的是,容器无法识别以这种方式挂载的文件的更改。 尝试将文件放在文件夹中,然后安装文件夹。然后在容器中可以看到对该文件的更改。
假设app.py位于-v /host/path/to/app.py:/container/path/to/app.py
,请尝试使用
$(pwd)/work
并将正在运行的命令调整为-v $(pwd)/work:/work
。