FROM alpine:3.23.4 AS builder RUN apk update && apk upgrade && \ apk add --no-cache make gcc nodejs npm python3 g++ gcc libc-dev expat expat-dev libxml2-dev libxmlb-dev yarn gcompat \ libpq postgresql-dev nodejs-dev graphicsmagick graphicsmagick-dev nginx nginx-mod-http-headers-more && \ rm -rf /var/cache/apk/* RUN mkdir -p /usr/share/vnc-avatar ADD app /usr/share/vnc-avatar/app COPY package.json /usr/share/vnc-avatar/package.json RUN yarn global add node-gyp@9.4.0 RUN cd /usr/share/vnc-avatar && yarn install COPY config/vnc-avatarservice.js /usr/share/vnc-avatar/config/vnc-avatarservice.js COPY 404.html /var/www/localhost/htdocs/404.html # Folder to store the Avatars RUN mkdir /var/opt/out FROM alpine:3.23.4 # graphicsmagick is required at runtime too — the gm npm wrapper shells out to the # `gm`/`convert` binary on every upload; the builder stage has it, but the runtime # stage does not unless we add it here. RUN apk update && apk upgrade && apk add --no-cache nodejs yarn nginx nginx-mod-http-headers-more graphicsmagick && rm -rf /var/cache/apk/* COPY --from=builder /usr/share/vnc-avatar /usr/share/vnc-avatar COPY --from=builder /var/opt/out /var/opt/out RUN addgroup -g 1001 vnc && adduser -D -u 1001 -S -G vnc vnc # Set up necessary directories with correct permissions for the non-root user RUN mkdir -p /var/lib/nginx/tmp /var/log/nginx /var/www/html /etc/nginx/sites-enabled && \ chown -R vnc:vnc /var/lib/nginx /var/log/nginx /var/www/html /etc/nginx/sites-enabled && \ chmod -R 755 /var/lib/nginx /var/log/nginx /var/www/html && \ chown vnc:vnc /var/opt/out RUN mkdir -p /run/nginx/ && chown vnc:vnc /run/nginx/ USER vnc ENTRYPOINT ["node", "/usr/share/vnc-avatar/app/app.js"]