我正在研究一个旧的C ++项目,该项目使用blkid / blkid.h中的函数来访问本地硬盘上的文件。
由于该项目非常大且难以编译/运行,所以我认为在容器中运行它是一个好主意。创建用于创建映像的dockerfile很好,当实际上在容器中运行旧项目时,问题就开始了。
尝试使用“ blkid_devno_to_devname”访问磁盘上的文件以获取要写入的设备ID时出现错误。
这是一个重现我的问题的示例程序
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <blkid/blkid.h>
int main() {
struct stat st;
std::string path = "my_file_path";
if (stat(path.data(), &st))
{
std::cout << "cannot get file statistics for file " << path << std::endl;
}
char *device_path = blkid_devno_to_devname(st.st_dev);
if(device_path == NULL)
{
std::cout << "cannot get device path for device ID " + std::to_string(st.st_dev) << std::endl;
}
}
在我机器上的常规文件中,device_path不是null,但是在docker上运行它总是返回null。
我不清楚的是docker容器如何查看其写入的磁盘。
要深入研究,我研究了stat(https://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/sys/stat.h)附带的不同宏,并将它们打印在具有不同文件类型(符号链接,文件,目录)的容器上的文件中。
我修改了上面的小程序以添加以下内容:
std::cout << "mode:" << st.st_mode << std::endl;
std::cout << "S_ISREG:" << S_ISREG(st.st_mode) << std::endl;
std::cout << "S_ISDIR:" << S_ISDIR(st.st_mode) << std::endl;
std::cout << "S_ISCHR:" << S_ISCHR(st.st_mode) << std::endl;
std::cout << "S_ISBLK:" << S_ISBLK(st.st_mode) << std::endl;
std::cout << "S_ISFIFO:" << S_ISFIFO(st.st_mode) << std::endl;
std::cout << "S_ISLNK:" << S_ISLNK(st.st_mode) << std::endl;
std::cout << "S_ISSOCK:" << S_ISSOCK(st.st_mode) << std::endl;
我认为这会有所不同,具体取决于Docker写入的层的类型,但我看不到任何东西。
是在卷上,挂载上还是在容器层上(我的意思是在卷上和挂载上都没有文件)。
在安装座上,我希望设备ID是正确的,因为据我了解,安装座使容器可以访问物理驱动器(至少就我而言-可能通常不正确)。>
那么为什么blkid_devno_to_devname在Docker容器上不返回任何内容? 我没有正确理解什么?
P.S。作为记录,blkid或/ etc / fstab也不在容器上返回任何内容。
有关我的系统的读者注意事项: