使用容器访问文件
在 Docker® 容器内运行的 MATLAB® 应用程序和微服务通过装载卷来访问数据文件,这些装载卷将容器的隔离文件系统与主机系统的目录连接起来。Docker 容器中的文件存储方式有以下两种:
在主机文件夹中,使用
-v标志和docker run将文件夹装载到容器中作为 Docker 卷位于容器的内部文件系统中(容器停止后数据不会保留)
文件访问方法
| 用例 | 最佳做法 | 注意 |
|---|---|---|
| 持久存储 | 使用 -v 装载 Docker 卷 | 停止/重启后数据仍保留 |
| 临时容器存储 | 请使用 /tmp 或其他未装载的文件夹 | 停止/重启后数据丢失 |
| 访问打包文件 | 在容器镜像中使用 which 或绝对路径 | 打包过程中包含的文件已嵌入到 CTF 中 |
| 将文件上传或下载至微服务 | 使用 API 和已装载的卷与 -v | 通过 HTTP 发送和接收文件 |
装载文件夹以实现持久存储
Docker 容器的文件系统在设计上与宿主系统相互隔离,且容器停止运行后,其内部文件系统将不被保留。要与容器共享数据,请在执行 docker run 命令时使用 -v 选项,将主机系统中的文件夹装载到容器中。请为宿主机路径和容器路径指定绝对路径,否则文件夹将无法装载。请注意,在容器内部修改文件会覆盖主机上的文件。
请务必确保映射的目标文件夹对在容器中运行 MATLAB 代码的用户具有写入权限。容器通常允许向映射卷写入数据,但受限的 Linux 系统可能仅允许向 /tmp 等目录写入数据。
如果您将数据写入未装载的文件夹,这些数据仅在容器停止运行前有效。
从已部署的 MATLAB 代码中访问打包文件
在已部署的 MATLAB 代码中,您可以使用 which 函数访问随代码打包的文件。例如,如果您在使用 compiler.package.docker 打包之前,通过 compiler.build.standaloneApplication 的 'AdditionalFiles' 选项包含了数据文件 mydata.mat,那么以下代码可以获取该文件的位置。
if isdeployed locate_externapp = which('mydata.mat'); end
有关详细信息,请参阅 在打包的应用程序中包含和访问文件。
您还可以使用绝对路径访问文件,该路径指向容器内部已装载的卷。例如:
读取文件:
data = fread(fopen('/container/path/myfile.mat', 'r'));
写入文件:
imwrite(img, '/container/path/output.png');save('/container/path/newdata.mat', 'var');
相对路径(即写入当前文件夹)可能无法正常工作,并可能导致权限错误,特别是当容器的当前目录未映射或没有写入权限时。
如果文件需要持久保存或从外部访问,请使用 -v 选项装载文件夹。
将文件上传或下载到微服务
具有 HTTP 端点的微服务 MATLAB 应用程序允许客户端通过 API 请求上传或下载文件。该服务可以使用绝对路径将上传的文件保存到已装载的文件夹中,或从已装载的文件夹中读取文件以供下载。此工作流允许文件保存在容器外部,并在重启后继续保留。
另请参阅
主题
- 在打包的应用程序中包含和访问文件
- 将 MATLAB 独立应用程序打包为 Docker 镜像
- 创建微服务 Docker 镜像 (MATLAB Compiler SDK)