我正在使用 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
但是运行构建过程会导致 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
我终于找到了解决这个问题的方法。
在 CLion 中的“设置”>“构建、执行、部署”>“工具链”下,将选项
--user=0
添加到容器设置。
使用此选项,命令将以 root 用户身份在容器中运行。由于 Docker Desktop 以普通用户身份运行,因此容器中的 root 用户将映射到主机用户。
添加此设置后,CLion 自动找到 Docker 容器中编译器的路径,并在没有任何权限问题的情况下构建工作。此外,构建目录中的文件归我的主机用户所有。