我正在尝试开始使用Docker卷。我有一个简单的Python Flask应用程序,可将数据存储在sqlite3数据库中。在没有卷的容器中运行应用程序是可行的,但是,当然,每次我重新启动容器时,所有数据库数据都会丢失。
我试图阅读有关如何使用卷的可用文档,并创建了一个新的命名卷:
SODIUM_INSTALL=system python3 -m pip install pynacl
但是在启动带有卷的容器时,我没有得到必须指定的路径。如果我愿意
VideoView videoView = findViewById(R.id.your_video_view_id);
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Intent intent = new Intent(getContext(),YourTragetActivity.class);
startActivity(intent);
}
});
它在重新启动时仍会丢失所有数据。我需要指定什么路径而不是docker volume create mydb
?这取决于什么?
答案 0 :(得分:1)
您可以使用bind mounts
或docker volumes
。
假设您选择/db
作为容器内数据库的位置,并且./data
是您要用于持久存储数据库的主机文件系统上的文件夹,或{{1} }是您使用的音量:
mydb
要找出用于存储文件的容器内部的路径(如果不确定),请查找sqlite3.connect
代码:参数是您所需的路径。
答案 1 :(得分:1)
命名卷不应该丢失数据,如the docs中所述:
卷是持久化由Docker容器生成和使用的数据的首选机制。
您真正需要的是确保将数据库保存到命名卷将使用的正确目录中。我建议在flask应用程序中创建一个特定目录,以保存sqlite3文件,然后将该目录装入您的命名卷。
因此,例如,您的sqlite3文件路径为:from azure.storage.blob import BlockBlobService
from io import BytesIO from shutil
import copyfileobj
with BytesIO() as input_blob:
with BytesIO() as output_blob:
block_blob_service = BlockBlobService(account_name='my_account_name', account_key='my_account_key')
# Download as a stream
block_blob_service.get_blob_to_stream('mycontainer', 'myinputfilename', input_blob)
# Here is where I want to chunk up the container contents into batches of 20k
# Then I want to write the above to a set of new containers using, I think, something like this...
block_blob_service.create_blob_from_stream('mycontainer', 'myoutputfilename', output_blob)
,则挂载将如下所示,否则将丢失数据,因为尚未挂载要保留的正确路径:
/home/myflaskapp/db