【Docker】【03.使用docker搭建ubuntu20.04 Qt5.12 开发环境】
一、目标
讨论如何使用 docker 搭建 qt5.12 开发环境。
二、Docker
Dockerfile
FROM ubuntu:20.04ENV DEBIAN_FRONTEND=noninteractive
ENV QT_VERSION=5.12.12
ENV WORKSPACE=/workspace
ENV HOME=/home/docker_qt_userENV TZ=Asia/ShanghaiRUN 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/.configUSER 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
docker stop qt5.12_ubuntu20.04_env 2>/dev/null || true
docker rm qt5.12_ubuntu20.04_env 2>/dev/null || truedocker build -t qt5.12_ubuntu20.04_env .
run_xfce.sh
#!/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
#!/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 || trueset -edocker 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 镜像: 下载
