Hello Toradex Community
We want to switch from a Torizon-CMake Project to a Torizon-Qt6 Projekt. So we startet a C++ Qt QML Application project, because this is the only Qt6 Template-Project - dispide we only want to create a headless application.
im working with the following setup:
- Verdin AM62 1GB WB IT (V1.1A)
- Verdin Development Board (V1.1F)
- TorizonCore Version: 6.5.0+build.8
- Host-System Win 10 (WSL2)
We tried to throw all unrequired GUI stuff out to slim down the Docker-Image size. Here is an overview of the image sizes:
cMake | Qt6 (default) | Qt6 (slimed down) | |
---|---|---|---|
Debug | 150MB | 750MB | 640MB |
Release | 100MB | 680MB | 540MB |
I know the Qt stuff is heavy, but 600MB? … i doubt it.
Question:
- What else can I do to slim down the Image size?
- Is there an other base than
FROM --platform=linux/${IMAGE_ARCH} torizon/qt6-wayland${GPU}:${BASE_VERSION}
which can be used?
In the Dockerfile
we commented out the following:
- ARG GPU
- apt-get install of
imx-gpu-viv-wayland-dev
orlibgl
stuff - apt-get install of
qt6-wayland
andqml6
stuff
Here is my modified Dockerfile
(same changes apply to Dockerfile.debug
and Dockerfile.sdk
):
# ARGUMENTS --------------------------------------------------------------------
##
# SDK container version
##
ARG SDK_BASE_VERSION=3
##
# Base container version
##
ARG BASE_VERSION=3
##
# Board architecture
##
ARG IMAGE_ARCH=
##
# Board GPU vendor prefix
##
ARG GPU=
##
# Directory of the application inside container
##
ARG APP_ROOT=
# BUILD ------------------------------------------------------------------------
# TODO: cross compile x86 to arm
# We will use emulation here
##
# Build Step
##
FROM --platform=linux/${IMAGE_ARCH} \
torizon/qt6-wayland${GPU}:${SDK_BASE_VERSION} AS Build
ARG IMAGE_ARCH
#ARG GPU
ARG APP_ROOT
# for vivante GPU we need some "special" sauce
#RUN apt-get -q -y update && \
# if [ "${GPU}" = "-vivante" ] || [ "${GPU}" = "-imx8" ]; then \
# apt-get -q -y install \
# imx-gpu-viv-wayland-dev \
# ; else \
# apt-get -q -y install \
# libgl1 \
# libgles-dev \
# ; fi \
# && \
# apt-get clean && apt-get autoremove && \
# rm -rf /var/lib/apt/lists/*
# __deps__
RUN apt-get -q -y update && \
apt-get -q -y install \
build-essential \
cmake \
# qt6-base-private-dev \
qt6-base-dev \
# qt6-wayland \
# qt6-wayland-dev \
# qt6-declarative-dev \
# qt6-declarative-private-dev \
# qml6-module-qtqml \
# qml6-module-qtqml-workerscript \
# qml6-module-qtcore \
# qml6-module-qtquick \
# qml6-module-qtquick-window \
# qml6-module-qtquick-controls \
# qml6-module-qtquick-layouts \
# qml6-module-qtquick-templates \
# libqt6opengl6-dev \
# ADD YOUR PACKAGES HERE
# DO NOT REMOVE THIS LABEL: this is used for VS Code automation
# __torizon_packages_dev_start__
libssl-dev:arm64 \
libasio-dev:arm64 \
# __torizon_packages_dev_end__
# DO NOT REMOVE THIS LABEL: this is used for VS Code automation
&& \
apt-get clean && apt-get autoremove && \
rm -rf /var/lib/apt/lists/*
# __deps__
COPY . ${APP_ROOT}
WORKDIR ${APP_ROOT}
# Remove the code from the debug builds, inside this container, to build the
# release version from a clean build
RUN rm -rf ${APP_ROOT}/build-${IMAGE_ARCH}
RUN if [ "$IMAGE_ARCH" = "arm64" ] ; then \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -Bbuild-${IMAGE_ARCH} ; \
elif [ "$IMAGE_ARCH" = "arm" ] ; then \
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -Bbuild-${IMAGE_ARCH} ; \
fi
RUN cmake --build build-${IMAGE_ARCH}
# BUILD ------------------------------------------------------------------------
# DEPLOY -----------------------------------------------------------------------
##
# Deploy Step
##
FROM --platform=linux/${IMAGE_ARCH} \
torizon/qt6-wayland${GPU}:${BASE_VERSION} AS Deploy
ARG IMAGE_ARCH
#ARG GPU
ARG APP_ROOT
# SSH for remote debug
EXPOSE 2231
ARG SSHUSERNAME=torizon
# Make sure we don't get notifications we can't answer during building.
ENV DEBIAN_FRONTEND="noninteractive"
# for vivante GPU we need some "special" sauce
#RUN apt-get -q -y update && \
# if [ "${GPU}" = "-vivante" ] || [ "${GPU}" = "-imx8" ]; then \
# apt-get -q -y install \
# imx-gpu-viv-wayland-dev \
# ; else \
# apt-get -q -y install \
# libgl1 \
# libgles-dev \
# ; fi \
# && \
# apt-get clean && apt-get autoremove && \
# rm -rf /var/lib/apt/lists/*
# your regular RUN statements here
# Install required packages
RUN apt-get -q -y update && \
apt-get -q -y install \
file \
curl \
# qt6-base-private-dev \
qt6-base-dev \
# qt6-wayland \
# qt6-wayland-dev \
# qt6-declarative-dev \
# qt6-declarative-private-dev \
# qml6-module-qtqml \
# qml6-module-qtqml-workerscript \
# qml6-module-qtcore \
# qml6-module-qtquick \
# qml6-module-qtquick-window \
# qml6-module-qtquick-controls \
# qml6-module-qtquick-layouts \
# qml6-module-qtquick-templates \
# DO NOT REMOVE THIS LABEL: this is used for VS Code automation
# __torizon_packages_prod_start__
# __torizon_packages_prod_end__
# DO NOT REMOVE THIS LABEL: this is used for VS Code automation
&& \
apt-get clean && apt-get autoremove && \
rm -rf /var/lib/apt/lists/*
USER torizon
# Copy the application compiled in the build step to the $APP_ROOT directory
# path inside the container, where $APP_ROOT is the torizon_app_root
# configuration defined in settings.json.
COPY --from=Build ${APP_ROOT}/build-${IMAGE_ARCH}/bin ${APP_ROOT}
# "cd" (enter) into the APP_ROOT directory
WORKDIR ${APP_ROOT}
# Command executed in runtime when the container starts
CMD ["./UVsmartHVACserver"]
# DEPLOY -----------------------------------------------------------------------
Thank in advance
Uwe