ARG N8N_VERSION=2.18.6 ARG JQ_VERSION=1.7.1 # ------------------------------------------------ # 1) busybox-static (sh, sed, mkdir, chown, su, etc.) # ------------------------------------------------ FROM alpine:3.23 AS busybox-builder RUN apk add --no-cache busybox-static # ------------------------------------------------ # 2) jq static (download correct binary for TARGETARCH) # ------------------------------------------------ FROM alpine:3.23 AS jq-builder ARG JQ_VERSION ARG TARGETARCH RUN apk add --no-cache wget ca-certificates RUN case "${TARGETARCH}" in \ amd64) JQ_ASSET="jq-linux-amd64" ;; \ arm64) JQ_ASSET="jq-linux-arm64" ;; \ *) echo "Unsupported TARGETARCH=${TARGETARCH}" && exit 1 ;; \ esac \ && wget -O /usr/local/bin/jq \ "https://github.com/jqlang/jq/releases/download/jq-${JQ_VERSION}/${JQ_ASSET}" \ && chmod +x /usr/local/bin/jq # ------------------------------------------------ # 3) claude-code # ------------------------------------------------ FROM node:20-alpine AS node-builder RUN npm install -g @anthropic-ai/claude-code # ------------------------------------------------ # 4) Final image (n8n distroless) # ------------------------------------------------ FROM docker.n8n.io/n8nio/n8n:${N8N_VERSION} USER root # busybox (static) + install applets (/bin/sh, /bin/sed, /bin/su, /bin/chown, etc.) COPY --from=busybox-builder /bin/busybox /bin/busybox RUN ["/bin/busybox", "--install", "/bin"] # jq (static, correct arch) COPY --from=jq-builder /usr/local/bin/jq /usr/bin/jq # claude-code COPY --from=node-builder /usr/local/lib/node_modules /usr/local/lib/node_modules COPY --from=node-builder /usr/local/bin/claude /usr/local/bin/claude ENV PATH="/usr/local/bin:/usr/bin:/bin:${PATH}" WORKDIR /data COPY docker-entrypoint.sh /tmp/docker-entrypoint.sh RUN chmod +x /tmp/docker-entrypoint.sh ENTRYPOINT ["/bin/sh", "/tmp/docker-entrypoint.sh"] EXPOSE 443