【Docker】【03.使用docker搭建ubuntu20.04 Qt5.12 开发环境】

一、目标

讨论如何使用 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 startxfce4

run_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_env

kill_xfce.sh

复制代码
pkill -f xfce; pkill xfce4-session; ps aux | grep xfce

三、镜像

编译生成的 docker 镜像: 下载

相关推荐
scriptsboy9 小时前
可用 Docker (DockerHub) 国内镜像源加速列表 - 长期维护(截至 2025 年 06 月 15 日)
运维·docker·容器
YZD08269 小时前
Docker 二进制包的下载与安装
java·docker·eureka
锦年JNian10 小时前
docker常用命令
运维·docker·容器
扶尔魔ocy11 小时前
【QT常用技术讲解】可拖拽文件的Widget--QListWidget
开发语言·qt
枫叶丹411 小时前
【Qt开发】布局管理器(一)-> QVBoxLayout垂直布局
开发语言·c++·qt
Larry_Yanan11 小时前
QML学习笔记(四十七)QML与C++交互:上下文对象
c++·笔记·qt·学习·ui
专家大圣12 小时前
5分钟启动标准化安卓环境:Docker-Android让模拟器配置不再踩坑
android·网络·docker·容器·内网穿透
winds~13 小时前
【git】docker中无法进行git命令行补全
git·docker·容器
cui_win1 天前
Minikube 安装与使用详细指南(Centos7 踩坑版)
docker·kubernetes·minikube·centos7·升级内核