forked from teableio/teable
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
198 lines (156 loc) · 6.99 KB
/
Copy pathDockerfile
File metadata and controls
198 lines (156 loc) · 6.99 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
ARG NODE_VERSION=20.9.0
ARG BUILD_VERSION="1.0.0-alpha"
###################################################################
# Stage 1: Install all workspaces (dev)dependencies #
# and generates node_modules folder(s) #
###################################################################
FROM node:${NODE_VERSION}-bookworm AS deps
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable && pnpm add npm-run-all2 zx -g
# Disabling some well-known postinstall scripts
ENV HUSKY=0
WORKDIR /workspace-install
COPY --link package.json pnpm-workspace.yaml pnpm-lock.yaml ./
RUN pnpm fetch
COPY --link . .
RUN pnpm install --prefer-offline --frozen-lockfile
RUN pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/schema.prisma
###################################################################
# Stage 2: Build the app #
###################################################################
FROM deps AS builder
ARG INTEGRATION_TEST
ARG BUILD_VERSION
ARG ENABLE_CSP=true
ARG SENTRY_ENABLED=true
ARG SENTRY_TRACING=true
ENV NODE_ENV=production \
NEXT_BUILD_ENV_CSP=${ENABLE_CSP} \
NEXT_BUILD_ENV_TYPECHECK=false \
NEXT_BUILD_ENV_LINT=false \
NEXT_BUILD_ENV_SENTRY_ENABLED=${SENTRY_ENABLED} \
NEXT_BUILD_ENV_SENTRY_TRACING=${SENTRY_TRACING}
WORKDIR /app
COPY --from=deps --link /workspace-install ./
RUN set -ex; \
echo "\nNEXT_PUBLIC_BUILD_VERSION=\"${BUILD_VERSION}\"" >> apps/nextjs-app/.env; \
# Distinguish whether it is an integration test operation
if [ -n "$INTEGRATION_TEST" ]; then \
pnpm -F "./packages/**" run build; \
else \
NODE_OPTIONS=--max-old-space-size=8192 pnpm g:build; \
fi
##################################################################
# Stage 3: Post Builder #
##################################################################
FROM builder as post-builder
ENV NODE_ENV=production
WORKDIR /app
ARG UPLOAD_ASSETS_LIST=""
RUN set -ex; \
rm -fr node_modules; \
pnpm nuke:node_modules; \
chmod +x ./scripts/post-build-cleanup.mjs; \
zx ./scripts/post-build-cleanup.mjs; \
pnpm install --prod --prefer-offline --frozen-lockfile; \
pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/schema.prisma
RUN set -ex; \
apt-get update; \
apt-get install -y --no-install-recommends rsync; \
rm -rf /var/lib/apt/lists/*; \
chmod +x ./scripts/upload-assets.mjs; \
zx ./scripts/upload-assets.mjs --list="$UPLOAD_ASSETS_LIST";
##################################################################
# Stage 4: Extract a minimal image from the build #
##################################################################
FROM node:${NODE_VERSION}-bookworm-slim AS runner
ENV TZ=UTC \
NODE_ENV=production \
PORT=${NEXTJS_APP_PORT:-3000}\
NEXTJS_DIR=apps/nextjs-app \
PNPM_HOME="/pnpm" \
PATH="$PNPM_HOME:$PATH"
RUN set -ex; \
npm install zx -g; \
corepack enable; \
apt-get update; \
apt-get install -y --no-install-recommends \
curl \
openssl \
; \
rm -rf /var/lib/apt/lists/*
# install gosu for a better su+exec command
# https://github.com/tianon/gosu/blob/master/INSTALL.md
ENV GOSU_VERSION 1.17
RUN set -eux; \
# save list of currently installed packages for later so we can clean up
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends ca-certificates gnupg wget; \
rm -rf /var/lib/apt/lists/*; \
\
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -nv -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
wget -nv -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
\
# verify the signature
export GNUPGHOME="$(mktemp -d)"; \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
\
# clean up fetch dependencies
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
\
chmod +x /usr/local/bin/gosu; \
# verify that the binary works
gosu --version; \
gosu nobody true
WORKDIR /app
RUN set -ex; \
addgroup --system --gid 1001 nodejs; \
adduser --system --uid 1001 nodejs; \
# Set the correct permission for local cache
mkdir .assets; \
mkdir .temporary; \
chown -R nodejs:nodejs /app
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nextjs-app/next.config.js \
/app/apps/nextjs-app/next-i18next.config.js \
/app/apps/nextjs-app/package.json \
/app/apps/nextjs-app/.env \
./apps/nextjs-app/
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nextjs-app/.next ./apps/nextjs-app/.next
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nextjs-app/node_modules ./apps/nextjs-app/node_modules
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nextjs-app/public ./apps/nextjs-app/public
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nestjs-backend/dist ./apps/nestjs-backend/dist
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nestjs-backend/node_modules ./apps/nestjs-backend/node_modules
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nestjs-backend/package.json ./apps/nestjs-backend/
# mv it is necessary
COPY --from=builder --chown=nodejs:nodejs /app/packages/common-i18n/ ./packages/common-i18n/
COPY --from=post-builder --chown=nodejs:nodejs /app/packages ./packages
COPY --from=post-builder --chown=nodejs:nodejs /app/node_modules ./node_modules
COPY --from=post-builder --chown=nodejs:nodejs /app/package.json ./package.json
COPY --from=post-builder --chown=nodejs:nodejs /app/plugins/.next/standalone/plugins ./plugins
COPY --from=post-builder --chown=nodejs:nodejs /app/apps/nestjs-backend/static ./static
COPY --chown=nodejs:nodejs scripts/start.sh ./scripts/start.sh
COPY --chown=nodejs:nodejs scripts/db-migrate.mjs ./scripts/db-migrate.mjs
COPY --chown=nodejs:nodejs scripts/wait-for ./scripts/wait-for
ENV BUILD_VERSION=$BUILD_VERSION
RUN set -ex; \
npm install -g zx; \
apt-get update; \
apt-get install -y --no-install-recommends \
curl \
ca-certificates \
openssl \
netcat-traditional \
wget \
; \
rm -rf /var/lib/apt/lists/*; \
ln -s /usr/local/lib/node_modules /node_modules
EXPOSE ${PORT}
ENTRYPOINT ["scripts/start.sh"]