Is this a new feature request?
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.
Is this a new feature request?
Wanted change
The old images had armv7 support. However, without KASMVNC. Maybe we can somehow establish it?
My current docker-compose
My current Dockerfile
Basically copy pasta from multiple sources; based on the current Dockerfiles
Error Message
Reason for change
Proposed code change
As far as I see the phantomjs needs an armhf alternative.