summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dockerfile39
-rw-r--r--packages/cli/src/tools/terminal.tool.ts4
-rwxr-xr-xscripts/build_container.sh22
-rwxr-xr-xscripts/start_container.sh16
4 files changed, 80 insertions, 1 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..7c101752
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,39 @@
+FROM node:20-slim
+
+# install minimal set of packages, then clean up
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ man-db \
+ curl \
+ dnsutils \
+ less \
+ jq \
+ bc \
+ gh \
+ git \
+ unzip \
+ rsync \
+ ripgrep \
+ procps \
+ psmisc \
+ lsof \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+# set up npm global package folder under /usr/local/share
+# give it to non-root user node, already set up in base image
+RUN mkdir -p /usr/local/share/npm-global \
+ && chown -R node:node /usr/local/share/npm-global
+ENV NPM_CONFIG_PREFIX=/usr/local/share/npm-global
+ENV PATH=$PATH:/usr/local/share/npm-global/bin
+
+# switch to non-root user node
+USER node
+
+# install gemini-code and clean up
+COPY packages/cli/dist/gemini-code-cli-*.tgz /usr/local/share/npm-global/gemini-code-cli.tgz
+COPY packages/server/dist/gemini-code-server-*.tgz /usr/local/share/npm-global/gemini-code-server.tgz
+RUN npm install -g /usr/local/share/npm-global/gemini-code-cli.tgz /usr/local/share/npm-global/gemini-code-server.tgz \
+ && npm cache clean --force \
+ && rm -f /usr/local/share/npm-global/gemini-code-cli.tgz \
+ && rm -f /usr/local/share/npm-global/gemini-code-server.tgz
+
diff --git a/packages/cli/src/tools/terminal.tool.ts b/packages/cli/src/tools/terminal.tool.ts
index 3813b7e8..93e70953 100644
--- a/packages/cli/src/tools/terminal.tool.ts
+++ b/packages/cli/src/tools/terminal.tool.ts
@@ -266,7 +266,9 @@ Use this tool for running build steps (\`npm install\`, \`make\`), linters (\`es
`Persistent bash process exited unexpectedly (code: ${code}, signal: ${signal}). State is lost. Queued commands cancelled.`,
),
);
- setTimeout(() => this.initializeShell(), 1000);
+ if (signal !== 'SIGINT') {
+ setTimeout(() => this.initializeShell(), 1000);
+ }
});
setTimeout(() => {
if (this.bashProcess && !this.bashProcess.killed) {
diff --git a/scripts/build_container.sh b/scripts/build_container.sh
new file mode 100755
index 00000000..f459a294
--- /dev/null
+++ b/scripts/build_container.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+IMAGE=gemini-code-sandbox
+
+# use docker if installed, otherwise try to use podman instead
+if command -v docker &> /dev/null; then
+ CMD=docker
+elif command -v podman &> /dev/null; then
+ CMD=podman
+else
+ echo "ERROR: docker or podman must be installed"
+ exit 1
+fi
+
+npm install
+npm run build
+rm -f packages/cli/dist/gemini-code-cli-*.tgz
+npm pack -w @gemini-code/cli --pack-destination ./packages/cli/dist
+rm -f packages/server/dist/gemini-code-server-*.tgz
+npm pack -w @gemini-code/server --pack-destination ./packages/server/dist
+
+$CMD build -t "$IMAGE" . \ No newline at end of file
diff --git a/scripts/start_container.sh b/scripts/start_container.sh
new file mode 100755
index 00000000..d3f4234f
--- /dev/null
+++ b/scripts/start_container.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+IMAGE=gemini-code-sandbox
+CLI_DIST=/usr/local/share/npm-global/lib/node_modules/\@gemini-code/cli/dist
+
+# use docker if installed, otherwise try to use podman instead
+if command -v docker &> /dev/null; then
+ CMD=docker
+elif command -v podman &> /dev/null; then
+ CMD=podman
+else
+ echo "ERROR: docker or podman must be installed"
+ exit 1
+fi
+
+$CMD run -it --rm -v"$PWD:/project" --workdir /project "$IMAGE" node "$CLI_DIST" \ No newline at end of file