从 docker 容器运行程序时访问主机数据

问题描述 投票:0回答:1

我正在尝试在 docker 容器中托管的 C 程序中运行以下命令;

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char *argv[] )
{

  FILE *fp;
  char path[1035];

  /* Open the command for reading. */
  fp = popen("sudo udevadm info --query=all --name=/dev/sda", "r");
  if (fp == NULL) {
    printf("Failed to run command\n" );
    exit(1);
  }

  /* Read the output a line at a time - output it. */
  while (fgets(path, sizeof(path), fp) != NULL) {
    printf("%s", path);
  }

  /* close */
  pclose(fp);

  return 0;
}

但是它给了我一个

Unknown device "/dev/sda": No such device
错误。

大概是因为它无法访问主机磁盘数据。有没有办法通过

popen
获取主机数据而不是docker容器的数据?

感谢任何帮助,非常感谢!

编辑 - 同意评论/答案,说给予

--privileged
是一个坏主意。作为解决方法;如果我从应用程序中创建了一个 dll,并将其保存在主机中,是否可以从容器访问该 dll?

c linux docker popen
1个回答
1
投票

并非如此,尤其是在管理原始物理设备时。 如果您可以访问

/dev/sda
,那么您就可以访问物理磁盘的原始位并破坏或规避可能存在的任何类型的安全控制。 这通常是不允许的,容器既对 Linux 功能有限制,也有额外的设备映射控制来阻止您这样做。

如果您想管理主机系统的各个方面(例如物理设备),通常需要在没有容器的情况下完成。

原则上,您可以

docker run --privileged
您的容器,或使用
docker run --device /dev/sda --cap-add SYS_ADMIN
为您的容器提供所需的权限。 但这从根本上赋予了容器覆盖引导加载程序、替换内核以及对磁盘支持的任何内容进行任意更改的权限;你几乎完全规避了 Docker 的核心隔离功能。

另请注意,

sudo
通常不适用于容器,因为很难安全地设置用户密码,而且您通常也无法提示输入密码。 您不应该将其硬编码到应用程序代码中。

© www.soinside.com 2019 - 2024. All rights reserved.