Spaces:
Paused
Paused
| # Start with a clean, modern base image | |
| FROM archlinux:latest | |
| # --- 1. System Setup & Package Repositories (as root) --- | |
| # Add repositories for a wider selection of packages, including the AUR | |
| RUN echo -e "[multilib]\nInclude = /etc/pacman.d/mirrorlist" >> /etc/pacman.conf \ | |
| && echo -e "[archlinuxcn]\nServer = https://mirrors.aliyun.com/archlinuxcn/\$arch" >> /etc/pacman.conf \ | |
| && echo -e "[chaotic-aur]\nServer = https://geo-mirror.chaotic.cx/\$repo/\$arch" >> /etc/pacman.conf | |
| # CORRECTED KEYRING SETUP (Final, Official Method): | |
| # This uses the official documented procedure for bootstrapping trust. | |
| RUN pacman -Syu --noconfirm --needed git \ | |
| # First, receive and locally sign the key for the Chaotic-AUR maintainer. | |
| && pacman-key --init \ | |
| && pacman-key --recv-key 3056513887B78AEB --keyserver keyserver.ubuntu.com \ | |
| && pacman-key --lsign-key 3056513887B78AEB \ | |
| # Then, use pacman -U to install the keyring and mirrorlist directly from the URL. This is the most robust method. | |
| && pacman -U --noconfirm 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst' \ | |
| # Now, handle the archlinuxcn keyring. | |
| && pacman-key --lsign-key "farseerfc@archlinux.org" \ | |
| && pacman -Sy --noconfirm archlinuxcn-keyring \ | |
| # Final sync and update to ensure everything is consistent | |
| && pacman -Syu --noconfirm | |
| # --- 2. Install System-Level Packages (as root) --- | |
| # Now that keys are trusted, install yay and all other essential development tools | |
| RUN pacman -S --noconfirm yay \ | |
| && yay -S --noconfirm \ | |
| # --- The Core Application --- | |
| code-server \ | |
| # --- Core Build & System Tools --- | |
| base-devel \ | |
| clang \ | |
| cmake \ | |
| gcc \ | |
| git \ | |
| git-lfs \ | |
| openssh \ | |
| pkgconf \ | |
| # --- Language Toolchains --- | |
| go \ | |
| tinygo \ | |
| rust \ | |
| zig \ | |
| deno \ | |
| nodejs \ | |
| npm \ | |
| bun \ | |
| python \ | |
| python-pip \ | |
| rye \ | |
| # --- CLI Quality of Life --- | |
| aria2 \ | |
| curl \ | |
| direnv \ | |
| fish \ | |
| fisher \ | |
| fzf \ | |
| htop \ | |
| jq \ | |
| p7zip \ | |
| ripgrep \ | |
| screen \ | |
| tldr \ | |
| unzip \ | |
| wget \ | |
| zip \ | |
| # --- AI & Cloud Tools --- | |
| github-cli \ | |
| cloudflared \ | |
| # --- Misc --- | |
| nix \ | |
| pkgfile \ | |
| && yay -Scc --noconfirm \ | |
| && rm -rf /var/cache/pacman/* | |
| # --- 3. Install Global NPM Packages (as root) --- | |
| # Install global command-line tools using npm | |
| RUN npm install -g \ | |
| pnpm \ | |
| @google/gemini-cli \ | |
| @anthropic-ai/claude-code \ | |
| @musistudio/claude-code-router \ | |
| opencode-ai@latest | |
| # --- 4. System Configuration (as root) --- | |
| # Install git-lfs for large file support in git | |
| RUN git lfs install | |
| # Set up pnpm | |
| RUN corepack prepare pnpm@latest && corepack enable pnpm | |
| # Update pkgfile database | |
| RUN pkgfile --update | |
| # --- 5. User Setup (as root) --- | |
| # Create the user 'arctic' with a home directory and set the default shell to fish | |
| RUN useradd -m -s /usr/bin/fish arctic | |
| # --- 6. Switch to User & User-Specific Setup --- | |
| # All subsequent commands will run as the 'arctic' user | |
| USER arctic | |
| WORKDIR /home/arctic | |
| # Create the .ssh directory to prevent warnings from fish plugins | |
| RUN mkdir -p /home/arctic/.ssh | |
| # Install plugins for the fish shell | |
| RUN plugins=( \ | |
| "danhper/fish-ssh-agent" \ | |
| "jethrokuan/z" \ | |
| "franciscolourenco/done" \ | |
| "jorgebucaran/autopair.fish" \ | |
| ) \ | |
| && for plugin in "${plugins[@]}"; do \ | |
| fish -c "fisher install $plugin"; \ | |
| done | |
| # Set up rye (Python environment manager) | |
| RUN rye toolchain register /usr/bin/python | |
| # --- 7. VS Code / Code-Server Setup (as user) --- | |
| # Create the config directory and file for code-server | |
| RUN mkdir -p /home/arctic/.config/code-server/ \ | |
| && touch /home/arctic/.config/code-server/config.yaml \ | |
| && echo -e "bind-addr: 0.0.0.0:8080\nauth: password\ncert: false" > /home/arctic/.config/code-server/config.yaml | |
| # Install the selected VS Code extensions | |
| RUN extensions=( \ | |
| # General & UI | |
| "aaron-bond.better-comments" \ | |
| "alefragnani.bookmarks" \ | |
| "antfu.browse-lite" \ | |
| "codezombiech.gitignore" \ | |
| "davidanson.vscode-markdownlint" \ | |
| "dbaeumer.vscode-eslint" \ | |
| "eamodio.gitlens" \ | |
| "editorconfig.editorconfig" \ | |
| "esbenp.prettier-vscode" \ | |
| "formulahendry.auto-close-tag" \ | |
| "formulahendry.auto-rename-tag" \ | |
| "gruntfuggly.todo-tree" \ | |
| "mhutchie.git-graph" \ | |
| "mkhl.direnv" \ | |
| "oderwat.indent-rainbow" \ | |
| "redhat.vscode-yaml" \ | |
| "tamasfe.even-better-toml" \ | |
| "timonwong.shellcheck" \ | |
| "wayou.vscode-todo-highlight" \ | |
| # Python | |
| "ms-python.python" \ | |
| "ms-python.vscode-pylance" \ | |
| "ms-python.black-formatter" \ | |
| "ms-toolsai.jupyter" \ | |
| "ms-toolsai.jupyter-keymap" \ | |
| "ms-toolsai.jupyter-renderers" \ | |
| "njpwerner.autodocstring" \ | |
| # AI Assistants | |
| "saoudrizwan.claude-dev" \ | |
| "RooVeterinaryInc.roo-cline" \ | |
| "Google.geminicodeassist" \ | |
| "robertpiosik.gemini-coder" \ | |
| # Git & GitHub | |
| "donjayamanne.githistory" \ | |
| "github.codespaces" \ | |
| "github.remotehub" \ | |
| "github.vscode-github-actions" \ | |
| # C/C++/Rust/Go | |
| "ms-vscode.cpptools-extension-pack" \ | |
| "rust-lang.rust-analyzer" \ | |
| "golang.go" \ | |
| "msyrus.go-doc" \ | |
| "swellaby.rust-pack" \ | |
| "twxs.cmake" \ | |
| # Web & Node.js | |
| "antfu.vite" \ | |
| "christian-kohler.npm-intellisense" \ | |
| "christian-kohler.path-intellisense" \ | |
| "misterj.vue-volar-extention-pack" \ | |
| "vue.volar" \ | |
| # Other Tools | |
| "bbenoist.nix" \ | |
| "jeff-hykin.better-dockerfile-syntax" \ | |
| "redhat.vscode-xml" \ | |
| "syler.sass-indented" \ | |
| "visualstudioexptteam.vscodeintellicode" \ | |
| "vitest.explorer" \ | |
| ) \ | |
| && for extension in "${extensions[@]}"; do \ | |
| code-server --config /home/arctic/.config/code-server/config.yaml --install-extension "$extension"; \ | |
| done | |
| # --- 8. Finalization --- | |
| # Expose the port that code-server will run on | |
| EXPOSE 8080 | |
| # The command to run when the container starts | |
| CMD ["code-server", "--config", "/home/arctic/.config/code-server/config.yaml"] |