Skip to content

armv7 / armhf / arm32v7 support #296

@ksaadDE

Description

@ksaadDE

Is this a new feature request?

  • I have searched the existing issues

Wanted change

The old images had armv7 support. However, without KASMVNC. Maybe we can somehow establish it?

My current docker-compose

services:
  webtop:
    #image: linuxserver/webtop:arm32v7-3.2.3-alpine-icewm
    build:
        context: .
    container_name: webtop
    cap_add:
        - SYS_ADMIN
    #security_opt:
        #  - seccomp:unconfined #optional
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - SUBFOLDER=/ #optional
      - TITLE=Webtop #optional
    volumes:
      - ./datapath:/config
      #- /var/run/docker.sock:/var/run/docker.sock #optional
    networks:
      - webtop_network
      - nginx_network
    #ports:
      #  - 3000:3000
      #  - 3001:3001
    #devices:
      #  - /dev/fuse:/dev/fuse
      #  - /dev/dri:/dev/dri #optional
      shm_size: "2gb" #optional
      restart: unless-stopped

#security_opt:
#  - apparmor:unconfined

networks:
   webtop_network:
       name: webtop_network
       external: False

My current Dockerfile

Basically copy pasta from multiple sources; based on the current Dockerfiles

# syntax=docker/dockerfile:1
#https://github.com/linuxserver/docker-baseimage-kasmvnc/blob/master/Dockerfile

FROM node:12-buster AS wwwstage

ARG KASMWEB_RELEASE="46412d23aff1f45dffa83fafb04a683282c8db58"

RUN \
echo "**** build clientside ****" && \
export QT_QPA_PLATFORM=offscreen && \
export QT_QPA_FONTDIR=/usr/share/fonts && \
mkdir /src && \
cd /src && \
wget https://github.com/kasmtech/noVNC/tarball/${KASMWEB_RELEASE} -O - \
| tar  --strip-components=1 -xz && \
npm install && \
npm run-script build

RUN \
echo "**** organize output ****" && \
mkdir /build-out && \
cd /src && \
rm -rf node_modules/ && \
cp -R ./* /build-out/ && \
cd /build-out && \
rm *.md && \
rm AUTHORS && \
cp index.html vnc.html && \
mkdir Downloads

FROM arm32v7/alpine:3.21 AS buildstage

ARG KASMVNC_RELEASE="e04731870baebd2784983fb48197a2416c7d3519"

COPY --from=wwwstage /build-out /www

RUN \
echo "**** install build deps ****" && \
apk add \
alpine-release \
alpine-sdk \
autoconf \
automake \
bash \
ca-certificates \
cmake \
coreutils \
curl \
eudev-dev \
font-cursor-misc \
font-misc-misc \
font-util-dev \
git \
grep \
jq \
libdrm-dev \
libepoxy-dev \
libjpeg-turbo-dev \
libjpeg-turbo-static \
libpciaccess-dev \
libtool \
libwebp-dev \
libx11-dev \
libxau-dev \
libxcb-dev \
libxcursor-dev \
libxcvt-dev \
libxdmcp-dev \
libxext-dev \
libxfont2-dev \
libxkbfile-dev \
libxrandr-dev \
libxshmfence-dev \
libxtst-dev \
mesa-dev \
mesa-dri-gallium \
meson \
nettle-dev \
openssl-dev \
pixman-dev \
procps \
shadow \
tar \
tzdata \
wayland-dev \
wayland-protocols \
xcb-util-dev \
xcb-util-image-dev \
xcb-util-keysyms-dev \
xcb-util-renderutil-dev \
xcb-util-wm-dev \
xinit \
xkbcomp \
xkbcomp-dev \
xkeyboard-config \
xorgproto \
xorg-server-common \
xorg-server-dev \
xtrans

RUN \
echo "**** build libjpeg-turbo ****" && \
mkdir /jpeg-turbo && \
JPEG_TURBO_RELEASE=$(curl -sX GET "https://api.github.com/repos/libjpeg-turbo/libjpeg-turbo/releases/latest" \
| awk '/tag_name/{print $4;exit}' FS='[""]'); \
curl -o \
/tmp/jpeg-turbo.tar.gz -L \
"https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${JPEG_TURBO_RELEASE}.tar.gz" && \
tar xf \
/tmp/jpeg-turbo.tar.gz -C \
/jpeg-turbo/ --strip-components=1 && \
cd /jpeg-turbo && \
MAKEFLAGS=-j`nproc` \
CFLAGS="-fpic" \
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -G"Unix Makefiles" && \
make && \
make install

RUN \
echo "**** build kasmvnc ****" && \
git clone https://github.com/kasmtech/KasmVNC.git src && \
cd /src && \
git checkout -f ${KASMVNC_release} && \
sed -i \
-e '/find_package(FLTK/s@^@#@' \
-e '/add_subdirectory(tests/s@^@#@' \
CMakeLists.txt && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DBUILD_VIEWER:BOOL=OFF \
-DENABLE_GNUTLS:BOOL=OFF \
. && \
make -j4 && \
echo "**** build xorg ****" && \
XORG_VER="21.1.14" && \
wget --no-check-certificate \
-O /tmp/xorg-server-${XORG_VER}.tar.gz \
"https://www.x.org/archive/individual/xserver/xorg-server-${XORG_VER}.tar.gz" && \
tar --strip-components=1 \
-C unix/xserver \
-xf /tmp/xorg-server-${XORG_VER}.tar.gz && \
cd unix/xserver && \
patch -Np1 -i ../xserver21.patch && \
patch -s -p0 < ../CVE-2022-2320-v1.20.patch && \
autoreconf -i && \
./configure \
--disable-config-hal \
--disable-config-udev \
--disable-dmx \
--disable-dri \
--disable-dri2 \
--disable-kdrive \
--disable-static \
--disable-xephyr \
--disable-xinerama \
--disable-xnest \
--disable-xorg \
--disable-xvfb \
--disable-xwayland \
--disable-xwin \
--enable-dri3 \
--enable-glx \
--prefix=/opt/kasmweb \
--with-default-font-path="/usr/share/fonts/X11/misc,/usr/share/fonts/X11/cyrillic,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins" \
--without-dtrace \
--with-sha1=libcrypto \
--with-xkb-bin-directory=/usr/bin \
--with-xkb-output=/var/lib/xkb \
--with-xkb-path=/usr/share/X11/xkb && \
find . -name "Makefile" -exec sed -i 's/-Werror=array-bounds//g' {} \; && \
make -j4

RUN \
echo "**** generate final output ****" && \
cd /src && \
mkdir -p xorg.build/bin && \
cd xorg.build/bin/ && \
ln -s /src/unix/xserver/hw/vnc/Xvnc Xvnc && \
cd .. && \
mkdir -p man/man1 && \
touch man/man1/Xserver.1 && \
cp /src/unix/xserver/hw/vnc/Xvnc.man man/man1/Xvnc.1 && \
mkdir lib && \
cd lib && \
ln -s /usr/lib/xorg/modules/dri dri && \
cd /src && \
mkdir -p builder/www && \
cp -ax /www/* builder/www/ && \
make servertarball && \
mkdir /build-out && \
tar xzf \
kasmvnc-Linux*.tar.gz \
-C /build-out/

# nodejs builder
FROM arm32v7/alpine:3.21 AS nodebuilder
ARG KCLIENT_RELEASE

RUN \
echo "**** install build deps ****" && \
apk add --no-cache \
alpine-sdk \
curl \
cmake \
g++ \
gcc \
make \
nodejs \
npm \
pulseaudio-dev \
python3

RUN \
echo "**** grab source ****" && \
mkdir -p /kclient && \
if [ -z ${KCLIENT_RELEASE+x} ]; then \
KCLIENT_RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/kclient/releases/latest" \
| awk '/tag_name/{print $4;exit}' FS='[""]'); \
fi && \
curl -o \
/tmp/kclient.tar.gz -L \
"https://github.com/linuxserver/kclient/archive/${KCLIENT_RELEASE}.tar.gz" && \
tar xf \
/tmp/kclient.tar.gz -C \
/kclient/ --strip-components=1

RUN \
echo "**** install node modules ****" && \
cd /kclient && \
npm install && \
rm -f package-lock.json

# runtime stage
FROM arm32v7/alpine:3.21

# set version label https://raw.githubusercontent.com/linuxserver/docker-webtop/refs/heads/master/Dockerfile
ARG BUILD_DATE
ARG VERSION
ARG KASMBINS_RELEASE="1.15.0"
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="thelamer"
LABEL "com.kasmweb.image"="true"

# env
ENV DISPLAY=:1 \
PERL5LIB=/usr/local/bin \
OMP_WAIT_POLICY=PASSIVE \
GOMP_SPINCOUNT=0 \
HOME=/config \
START_DOCKER=true \
PULSE_RUNTIME_PATH=/defaults \
NVIDIA_DRIVER_CAPABILITIES=all

# copy over build output
COPY --from=nodebuilder /kclient /kclient
COPY --from=buildstage /build-out/ /

RUN \
echo "**** install deps ****" && \
apk add --no-cache \
bash \
ca-certificates \
cups \
cups-client \
dbus-x11 \
docker \
docker-cli-compose \
dunst \
ffmpeg \
font-noto \
font-noto-emoji \
fuse-overlayfs \
gcompat \
intel-media-driver \
iproute2-minimal \
lang \
libgcc \
libgomp \
libjpeg-turbo \
libnotify \
libstdc++ \
libwebp \
libxfont2 \
libxshmfence \
mcookie \
mesa \
mesa-dri-gallium \
mesa-gbm \
mesa-gl \
mesa-va-gallium \
mesa-vulkan-ati \
mesa-vulkan-intel \
mesa-vulkan-layers \
mesa-vulkan-swrast \
nginx \
nodejs \
openbox \
openssh-client \
openssl \
pciutils-libs \
perl \
perl-datetime \
perl-hash-merge-simple \
perl-list-moreutils \
perl-switch \
perl-try-tiny \
perl-yaml-tiny \
pixman \
pulseaudio \
pulseaudio-utils \
py3-xdg \
python3 \
setxkbmap \
sudo \
tar \
vulkan-tools \
xauth \
xf86-video-amdgpu \
xf86-video-ati \
xf86-video-intel \
xf86-video-nouveau \
xf86-video-qxl \
xkbcomp \
xkeyboard-config \
xterm && \
apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \
cups-pdf && \
echo "**** printer config ****" && \
sed -i \
"s:^#Out.*:Out /home/kasm-user/PDF:" \
/etc/cups/cups-pdf.conf && \
sed -i \
's/^SystemGroup .*/SystemGroup lpadmin root/' \
/etc/cups/cups-files.conf && \
echo "**** filesystem setup ****" && \
ln -s /usr/local/share/kasmvnc /usr/share/kasmvnc && \
ln -s /usr/local/etc/kasmvnc /etc/kasmvnc && \
ln -s /usr/local/lib/kasmvnc /usr/lib/kasmvncserver && \
echo "**** openbox tweaks ****" && \
sed -i \
-e 's/NLIMC/NLMC/g' \
-e 's|</applications>|  <application class="*"><maximized>yes</maximized></application>\n</applications>|' \
-e 's|</keyboard>|  <keybind key="C-S-d"><action name="ToggleDecorations"/></keybind>\n</keyboard>|' \
/etc/xdg/openbox/rc.xml && \
echo "**** user perms ****" && \
echo "abc:abc" | chpasswd && \
usermod -s /bin/bash abc && \
echo '%wheel ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/wheel && \
adduser abc wheel && \
echo "**** proot-apps ****" && \
mkdir /proot-apps/ && \
PAPPS_RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/proot-apps/releases/latest" \
| awk '/tag_name/{print $4;exit}' FS='[""]') && \
curl -L https://github.com/linuxserver/proot-apps/releases/download/${PAPPS_RELEASE}/proot-apps-x86_64.tar.gz \
| tar -xzf - -C /proot-apps/ && \
echo "${PAPPS_RELEASE}" > /proot-apps/pversion && \
echo "**** kasm support ****" && \
useradd \
-u 1000 -U \
-d /home/kasm-user \
-s /bin/bash kasm-user && \
echo "kasm-user:kasm" | chpasswd && \
adduser kasm-user wheel && \
mkdir -p /home/kasm-user && \
chown 1000:1000 /home/kasm-user && \
mkdir -p /var/run/pulse && \
chown 1000:root /var/run/pulse && \
mkdir -p /kasmbins && \
curl -s https://kasm-ci.s3.amazonaws.com/kasmbins-amd64-${KASMBINS_RELEASE}.tar.gz \
| tar xzvf - -C /kasmbins/ && \
chmod +x /kasmbins/* && \
chown -R 1000:1000 /kasmbins && \
chown 1000:1000 /usr/share/kasmvnc/www/Downloads && \
mkdir -p /dockerstartup && \
echo "**** dind support ****" && \
addgroup -S dockremap && \
adduser -S -G dockremap dockremap && \
echo 'dockremap:165536:65536' >> /etc/subuid && \
echo 'dockremap:165536:65536' >> /etc/subgid && \
curl -o \
/usr/local/bin/dind -L \
https://raw.githubusercontent.com/moby/moby/master/hack/dind && \
chmod +x /usr/local/bin/dind && \
usermod -aG docker abc && \
echo 'hosts: files dns' > /etc/nsswitch.conf && \
echo "**** theme ****" && \
curl -s https://raw.githubusercontent.com/thelamer/lang-stash/master/theme.tar.gz \
| tar xzvf - -C /usr/share/themes/Clearlooks/openbox-3/ && \
echo "**** cleanup ****" && \
rm -rf \
/tmp/*

# add local files
COPY /root /

# ports and volumes
EXPOSE 3000 3001
VOLUME /config

# set version label
FROM wwwstage
ARG BUILD_DATE
ARG VERSION
ARG XFCE_VERSION
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
LABEL maintainer="thelamer"

# title
ENV TITLE="Alpine XFCE"

RUN \
echo "**** add icon ****" && \
curl -o \
/kclient/public/icon.png \
https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/webtop-logo.png && \
echo "**** install packages ****" && \
apk add --no-cache \
chromium \
faenza-icon-theme \
faenza-icon-theme-xfce4-appfinder \
faenza-icon-theme-xfce4-panel \
mousepad \
ristretto \
thunar \
util-linux-misc \
xfce4 \
xfce4-terminal && \
echo "**** cleanup ****" && \
rm -f \
/etc/xdg/autostart/xfce4-power-manager.desktop \
/etc/xdg/autostart/xscreensaver.desktop \
/usr/share/xfce4/panel/plugins/power-manager-plugin.desktop && \
rm -rf \
/config/.cache \
/tmp/*

# add local files
COPY /root /

# ports and volumes
EXPOSE 3000

VOLUME /config

Error Message

[+] Building 302.4s (8/11)                                                                                                                                                     docker:default
=> [webtop internal] load build definition from Dockerfile                                                                                                                              0.1s
=> => transferring dockerfile: 11.74kB                                                                                                                                                  0.0s
=> [webtop] resolve image config for docker-image://docker.io/docker/dockerfile:1                                                                                                       2.0s
=> CACHED [webtop] docker-image://docker.io/docker/dockerfile:1@sha256:4c68376a702446fc3c79af22de146a148bc3367e73c25a5803d453b6b3f722fb                                                 0.0s
=> [webtop internal] load metadata for docker.io/library/node:12-buster                                                                                                                 0.8s
=> [webtop internal] load .dockerignore                                                                                                                                                 0.1s
=> => transferring context: 2B                                                                                                                                                          0.0s
=> CACHED [webtop wwwstage 1/3] FROM docker.io/library/node:12-buster@sha256:ce791f92b445f8968c6739fff3bb88c1eaf139513158e6be65a48087388648cb                                           0.0s
=> [webtop internal] load build context                                                                                                                                                 0.3s
=> => transferring context: 6.52kB                                                                                                                                                      0.1s
=> ERROR [webtop wwwstage 2/3] RUN   echo "**** build clientside ****" &&   export QT_QPA_PLATFORM=offscreen &&   export QT_QPA_FONTDIR=/usr/share/fonts &&   mkdir /src &&   cd /sr  296.4s
------
> [webtop wwwstage 2/3] RUN   echo "**** build clientside ****" &&   export QT_QPA_PLATFORM=offscreen &&   export QT_QPA_FONTDIR=/usr/share/fonts &&   mkdir /src &&   cd /src &&   wget https://github.com/kasmtech/noVNC/tarball/46412d23aff1f45dffa83fafb04a683282c8db58 -O -     | tar  --strip-components=1 -xz &&   npm install &&   npm run-script build:
1.291 **** build clientside ****
2.019 --2025-03-13 16:04:01--  https://github.com/kasmtech/noVNC/tarball/46412d23aff1f45dffa83fafb04a683282c8db58
2.146 Resolving github.com (github.com)... 140.82.121.4
2.218 Connecting to github.com (github.com)|140.82.121.4|:443... connected.
2.405 HTTP request sent, awaiting response... 302 Found
2.626 Location: https://codeload.github.com/kasmtech/noVNC/legacy.tar.gz/46412d23aff1f45dffa83fafb04a683282c8db58 [following]
2.626 --2025-03-13 16:04:01--  https://codeload.github.com/kasmtech/noVNC/legacy.tar.gz/46412d23aff1f45dffa83fafb04a683282c8db58
2.626 Resolving codeload.github.com (codeload.github.com)... 140.82.121.10
2.659 Connecting to codeload.github.com (codeload.github.com)|140.82.121.10|:443... connected.
2.838 HTTP request sent, awaiting response... 200 OK
3.049 Length: unspecified [application/x-gzip]
3.049 Saving to: 'STDOUT'
3.049
3.049      0K .......... .......... .......... .......... .......... 1003K
3.099     50K .......... .......... .......... .......... .......... 2.82M
3.119    100K .......... .......... .......... .......... .......... 2.11M
3.140    150K .......... .......... .......... .......... .......... 3.20M
3.156    200K .......... .......... .......... .......... .......... 2.23M
3.177    250K .......... .......... .......... .......... .......... 1.78M
3.206    300K .......... .......... .......... .......... .......... 3.24M
3.219    350K .......... .......... .......... .......... .......... 1.38M
3.254    400K .......... .......... .......... .......... ..........  906K
3.309    450K .......... .......... .......... .......... ..........  677K
3.387    500K .......... .......... .......... .......... .......... 1.36M
3.422    550K .......... .......... .......... .......... .......... 2.00M
3.446    600K .......... .......... .......... .......... .......... 2.08M
3.469    650K .......... .......... .......... .......... .......... 1.92M
3.498    700K .......... .......... .......... .......... .......... 2.16M
3.517    750K .......... .......... .......... .......... .......... 1.82M
3.546    800K .......... .......... .......... .......... .......... 1.91M
3.570    850K .......... .......... .......... .......... .......... 2.21M
3.590    900K .......... .......... .......... .......... .......... 2.34M
3.612    950K .......... .......... .......... .......... .......... 2.16M
3.635   1000K .......... .......... .......... .......... .......... 1.80M
3.661   1050K .......... .......... .......... .......... .......... 2.30M
3.682   1100K .......... .......... .......... .......... .......... 2.21M
3.704   1150K .......... .......... .......... .......... .......... 2.13M
3.727   1200K .......... .......... .......... .......... .......... 2.24M
3.749   1250K .......... .......... .......... .......... .......... 2.24M
3.771   1300K .......... .......... .......... .......... .......... 3.42M
3.809   1350K .......... .......... .......... .......... ..........  648K
3.864   1400K .......... .......... .......... .......... .......... 1023K
3.949   1450K .......... .......... .......... .......... ..........  884K
3.969   1500K .......... .......... .......... .......... .          1.47M=0.9s
3.995
3.995 2025-03-13 16:04:03 (1.59 MB/s) - written to stdout [1578470]
3.995
12.38 npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!
277.3
277.3 > phantomjs-prebuilt@2.1.16 install /src/node_modules/phantomjs-prebuilt
277.3 > node install.js
277.3
281.8 PhantomJS not found on PATH
281.9 Unexpected platform or architecture: linux/arm
281.9 It seems there is no binary available for your platform/architecture
281.9 Try to install PhantomJS globally
293.8 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules/watchpack-chokidar2/node_modules/fsevents):
293.8 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})
294.1 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules/fsevents):
294.1 npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})
294.1
294.1 npm ERR! code ELIFECYCLE
294.1 npm ERR! errno 1
294.2 npm ERR! phantomjs-prebuilt@2.1.16 install: `node install.js`
294.2 npm ERR! Exit status 1
294.2 npm ERR!
294.2 npm ERR! Failed at the phantomjs-prebuilt@2.1.16 install script.
294.2 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
294.6
294.6 npm ERR! A complete log of this run can be found in:
294.6 npm ERR!     /root/.npm/_logs/2025-03-13T16_xx_xx_695Z-debug.log
------
failed to solve: process "/bin/sh -c echo \"**** build clientside ****\" &&   export QT_QPA_PLATFORM=offscreen &&   export QT_QPA_FONTDIR=/usr/share/fonts &&   mkdir /src &&   cd /src &&   wget https://github.com/kasmtech/noVNC/tarball/${KASMWEB_RELEASE} -O -     | tar  --strip-components=1 -xz &&   npm install &&   npm run-script build" did not complete successfully: exit code: 1

Reason for change

  • armhf / arm32v7 / armv7 is still in use by RPIs - invalidating still working and usable hardware, especially in home projects

Proposed code change

As far as I see the phantomjs needs an armhf alternative.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions