|
| 1 | +# --- STAGE 1: Base Runtime --- |
| 2 | +FROM docker.io/library/node:20-slim AS base |
| 3 | + |
| 4 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 5 | + python3 \ |
| 6 | + python3-pip \ |
| 7 | + python3-venv \ |
| 8 | + curl \ |
| 9 | + dnsutils \ |
| 10 | + less \ |
| 11 | + jq \ |
| 12 | + ca-certificates \ |
| 13 | + git \ |
| 14 | + && apt-get clean \ |
| 15 | + && rm -rf /var/lib/apt/lists/* |
| 16 | + |
| 17 | +# --- STAGE 2: Builder (Compile Main) --- |
| 18 | +FROM base AS builder |
| 19 | +WORKDIR /build |
| 20 | +COPY . . |
| 21 | +RUN npm ci --ignore-scripts |
| 22 | +RUN npm run bundle |
| 23 | +# Run the official release preparation script to move the bundle and assets into packages/cli |
| 24 | +RUN node scripts/prepare-npm-release.js |
| 25 | + |
| 26 | +# --- STAGE 3: Development Environment --- |
| 27 | +FROM base AS development |
| 28 | + |
| 29 | +WORKDIR /home/node/dev/main |
| 30 | + |
| 31 | +# Set up npm global package folder |
| 32 | +RUN mkdir -p /usr/local/share/npm-global \ |
| 33 | + && chown -R node:node /usr/local/share/npm-global |
| 34 | +ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global |
| 35 | +ENV PATH=$PATH:/usr/local/share/npm-global/bin |
| 36 | + |
| 37 | +# Copy package.json to extract versions for global tools |
| 38 | +COPY package.json /tmp/package.json |
| 39 | + |
| 40 | +# Install Build Tools, Global Dev Tools (pinned), and Linters |
| 41 | +ARG ACTIONLINT_VER=1.7.7 |
| 42 | +ARG SHELLCHECK_VER=0.11.0 |
| 43 | +ARG YAMLLINT_VER=1.35.1 |
| 44 | + |
| 45 | +RUN apt-get update && apt-get install -y --no-install-recommends \ |
| 46 | + make \ |
| 47 | + g++ \ |
| 48 | + gh \ |
| 49 | + git \ |
| 50 | + unzip \ |
| 51 | + rsync \ |
| 52 | + ripgrep \ |
| 53 | + procps \ |
| 54 | + psmisc \ |
| 55 | + lsof \ |
| 56 | + socat \ |
| 57 | + tmux \ |
| 58 | + docker.io \ |
| 59 | + build-essential \ |
| 60 | + libsecret-1-dev \ |
| 61 | + libkrb5-dev \ |
| 62 | + file \ |
| 63 | + && curl -sSLo /tmp/actionlint.tar.gz https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VER}/actionlint_${ACTIONLINT_VER}_linux_amd64.tar.gz \ |
| 64 | + && tar -xzf /tmp/actionlint.tar.gz -C /usr/local/bin actionlint \ |
| 65 | + && curl -sSLo /tmp/shellcheck.tar.xz https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VER}/shellcheck-v${SHELLCHECK_VER}.linux.x86_64.tar.xz \ |
| 66 | + && tar -xf /tmp/shellcheck.tar.xz -C /usr/local/bin --strip-components=1 shellcheck-v${SHELLCHECK_VER}/shellcheck \ |
| 67 | + && pip3 install --break-system-packages yamllint==${YAMLLINT_VER} \ |
| 68 | + && export TSX_VER=$(node -p "require('/tmp/package.json').devDependencies.tsx") \ |
| 69 | + && export VITEST_VER=$(node -p "require('/tmp/package.json').devDependencies.vitest") \ |
| 70 | + && export PRETTIER_VER=$(node -p "require('/tmp/package.json').devDependencies.prettier") \ |
| 71 | + && export ESLINT_VER=$(node -p "require('/tmp/package.json').devDependencies.eslint") \ |
| 72 | + && export CROSS_ENV_VER=$(node -p "require('/tmp/package.json').devDependencies['cross-env']") \ |
| 73 | + && npm install -g tsx@$TSX_VER vitest@$VITEST_VER prettier@$PRETTIER_VER eslint@$ESLINT_VER cross-env@$CROSS_ENV_VER typescript@5.3.3 \ |
| 74 | + && npm install -g @google/gemini-cli@nightly && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-nightly \ |
| 75 | + && npm install -g @google/gemini-cli@preview && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-preview \ |
| 76 | + && npm install -g @google/gemini-cli@latest && mv /usr/local/share/npm-global/bin/gemini /usr/local/share/npm-global/bin/g-stable \ |
| 77 | + && apt-get purge -y build-essential libsecret-1-dev libkrb5-dev \ |
| 78 | + && apt-get autoremove -y \ |
| 79 | + && apt-get clean \ |
| 80 | + && rm -rf /var/lib/apt/lists/* /tmp/* /root/.npm |
| 81 | + |
| 82 | +# Copy the bundled CLI package to a permanent location and install it |
| 83 | +# We MUST not delete this source folder as 'npm install -g <folder>' |
| 84 | +# often symlinks to it for local folder installs. |
| 85 | +COPY --from=builder /build/packages/cli /usr/local/lib/gemini-cli |
| 86 | +RUN npm install -g /usr/local/lib/gemini-cli |
| 87 | + |
| 88 | +USER node |
| 89 | +CMD ["/bin/bash"] |
0 commit comments