/ computer.Dockerfile
computer.Dockerfile
  1  FROM ubuntu:24.04
  2  ENV DEBIAN_FRONTEND=noninteractive
  3  
  4  # Install System Dependencies
  5  RUN apt update \
  6      && apt install -y \
  7          ca-certificates \
  8          gnupg \
  9          xfce4 \
 10          xfce4-goodies \
 11          x11vnc \
 12          xvfb \
 13          xdotool \
 14          imagemagick \
 15          x11-apps \
 16          dbus-x11 \
 17          sudo \
 18          python3-pip \
 19          python3-tk \
 20          python3-dev \
 21          build-essential \
 22          scrot \
 23          gnome-screenshot \
 24          net-tools \
 25          libx11-dev \
 26          libxext-dev \
 27          libxtst-dev \
 28          libxinerama-dev \
 29          libxmu-dev \
 30          libxrandr-dev \
 31          libxfixes-dev \
 32          software-properties-common \
 33      && add-apt-repository ppa:mozillateam/ppa && apt update \
 34      && apt install -y --no-install-recommends \
 35          # Desktop apps
 36          firefox-esr \
 37          libreoffice \
 38          x11-apps \
 39          xpdf \
 40          gedit \
 41          xpaint \
 42          tint2 \
 43          galculator \
 44          pcmanfm \
 45          unzip \
 46          # Terminal apps like file editors, viewers, git, wget/curl etc.
 47          less \
 48          nano \
 49          neovim \
 50          vim \
 51          git \
 52          curl \
 53          wget \
 54          procps \
 55          # Python/pyenv dependencies
 56          libssl-dev  \
 57          zlib1g-dev \
 58          libbz2-dev \
 59          libreadline-dev \
 60          libsqlite3-dev \
 61          libncursesw5-dev \
 62          xz-utils \
 63          tk-dev \
 64          libxml2-dev \
 65          libxmlsec1-dev \
 66          libffi-dev \
 67          liblzma-dev \
 68      # set default browser
 69      && update-alternatives --set x-www-browser /usr/bin/firefox-esr \
 70      && apt-get clean && rm -rf /var/lib/apt/lists/* \
 71      # remove screen locks, power managers
 72      && apt remove -y light-locker xfce4-screensaver xfce4-power-manager || true
 73  
 74  # Create Computer User
 75  ENV USERNAME=khoj
 76  ENV HOME=/home/$USERNAME
 77  RUN groupadd $USERNAME && \
 78      useradd -m -s /bin/bash -d $HOME -g $USERNAME $USERNAME && \
 79      echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
 80  USER $USERNAME
 81  WORKDIR $HOME
 82  
 83  # Install Python using uv and create a virtual environment
 84  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
 85  ENV PYTHON_VERSION=3.11.6
 86  RUN uv python pin $PYTHON_VERSION
 87  RUN uv venv $HOME/.venv --python $PYTHON_VERSION --seed
 88  RUN echo 'export PATH="$HOME/.venv/bin:$PATH"' >> "$HOME/.bashrc"
 89  ENV PATH="$HOME/.venv/bin:$PATH"
 90  
 91  # Install Python Packages
 92  RUN uv pip install --no-cache-dir \
 93      pyautogui \
 94      Pillow \
 95      pyperclip \
 96      pygetwindow
 97  
 98  # Setup VNC
 99  RUN x11vnc -storepasswd secret /home/khoj/.vncpass
100  
101  ARG WIDTH=1024
102  ARG HEIGHT=768
103  ARG DISPLAY_NUM=99
104  ENV WIDTH=$WIDTH
105  ENV HEIGHT=$HEIGHT
106  ENV DISPLAY_NUM=$DISPLAY_NUM
107  ENV DISPLAY=":$DISPLAY_NUM"
108  
109  # Expose VNC on port 5900
110  EXPOSE 5900
111  
112  # Start Virtual Display (Xvfb), Desktop Manager (XFCE) and Remote Viewer (X11 VNC)
113  CMD ["/bin/sh", "-c", "    \
114      # Create and permission XDG_RUNTIME_DIR with sudo \n\
115      export XDG_RUNTIME_DIR=/run/user/$(id -u); \
116      sudo mkdir -p $XDG_RUNTIME_DIR && \
117      sudo chown $(id -u):$(id -g) $XDG_RUNTIME_DIR && \
118      sudo chmod 0700 $XDG_RUNTIME_DIR; \
119      \
120      # Start Virtual Display \n\
121      Xvfb $DISPLAY -screen 0 ${WIDTH}x${HEIGHT}x24 -dpi 96 -auth /home/$USERNAME/.Xauthority >/dev/null 2>&1 & \
122      sleep 1; \
123      xauth add $DISPLAY . $(mcookie); \
124      \
125      # Start VNC Server \n\
126      x11vnc -display $DISPLAY -forever -rfbauth /home/$USERNAME/.vncpass -listen 0.0.0.0 -rfbport 5900 >/dev/null 2>&1 & \
127      eval $(dbus-launch --sh-syntax) && \
128      startxfce4 & \
129      sleep 2 && echo 'Container running!' && \
130      tail -f /dev/null "]