FROM alpine:latest # --------------------------------------------------------------------------- # 1. SYSTEM PACKAGES # - curl is required for the native Claude Code bash installer # - nodejs / npm / pnpm are NO LONGER needed for Claude Code itself, # but keep them if your project (e.g. Laravel front-end) needs them. # Remove those three lines if you don't need Node in the container. # - libgcc / libstdc++ / ripgrep are required by the native binary on # Alpine (musl-based). Without these the installer will fail. # --------------------------------------------------------------------------- RUN apk add --no-cache \ bash \ ca-certificates \ curl \ tar \ xz \ libgcc \ libstdc++ \ ripgrep \ mariadb-client \ openssh-client \ openssh-client-default \ openssl \ php84 \ php84-bcmath \ php84-bz2 \ php84-curl \ php84-dom \ php84-exif \ php84-fileinfo \ php84-gd \ php84-gettext \ php84-gmp \ php84-iconv \ php84-imap \ php84-intl \ php84-mbstring \ php84-mysqlnd \ php84-pdo \ php84-pdo_mysql \ php84-pdo_pgsql \ php84-pdo_sqlite \ php84-pecl-apcu \ php84-pecl-igbinary \ php84-pecl-grpc \ php84-pecl-lzf \ php84-pecl-maxminddb \ php84-pecl-msgpack \ php84-pecl-redis \ php84-pgsql \ php84-phar \ php84-posix \ php84-session \ php84-simplexml \ php84-soap \ php84-sockets \ php84-sodium \ php84-sqlite3 \ php84-tokenizer \ php84-xml \ php84-xmlreader \ php84-xmlwriter \ php84-zip \ sqlite # --------------------------------------------------------------------------- # 2. INSTALL COMPOSER (essential for PHP) # --------------------------------------------------------------------------- RUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin --filename=composer # --------------------------------------------------------------------------- # 3. NON-ROOT USER # Create a user whose UID/GID matches your host user so that any files # written inside the container are owned by YOU on the host, not root. # # HOW TO USE: # Pass --build-arg HOST_UID=$(id -u) --build-arg HOST_GID=$(id -g) # when you run `docker build`, or hard-code the values below. # # Example build command: # docker build \ # --build-arg HOST_UID=$(id -u) \ # --build-arg HOST_GID=$(id -g) \ # -t my-claude-image . # # Example run command (mount your project into /app): # docker run --rm -it \ # -v "$(pwd)":/app \ # -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \ # my-claude-image # --------------------------------------------------------------------------- ARG HOST_UID=1000 ARG HOST_GID=1000 RUN addgroup -g "${HOST_GID}" brian \ && adduser -D -u "${HOST_UID}" -G brian -s /bin/bash brian # --------------------------------------------------------------------------- # 4. INSTALL CLAUDE CODE (native bash installer – Anthropic recommended) # The native binary: # • Requires NO Node.js # • Auto-updates in the background # • Installs to ~/.local/bin (per-user, no sudo required) # # On Alpine the installer needs USE_BUILTIN_RIPGREP=0 because the # bundled ripgrep binary is glibc-linked; we installed ripgrep via apk # above instead. # # We switch to the brian for the install so the binary lands in # /home/brian/.local/bin (not /root/.local/bin). # --------------------------------------------------------------------------- USER brian ENV HOME=/home/brian ENV USE_BUILTIN_RIPGREP=0 RUN curl -fsSL https://claude.ai/install.sh | bash # Make sure the installed binary is on PATH for subsequent RUN steps and # at container runtime. ENV PATH="/home/brian/.local/bin:${PATH}" # --------------------------------------------------------------------------- # 5. APP DIRECTORIES # Create persistent-data dirs as the non-root user so Claude Code can # read/write its config without permission errors. # --------------------------------------------------------------------------- RUN mkdir -p /home/brian/.config/claude-code \ && mkdir -p /home/brian/.ssh \ && mkdir -p /home/brian/app # --------------------------------------------------------------------------- # 5.1 DIRECTORY PERMISSIONS # Adjust permissions on some directories as needed. # --------------------------------------------------------------------------- RUN chmod 700 /home/brian/.ssh # --------------------------------------------------------------------------- # 6. WORKDIR & SHELL # --------------------------------------------------------------------------- WORKDIR /home/brian/app SHELL ["/bin/bash", "-c"] # --------------------------------------------------------------------------- # 7. DEFAULT COMMAND # --------------------------------------------------------------------------- CMD ["claude"]