码头工人容器上的blkid

时间:2020-05-05 13:30:32

标签: c++ docker disk blkid

我正在研究一个旧的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也不在容器上返回任何内容。

有关我的系统的读者注意事项:

  • 在装有ubuntu 18的Windows上的VM(Oracle VM)上工作。
  • docker版本:19.03.6
  • 驱动程序:overlay2

0 个答案:

没有答案