CLion:在 Docker Desktop 中构建项目时权限被拒绝

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

我正在使用 CLion,我想在 Docker Desktop 中使用 CMAKE 构建 keepassxc。使用 Docker 构建此项目会导致权限被拒绝错误。

我正在使用 Ubuntu 22.04 与 CLion 2024.2.2 和 Docker Desktop 4.34.2

我按照教程中提到的步骤在 CLion 中创建了 Docker 工具链。

第一个问题是 CLion 找不到 docker 容器中编译器的路径,错误日志显示以下内容

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - broken
-- Configuring incomplete, errors occurred!
Error code: 1

所以我手动设置编译器和构建工具的路径。 Setting the paths manually

但是运行构建过程会导致 CMake 错误。

这是错误的片段。错误消息中还提到了其他目录和文件,其中权限被拒绝。

CMake Error at /usr/share/cmake-3.22/Modules/CMakeDetermineSystem.cmake:181 (file):
  file failed to open for writing (Permission denied):

    /tmp/keepassxc/cmake-build-debug-docker/CMakeFiles/CMakeOutput.log
Call Stack (most recent call first):
  CMakeLists.txt:19 (project)

所以我将目录

cmake-build-debug-docker
的权限设置为0777,并使用Docker构建完成,没有任何错误。但问题是,在 Docker 容器中创建的可执行文件等文件由用户 ID 100999 拥有,这不是我的用户 ID。

在上述教程中,当 Docker 安装不是无根时,CLion 将使用主机用户的用户 ID 运行 Docker 容器。但我正在使用用户权限运行 Docker Desktop。 Docker Desktop 还使用用户命名空间重新映射。我认为这就是所有者 ID 不匹配的原因。

我尝试修复此问题,教程中提到了这一点,并在 Dockerfile 中添加了以下行:

ARG UID=1000
RUN useradd -m -u ${UID} -s /bin/bash builder
USER builder

但这并不能改变结果。

我不知道如何解决这个问题。

我用于构建的 Dockerfile:

FROM ubuntu:jammy

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update && apt install -y \
    asciidoctor \
    build-essential \
    clang \
    cmake \
    gcc \
    gdb \
    g++ \
    make

RUN apt install -y \
    qtbase5-dev qtbase5-private-dev qttools5-dev qttools5-dev-tools \
        libqt5svg5-dev libargon2-dev libminizip-dev libbotan-2-dev libqrencode-dev \
        libkeyutils-dev zlib1g-dev libreadline-dev libpcsclite-dev libusb-1.0-0-dev \
        libxi-dev libxtst-dev  libqt5x11extras5-dev
docker cmake clion jetbrains-ide docker-desktop
1个回答
0
投票

我终于找到了解决这个问题的方法。

在 CLion 中的“设置”>“构建、执行、部署”>“工具链”下,将选项

--user=0
添加到容器设置。

使用此选项,命令将以 root 用户身份在容器中运行。由于 Docker Desktop 以普通用户身份运行,因此容器中的 root 用户将映射到主机用户。

添加此设置后,CLion 自动找到 Docker 容器中编译器的路径,并在没有任何权限问题的情况下构建工作。此外,构建目录中的文件归我的主机用户所有。

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