1. 使用目的
- 在ubuntu 22.04上编译的Qt6 Qml项目使用的glibc版本比较新,本身的项目代码没有涉及到新的系统固件的东西,但是手动降低glibc版本又比较烦琐,所以基于docker制作部署脚本
- 本文只描述如何在Docker里安装qt6 qml
- 如果想参考项目打包和部署,可以看这个仓库
https://gitee.com/aprogrotess/qt6-auto-deploy-docker/tree/master
2. 项目参考
- https://github.com/state-of-the-art/qt6-docker
3. 注意事项
- 在按照步骤4打包好docker后,需要/bin/bash进入容器后, export环境变量
- 加入bin是为了编译qml的语言相关内容,lib_path则是动态库位置
export PATH=$PATH:/opt/Qt/6.6.3/gcc_64/bin
export LD_LIBRARY_PATH=/opt/Qt/6.6.3/gcc_64/lib:/usr/lib/x86_64-linux-gnu
4. docker相关文件
Dockerfile:
# Image: stateoftheartio/qt6:6.6-gcc-aqt
FROM ubuntu:20.04
MAINTAINER State Of The Art <docker@state-of-the-art.io> (@stateoftheartio)
# PIP requirement like "aqtinstall==2.0.6" or url with egg file
ARG AQT_VERSION="aqtinstall==3.1.7"
ARG QT_VERSION=6.6.3
ARG QT_PATH=/opt/Qt
ARG ADDITIONAL_PACKAGES="sudo git openssh-client ca-certificates build-essential curl python3 locales patchelf"
ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true \
QT_VERSION=${QT_VERSION} \
AQT_VERSION=${AQT_VERSION} \
QT_PATH=${QT_PATH} \
QT_GCC=${QT_PATH}/${QT_VERSION}/gcc_64 \
PATH=${QT_PATH}/Tools/CMake/bin:${QT_PATH}/Tools/Ninja:${QT_PATH}/${QT_VERSION}/gcc_64/bin:$PATH
COPY get_qt.sh install_packages.sh /tmp/
# Get Qt binaries with aqt
RUN /tmp/get_qt.sh
# Install the required packages
RUN /tmp/install_packages.sh
# Reconfigure locale
# RUN locale-gen en_US.UTF-8 && dpkg-reconfigure locales
ENV LANG C.UTF-8
get_qt.sh:
#!/bin/sh -xe
# Script to install Qt 6 in docker container
[ "$AQT_VERSION" ] || AQT_VERSION=aqtinstall
[ "$QT_VERSION" ] || exit 1
[ "$QT_PATH" ] || QT_PATH=/opt/Qt
root_dir=$PWD
[ "$root_dir" != '/' ] || root_dir=""
# Init the package system
apt update
echo
echo '--> Save the original installed packages list'
echo
dpkg --get-selections | cut -f 1 > /tmp/packages_orig.lst
echo
echo '--> Install the required packages to install Qt'
echo
apt install -y git python3-pip libglib2.0-0
pip3 install --no-cache-dir "$AQT_VERSION" -i https://mirror.baidu.com/pypi/simple
echo
echo '--> Download & install the Qt library using aqt'
echo
aqt install-qt -O "$QT_PATH" linux desktop "$QT_VERSION" gcc_64 -m all
aqt install-tool -O "$QT_PATH" linux desktop tools_cmake
aqt install-tool -O "$QT_PATH" linux desktop tools_ninja
install_packages.sh
#!/bin/sh -xe
[ "$QT_PATH" ] || QT_PATH=/opt/Qt
[ "$ADDITIONAL_PACKAGES" ] || ADDITIONAL_PACKAGES='build-essential ninja-build'
# Init package system
apt update
echo
echo '--> Locating the shared libs required for the installed tools'
echo
find "$QT_PATH" /usr/local -executable -type f -o -name '*.so' | xargs ldd 2>/dev/null | \
grep -F '=> not found' | tr '\t' ' ' | cut -d' ' -f2 | sort -u | tee /tmp/not_found_libs.lst
echo
echo '--> Locating packages to provide the required shared libs'
echo
apt install -y apt-file
apt-file update
while read line ; do apt-file find $line | grep '^lib' | head -1; done < /tmp/not_found_libs.lst | tee /tmp/to_install_libs.lst
# TODO: Clean apt-file cache
apt autoremove -y --purge apt-file
echo
echo '--> Install the found libraries'
echo
cat /tmp/to_install_libs.lst | cut -d: -f 1 | xargs apt install -y --no-install-suggests --no-install-recommends $ADDITIONAL_PACKAGES
# Complete the cleaning
#apt -qq clean
#rm -rf /var/lib/apt/lists/*