一、目标
讨论如何使用 docker 搭建 qt5.12 开发环境。
二、Docker
Dockerfile
            
            
              shell
              
              
            
          
          FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV QT_VERSION=5.12.12
ENV WORKSPACE=/workspace
ENV HOME=/home/docker_qt_user
ENV TZ=Asia/Shanghai
RUN apt-get update && \
    apt-get install -y tzdata sudo vim wget curl net-tools dbus-x11 x11-apps && \
    apt-get install -y xfce4 xfce4-terminal tightvncserver && \
    apt-get clean && rm -rf /var/lib/apt/lists/*
# 更新并安装基础工具
RUN apt-get update && apt-get install -y \
    software-properties-common \
    wget \
    curl \
    git \
    ninja-build \
    python3 \
    python3-pip \
    sudo \
    && rm -rf /var/lib/apt/lists/*
# 安装主机编译工具链
RUN apt-get update && apt-get install -y \
    build-essential \
    cmake \
    gcc \
    g++ \
    gdb \
    clang \
    clang-tools \
    make \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*
# 安装 ARM 交叉编译工具链
RUN apt-get update && apt-get install -y \
    gcc-arm-linux-gnueabihf \
    g++-arm-linux-gnueabihf \
    binutils-arm-linux-gnueabihf \
    && rm -rf /var/lib/apt/lists/*
# 安装 ARM64 交叉编译工具链
RUN apt-get update && apt-get install -y \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    binutils-aarch64-linux-gnu \
    && rm -rf /var/lib/apt/lists/*
# 安装 Qt 5.12 依赖
RUN apt-get update && apt-get install -y \
    libgl1-mesa-dev \
    libglu1-mesa-dev \
    libx11-dev \
    libxext-dev \
    libxfixes-dev \
    libxi-dev \
    libxrender-dev \
    libxcb1-dev \
    libx11-xcb-dev \
    libxcb-glx0-dev \
    libxcb-keysyms1-dev \
    libxcb-image0-dev \
    libxcb-shm0-dev \
    libxcb-icccm4-dev \
    libxcb-sync-dev \
    libxcb-xfixes0-dev \
    libxcb-shape0-dev \
    libxcb-randr0-dev \
    libxcb-render-util0-dev \
    libfontconfig1-dev \
    libfreetype6-dev \
    libxml2-dev \
    libxkbcommon-dev \
    libxkbcommon-x11-dev \
    libssl-dev \
    libpng-dev \
    libjpeg-dev \
    libicu-dev \
    libpcre2-dev \
    libdbus-1-dev \
    libatspi2.0-dev \
    && rm -rf /var/lib/apt/lists/*
# 安装 Qt 5.12 和 Qt Creator
RUN apt-get update && apt-get install -y \
    qt5-default \
    qtbase5-dev \
    qtdeclarative5-dev \
    qttools5-dev \
    qttools5-dev-tools \
    qtmultimedia5-dev \
    qtquickcontrols2-5-dev \
    qtwebengine5-dev \
    qtcreator \
    && rm -rf /var/lib/apt/lists/*
# 安装 Clang 相关工具(解决 Clang Code Model 错误)
RUN apt-get update && apt-get install -y \
    clang-10 \
    clangd-10 \
    libclang-10-dev \
    llvm-10-dev \
    valgrind \
    clang-format \
    cppcheck \
    gdbserver \
    file \
    && rm -rf /var/lib/apt/lists/*
# 创建 Clang 符号链接
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 100 && \
    update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-10 100 && \
    update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-10 100
# 创建普通用户
RUN useradd -m -s /bin/bash docker_qt_user && \
    echo "docker_qt_user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# 提前创建 Qt Creator 配置目录并设置正确权限
RUN mkdir -p /home/docker_qt_user/.config/QtProject && \
    chown -R docker_qt_user:docker_qt_user /home/docker_qt_user && \
    chmod -R 755 /home/docker_qt_user/.config
USER docker_qt_user
WORKDIR /home/docker_qt_user
# 设置 VNC 密码
RUN mkdir -p /home/docker_qt_user/.vnc && \
    echo "1234" | vncpasswd -f > /home/docker_qt_user/.vnc/passwd && \
    chmod 600 /home/docker_qt_user/.vnc/passwd
# 设置环境变量
ENV PATH="/usr/lib/qt5/bin:${PATH}"
ENV QT_DIR="/usr/lib/x86_64-linux-gnu/qt5"
ENV QTDIR="/usr/lib/x86_64-linux-gnu/qt5"
ENV QT_SELECT=5
ENV CLANGD_PATH=/usr/bin/clangd-10
# 创建默认的 Qt Creator 配置
RUN mkdir -p /home/docker_qt_user/.config/QtProject/qtcreator
# 验证安装
RUN qmake --version && \
    gcc --version && \
    arm-linux-gnueabihf-gcc --version && \
    aarch64-linux-gnu-gcc --version && \
    clang --version
# 创建 xstartup 启动 XFCE
RUN echo '#!/bin/bash\n\
xrdb $HOME/.Xresources\n\
startxfce4 &' > /home/docker_qt_user/.vnc/xstartup && \
    chmod +x /home/docker_qt_user/.vnc/xstartup
# 修正启动脚本(含 USER 环境变量 + 等待日志文件)
RUN echo '#!/bin/bash\n\
export USER=docker_qt_user\n\
export HOME=/home/docker_qt_user\n\
export DISPLAY=:1\n\
mkdir -p $HOME/.vnc\n\
vncserver :1 -geometry 1280x800 -depth 24\n\
echo "VNC server started on :1 (port 5901)"\n\
echo "To connect: vncviewer localhost:5901"\n\
# 等待日志文件创建\n\
for i in {1..10}; do\n\
    log_file=$(ls -1 $HOME/.vnc/*.log 2>/dev/null | head -n 1)\n\
    if [ -n "$log_file" ]; then\n\
        echo "Tailing log file: $log_file"\n\
        tail -f "$log_file"\n\
        exit 0\n\
    fi\n\
    sleep 1\n\
done\n\
echo "Warning: no VNC log file found."\n\
exec bash' > /home/docker_qt_user/start_vnc.sh && \
    chmod +x /home/docker_qt_user/start_vnc.sh
#CMD ["/home/docker_qt_user/start_vnc.sh"]
CMD ["startxfce4"]build.sh
            
            
              shell
              
              
            
          
          docker stop qt5.12_ubuntu20.04_env 2>/dev/null || true
docker rm qt5.12_ubuntu20.04_env 2>/dev/null || true
docker build -t qt5.12_ubuntu20.04_env .run_xfce.sh
            
            
              shell
              
              
            
          
          #!/bin/bash
docker stop qt5.12_ubuntu20.04_xfce_docker 2>/dev/null || true
docker rm qt5.12_ubuntu20.04_xfce_docker 2>/dev/null || true
set -e
# 允许 X11 显示(可选)
xhost +local:root
# 启动容器
docker run -it --rm \
    --name qt5.12_ubuntu20.04_xfce_docker \
    --network host \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $HOME:/home/dockeruser/host_home \
    qt5.12_ubuntu20.04_env startxfce4run_vnc.sh
            
            
              shell
              
              
            
          
          #!/bin/bash
docker stop qt5.12_ubuntu20.4_vnc_docker 2>/dev/null || true
docker rm qt5.12_ubuntu20.4_vnc_docker 2>/dev/null || true
set -e
docker run -it --rm \
    --name qt5.12_ubuntu20.4_vnc_docker \
    -p 5901:5901 \
    qt5.12_ubuntu20.04_envkill_xfce.sh
pkill -f xfce; pkill xfce4-session; ps aux | grep xfce三、镜像
编译生成的 docker 镜像: 下载