# Dockerfile.coder FROM lscr.io/linuxserver/code-server:latest ENV CS_DISABLE_FILE_LOGS=1 ENV PUID=1000 PGID=1000 # Copy the s6 service definitions with proper ordering COPY ./coder_s6_services/20-docker-start/ /etc/services.d/20-docker-start/ COPY ./coder_s6_services/30-env-merge/ /etc/services.d/30-env-merge/ COPY ./coder_s6_services/40-shell-history/ /etc/services.d/40-shell-history/ COPY ./coder_s6_services/50-superclaude/ /etc/services.d/50-superclaude/ COPY ./coder_s6_services/90-install-extensions/ /etc/services.d/90-install-extensions/ COPY ./coder_s6_services/99-coder-agent/ /etc/services.d/99-coder-agent/ COPY ./scripts /home/coder/scripts # Copy configuration files into the image COPY ./workspace_defaults/roo /home/coder/.roo COPY ./workspace_defaults/claude/CLAUDE.md /home/coder/CLAUDE.md COPY ./workspace_defaults/roo/roomodes /home/coder/.roomodes COPY ./workspace_defaults/roo/rooignore /home/coder/.rooignore # Copy the updated extensions list COPY ./extensions.txt /etc/vscode-extensions.txt # Set correct ownership for the copied files RUN chown -R 1000:1000 /home/coder/ /home/coder/CLAUDE.md /home/coder/.roomodes /home/coder/.rooignore # Verify files, set permissions, and install necessary packages RUN \ echo "--- Verifying copied files and setting permissions ---" && \ \ echo "Checking for numbered s6 services..." && \ for service in 20-docker-start 30-env-merge 40-shell-history 50-superclaude 90-install-extensions 99-coder-agent; do \ if [ ! -f /etc/services.d/$service/run ]; then \ echo "ERROR: $service/run is missing!"; \ exit 1; \ fi; \ chmod +x /etc/services.d/$service/run; \ if [ -f /etc/services.d/$service/finish ]; then \ chmod +x /etc/services.d/$service/finish; \ fi; \ echo "✓ $service service OK."; \ done && \ \ echo "Checking for extensions.txt..." && \ if [ ! -s /etc/vscode-extensions.txt ]; then echo "ERROR: /etc/vscode-extensions.txt is missing or empty!"; exit 1; fi && \ echo "✓ extensions.txt OK. Contents:" && \ cat /etc/vscode-extensions.txt && \ \ echo "Checking for diagnostics.sh..." && \ if [ ! -s /home/coder/scripts/diagnostics.sh ]; then echo "ERROR: /home/coder/scripts/diagnostics.sh is missing or empty!"; exit 1; fi && \ chmod +x /home/coder/scripts/diagnostics.sh && \ echo "✓ diagnostics.sh OK." && \ \ echo "--- File verification and permissions set successfully ---" && \ \ # Install Node.js, vim, and git at build time echo "--- Installing Node.js, vim, and git ---" && \ apt-get update && \ curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ apt-get install -y nodejs vim git && \ \ # Install Docker and dependencies echo "--- Installing Docker and dependencies ---" && \ apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release \ iptables \ kmod \ fuse-overlayfs \ bridge-utils \ systemd \ dbus && \ \ # Add Docker's official GPG key install -m 0755 -d /etc/apt/keyrings && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ chmod a+r /etc/apt/keyrings/docker.gpg && \ \ # Add Docker repository echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ \ # Install Docker apt-get update && \ apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \ \ # Create docker group and add abc user (linuxserver.io default user) groupadd -f docker && \ usermod -aG docker abc && \ \ # Create Docker config directories mkdir -p /etc/docker && \ mkdir -p /home/coder/.docker && \ \ # Configure Docker daemon for workspace environment echo '{ \ "storage-driver": "overlay2", \ "storage-opts": ["overlay2.override_kernel_check=true"], \ "log-driver": "json-file", \ "log-opts": { \ "max-size": "10m", \ "max-file": "3" \ }, \ "features": { \ "buildkit": true \ } \ }' > /etc/docker/daemon.json && \ \ # Create fallback configuration for non-privileged mode echo '{ \ "storage-driver": "vfs", \ "iptables": false, \ "bridge": "none", \ "ip-masq": false, \ "features": { \ "buildkit": true \ } \ }' > /etc/docker/daemon-unprivileged.json && \ \ # Clean up apt-get clean && \ rm -rf /var/lib/apt/lists/*