From 7580a7f1aa859335a0bccf18c54a92abb5a3014d Mon Sep 17 00:00:00 2001 From: yodem Date: Wed, 25 Feb 2026 12:04:19 +0200 Subject: [PATCH 1/5] chore: Update Dockerfile to optimize build process and configure Claude Code CLI settings --- Dockerfile | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2f3cc1e9..4ba36397 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,9 @@ FROM node:22 AS script WORKDIR /build +COPY package.json package-lock.json ./ +RUN npm ci COPY . . -RUN npm install RUN npm run build @@ -10,12 +11,19 @@ FROM python:3.11-alpine3.23 AS server # Install Node.js for Claude Code CLI (required by claude-agent-sdk) RUN apk add --no-cache nodejs npm \ - && npm install -g @anthropic-ai/claude-code + && npm install -g @anthropic-ai/claude-code@2.1.56 + +# Create managed settings for Claude Code CLI (system-level config) +RUN mkdir -p /etc/claude-code \ + && echo '{}' > /etc/claude-code/managed-settings.json # set user as non-root with a known UID for Kubernetes RUN adduser -D -u 1001 appuser \ && mkdir -p /tmp \ - && chmod 1777 /tmp + && chmod 1777 /tmp \ + && mkdir -p /home/appuser/.claude \ + && echo '{}' > /home/appuser/.claude/remote-settings.json \ + && chown -R 1001:1001 /home/appuser/.claude COPY /server /server WORKDIR /server From c6df149ceaffc42a09c4ac9897508d2d9f513ef9 Mon Sep 17 00:00:00 2001 From: yodem Date: Wed, 25 Feb 2026 12:41:13 +0200 Subject: [PATCH 2/5] fix: remove dead home dir config shadowed by emptyDir volume mount Files created under /home/appuser/ in the image are invisible at runtime since the deployment mounts an emptyDir over the entire home directory. remote-settings.json is now created by the claude-settings init container. Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4ba36397..70eb5aa8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,10 +20,7 @@ RUN mkdir -p /etc/claude-code \ # set user as non-root with a known UID for Kubernetes RUN adduser -D -u 1001 appuser \ && mkdir -p /tmp \ - && chmod 1777 /tmp \ - && mkdir -p /home/appuser/.claude \ - && echo '{}' > /home/appuser/.claude/remote-settings.json \ - && chown -R 1001:1001 /home/appuser/.claude + && chmod 1777 /tmp COPY /server /server WORKDIR /server From c188509eab41327a8bbaef2d52aaeb01d2de3657 Mon Sep 17 00:00:00 2001 From: yodem Date: Wed, 25 Feb 2026 13:34:23 +0200 Subject: [PATCH 3/5] fix: downgrade claude-code to 2.1.37 and pre-warm CLI at startup Two changes to fix the hundreds of ENOENT errors on remote-settings.json: 1. Downgrade @anthropic-ai/claude-code from 2.1.37 to 2.1.37 (version before the problematic directory-wiping behavior was introduced) 2. Add entrypoint wrapper that runs `claude --version` before gunicorn starts, triggering CLI first-run initialization once per pod lifecycle so all ~/.claude/ files exist before the first request arrives Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 70eb5aa8..4bdcb734 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ FROM python:3.11-alpine3.23 AS server # Install Node.js for Claude Code CLI (required by claude-agent-sdk) RUN apk add --no-cache nodejs npm \ - && npm install -g @anthropic-ai/claude-code@2.1.56 + && npm install -g @anthropic-ai/claude-code@2.1.37 # Create managed settings for Claude Code CLI (system-level config) RUN mkdir -p /etc/claude-code \ @@ -29,8 +29,13 @@ RUN mkdir -p static/js COPY --from=script /build/dist/lc-chatbot.umd.cjs static/js/ RUN python manage.py collectstatic --noinput +# Entrypoint: pre-warm Claude CLI to initialize ~/.claude/ before first request +RUN printf '#!/bin/sh\nclaude --version > /dev/null 2>&1 || true\nexec "$@"\n' \ + > /usr/local/bin/docker-entrypoint.sh \ + && chmod +x /usr/local/bin/docker-entrypoint.sh + USER 1001 EXPOSE 8080 -ENTRYPOINT ["gunicorn", "chatbot_server.wsgi:application", "--bind", "0.0.0.0:8080", "--worker-class", "gthread", "--threads", "4"] +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh", "gunicorn", "chatbot_server.wsgi:application", "--bind", "0.0.0.0:8080", "--worker-class", "gthread", "--threads", "4"] From 753d4b7fd5c5b393827b9d9d4fa00d7f6d1e3a2d Mon Sep 17 00:00:00 2001 From: yodem Date: Wed, 25 Feb 2026 13:43:00 +0200 Subject: [PATCH 4/5] refactor: simplify Dockerfile entrypoint by removing pre-warm script Removed the entrypoint script that pre-warmed the Claude CLI, directly invoking gunicorn instead. This change streamlines the Dockerfile and eliminates unnecessary complexity while maintaining application startup functionality. --- Dockerfile | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4bdcb734..c2fb37f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,13 +29,8 @@ RUN mkdir -p static/js COPY --from=script /build/dist/lc-chatbot.umd.cjs static/js/ RUN python manage.py collectstatic --noinput -# Entrypoint: pre-warm Claude CLI to initialize ~/.claude/ before first request -RUN printf '#!/bin/sh\nclaude --version > /dev/null 2>&1 || true\nexec "$@"\n' \ - > /usr/local/bin/docker-entrypoint.sh \ - && chmod +x /usr/local/bin/docker-entrypoint.sh - USER 1001 EXPOSE 8080 -ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh", "gunicorn", "chatbot_server.wsgi:application", "--bind", "0.0.0.0:8080", "--worker-class", "gthread", "--threads", "4"] +ENTRYPOINT ["gunicorn", "chatbot_server.wsgi:application", "--bind", "0.0.0.0:8080", "--worker-class", "gthread", "--threads", "4"] From 90c23b013d5274eec1b8e35585a7d77878d19f8c Mon Sep 17 00:00:00 2001 From: yodem Date: Wed, 25 Feb 2026 13:47:17 +0200 Subject: [PATCH 5/5] fix: update Dockerfile to ensure proper permissions for Claude Code CLI settings Added a command to set read permissions for the managed settings directory, allowing the non-root user to access the configuration files. This change enhances the security and functionality of the Docker image. --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c2fb37f2..55b25105 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,10 @@ RUN apk add --no-cache nodejs npm \ && npm install -g @anthropic-ai/claude-code@2.1.37 # Create managed settings for Claude Code CLI (system-level config) +# Ensure appuser (UID 1001) can read; chmod before switching to non-root RUN mkdir -p /etc/claude-code \ - && echo '{}' > /etc/claude-code/managed-settings.json + && echo '{}' > /etc/claude-code/managed-settings.json \ + && chmod -R a+rX /etc/claude-code # set user as non-root with a known UID for Kubernetes RUN adduser -D -u 1001 appuser \