Почему QDir :: exist () не работает в контейнере Docker? - PullRequest
0 голосов
/ 08 октября 2018

Следующая программа, запущенная на моем хосте KDE Neon (обновлена ​​до 18.04), выдает Hello World! 1, как и ожидалось, и выводит Hello World! 0 при выполнении из контейнера Docker, созданного с использованием приведенного ниже Dockerfile и работающего с 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 голосов
/ 10 октября 2018

Я получил ответ от apachelogger на форумах KDE :

Начиная с 5.10, Qt использует несколько новые системные вызовы.Одним из них является statx, и в последний раз я проверял, что системный вызов не был внесен в белый список в Docker, и при этом он не был белым списком, потому что libseccomp, используемый для сборки докера верхнего уровня, был слишком стар и не знал, что такое statx.Скорее всего, проблема в том, что вы видите.Если это так, seccomp = undefined заставит его работать.

...