Repository navigation
Expand file tree
/
Copy pathDockerfile
More file actions
85 lines (77 loc) · 4.69 KB
/
Copy pathDockerfile
File metadata and controls
85 lines (77 loc) · 4.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Operators must select an approved, immutable Node 24 base image explicitly.
ARG NODE_BASE_IMAGE
ARG NODE_RUNTIME_BASE_IMAGE=docker.io/library/node:24-bookworm-slim@sha256:d6aa754f16b3197301076f047b5def2f02ea1dbbc2ca920407d46d7ec7f87b20
FROM ${NODE_BASE_IMAGE} AS dependencies
RUN apt-get update && apt-get upgrade -y && rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN node -e "if (Number(process.versions.node.split('.')[0]) !== 24) throw new Error('The approved production base image must use Node.js 24.')"
COPY LICENSE package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/controller/package.json apps/controller/package.json
COPY packages/audit/package.json packages/audit/package.json
COPY packages/contracts/package.json packages/contracts/package.json
COPY packages/iam/package.json packages/iam/package.json
COPY packages/occ/package.json packages/occ/package.json
COPY packages/utils/package.json packages/utils/package.json
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc,required=false \
corepack pnpm install --frozen-lockfile --prod --ignore-scripts
FROM dependencies AS console-build
ARG OCC_BUILD_REVISION=""
COPY apps/controller/src/console/index.html apps/controller/src/console/index.html
COPY scripts/build-console-metadata.mjs scripts/build-console-metadata.mjs
RUN node scripts/build-console-metadata.mjs "$OCC_BUILD_REVISION"
FROM dependencies AS development
ENV NODE_ENV=development
WORKDIR /app
COPY --chown=node:node package.json pnpm-workspace.yaml ./
COPY --chown=node:node packages packages
COPY --chown=node:node apps/controller apps/controller
COPY --from=console-build --chown=node:node /app/apps/controller/src/console/index.html apps/controller/src/console/index.html
COPY --chown=node:node migrations migrations
COPY --chown=node:node scripts scripts
COPY --chown=node:node deploy/presets deploy/presets
RUN mkdir -p /app/.development/configurations /var/lib/openclaw/bootstrap \
&& chown -R node:node /app/.development \
&& chown 1000:1000 /var/lib/openclaw/bootstrap \
&& chmod 0700 /var/lib/openclaw/bootstrap
# The route validators and serializers, precompiled with this image's Node and dependencies
# so the server loads them instead of compiling every schema at start
# (apps/controller/src/http/route-compilers.ts).
RUN node apps/controller/src/precompile-route-schemas.mjs
USER node
ENTRYPOINT ["node"]
CMD ["apps/controller/src/server.mjs"]
FROM ${NODE_RUNTIME_BASE_IMAGE} AS runtime
RUN apt-get update && apt-get upgrade -y && rm -rf /var/lib/apt/lists/*
ENV NODE_ENV=production
WORKDIR /app
COPY --from=dependencies --chown=node:node /app/ ./
COPY --chown=node:node package.json pnpm-workspace.yaml ./
COPY --chown=node:node packages/audit/package.json packages/audit/package.json
COPY --chown=node:node packages/audit/src packages/audit/src
COPY --chown=node:node packages/contracts/package.json packages/contracts/package.json
COPY --chown=node:node packages/contracts/src packages/contracts/src
COPY --chown=node:node packages/iam/package.json packages/iam/package.json
COPY --chown=node:node packages/iam/src packages/iam/src
COPY --chown=node:node packages/occ/package.json packages/occ/package.json
COPY --chown=node:node packages/occ/src packages/occ/src
COPY --chown=node:node packages/utils/package.json packages/utils/package.json
COPY --chown=node:node packages/utils/src packages/utils/src
COPY --chown=node:node apps/controller/src apps/controller/src
COPY --from=console-build --chown=node:node /app/apps/controller/src/console/index.html apps/controller/src/console/index.html
COPY --chown=node:node migrations/[0-9]*.sql migrations/
COPY --chown=node:node migrations/meta/_journal.json migrations/meta/_journal.json
COPY --chown=node:node migrations/meta/canonical-history.json migrations/meta/canonical-history.json
COPY --chown=node:node scripts/migrate-production.mjs scripts/migrate-production.mjs
COPY --chown=node:node scripts/migration-history.mjs scripts/migration-history.mjs
COPY --chown=node:node scripts/migration-catalog.mjs scripts/migration-catalog.mjs
COPY --chown=node:node scripts/bootstrap-installation.mjs scripts/bootstrap-installation.mjs
COPY --chown=node:node scripts/lib/bootstrap-configuration.mjs scripts/lib/bootstrap-configuration.mjs
COPY --chown=node:node scripts/auth-maintain.mjs scripts/auth-maintain.mjs
COPY --chown=node:node scripts/lib/auth-maintain-arguments.mjs scripts/lib/auth-maintain-arguments.mjs
COPY --chown=node:node deploy/presets deploy/presets
COPY --chown=node:node scripts/production-healthcheck.mjs scripts/production-healthcheck.mjs
# As in the development stage: precompiled route validators and serializers for this image.
RUN node apps/controller/src/precompile-route-schemas.mjs
USER node
ENTRYPOINT ["node"]
CMD ["apps/controller/src/server.mjs"]