docker容器内Win32 api的绑定目录

docker容器内Win32 api的绑定目录,docker,winapi,windows-services,containers,c++17,Docker,Winapi,Windows Services,Containers,C++17,背景: 我目前正在开发一个windows服务,用于监视windows计算机上文件系统的更改 下一步是将此应用程序放入容器中,以便在每台机器上运行。为了“捕获”目录更改,我在C++中使用了函数 RerecDirectYyExeXWW 。对给定目录的任何更改都将引发windows事件 为了启动容器并测试服务,我使用以下命令: docker run --rm -it --workdir="c:\FileAgent" monitor 其中,FileAgent是我放置.exe的目录,monitor是我图

背景: 我目前正在开发一个windows服务,用于监视windows计算机上文件系统的更改

下一步是将此应用程序放入容器中,以便在每台机器上运行。为了“捕获”目录更改,我在C++中使用了函数<强> RerecDirectYyExeXWW <强>。对给定目录的任何更改都将引发windows事件

为了启动容器并测试服务,我使用以下命令:

docker run --rm -it --workdir="c:\FileAgent" monitor
其中,FileAgent是我放置
.exe
的目录,monitor是我图像的名称

通过运行该服务来监视容器的本地目录,该服务可以正常工作。但是,当我试图通过绑定监视主机上的文件夹时,该服务的工作状态不是ReadDirectoryChangesSW为FALSE,应用程序正在崩溃

代码示例:

string lpDir = "C:/tmp/";
FILE_NOTIFY_EXTENDED_INFORMATION strFileNotifyInfo[1024];

HANDLE fileH = CreateFileA
(
    lpDir.c_str(),
    FILE_LIST_DIRECTORY,
    FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_ALWAYS,
    FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
    NULL
);
if (!fileH) ErrorReporter(L"Error in creating file handler");

OVERLAPPED ovl = { 0 };
ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ovl.hEvent) {
    ErrorReporter(L"ERROR in creating event.");
    ExitProcess(GetLastError());
}

if (!ReadDirectoryChangesExW(
    fileH, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo),
    TRUE, //subtree watcher
    FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_ATTRIBUTES,
    NULL, &ovl, NULL, ReadDirectoryNotifyExtendedInformation))
{
    ErrorReporter(L"Error in reading directory changes!");
    ExitProcess(GetLastError());
}
其中lpDir是目录的路径。要重新生成该状态,在构建docker映像后,我使用以下命令启动容器:

docker run --rm -it --workdir="c:\FileAgent" -v c:\Users\john\Desktop\dataDir:c:\tmp\ monitor
正如我测试的,这是一个双向绑定。这意味着对dataDir的更改会影响容器内的tmp目录,反之亦然。当我启动服务时,它会像我之前提到的那样崩溃

我尝试的是:

  • 使用标志
    --user“NT AUTHORITY\SYSTEM”
    启动具有特定用户的容器
  • 通过Dockerfile在生成过程中定义用户

    RUN NET USER my_admin /add
    
    RUN NET LOCALGROUP Administrators /add
    
    my_admin USER my_admin
    
  • 首先创建目录,然后绑定它

  • 在所有这些实验中,我注意到容器绑定文件夹上的用户是
    。此外,我无法删除此文件夹,因为真正的文件夹位于主机上

    你能提供一些建议吗


    我是否缺少任何安全/访问权限问题?

    “ReadDirectoryChangesSW为空”-这是什么意思?当然,符号已正确导入(即,它具有非空地址)。否则应用程序甚至无法启动。A是必需的。编辑了我的问题并提供了一些代码。谢谢
    ReadDirectoryChangesCW
    为FALSE-在此之后返回了什么
    RtlGetLastNtStatus()
    ?您调用
    GetLastError
    太晚了。请参阅“打开”按钮,以确定何时调用它。此外,Windows上的路径分隔符是反斜杠,而不是正斜杠。如果您想避免遇到无法解决的问题,请调用
    CreateFileW
    ,而不是
    CreateFileA
    。无论如何,返回失败代码的API调用不会导致应用程序崩溃。@kothemel-
    如果(!fileH)
    检查错误
    CreateFileA
    返回错误
    无效句柄\u值
    (-1),但不是0。因此,您不会在此处捕获fail并将无效句柄传递给
    ReadDirectoryChangesSW
    ,并获得
    状态\u无效句柄