为什么QDir :: exists()在Docker容器中不起作用?

时间:2018-10-08 15:04:19

标签: c++ qt docker kde qdir

在我的主机KDE Neon机器(最新升级到18.04)中执行的以下程序按预期输出Hello World! 1,而从使用以下Dockerfile构建的Docker容器执行并输出Hello World! 0并运行与sudo docker run -it qdir

QDir是否需要dbus或其他正在运行的服务?

C ++程序:

#include <QDir>
#include <iostream>


int main(int argc [[maybe_unused]], char** argv [[maybe_unused]])
{
    QDir d("/");
    std::cout << "Hello World! " << d.exists() << std::endl;
    return 0;
}

Dockerfile:

FROM kdeneon/plasma:user-lts

USER root

RUN apt-get install -y qt5-default

WORKDIR /
COPY qdir /
CMD /bin/bash

编辑以创建程序:CMakeLists.txt:

project(qdir)

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
set(QT_MIN_VERSION "5.3.0")

find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core)

include_directories(${Qt5Core_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR})

set(qdir_SRCS main.cpp)

add_executable(qdir ${qdir_SRCS})
target_link_libraries(qdir ${Qt5Core_LIBRARIES})

install(TARGETS qdir RUNTIME DESTINATION bin)

Edit2: 我创建了一个github项目,将所有上述内容重新组合。要重现该问题,如果您拥有Qt SDK,cmake,ninja和docker,请执行以下操作:

git clone https://github.com/kleag/qdirtest
cd qdirtest
./test.sh

这是我得到的输出:

$ ./test.sh
[…]
Successfully built f710cbb7a3c9
Successfully tagged qdir:latest
Hello World! 1
Hello World! 0

1 个答案:

答案 0 :(得分:1)

我从apachelogger on KDE forums得到了答案:

  

从5.10版本开始,Qt使用了一些新的系统调用。 statx是其中之一   最后我检查了syscall是否未在docker中列入白名单,   它可列入白名单,因为libseccomp用于上游docker   版本太旧,不知道什么是statx。机会是   您看到的问题是。如果是这样,则seccomp = unconfined将使其起作用。