Skip to content

Commit 74cd702

Browse files
authored
Merge pull request lowcoder-org#171 from ludomikula/develop
Refactor docker image and create a helm chart
2 parents 5c18c21 + bb2858d commit 74cd702

25 files changed

+690
-231
lines changed

deploy/docker/Dockerfile

Lines changed: 159 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,192 @@
1-
FROM maven:3.8.4-openjdk-17-slim AS build-server
1+
##
2+
## Create custom JRE for running Openblocks server application
3+
##
4+
FROM eclipse-temurin:17-jdk-jammy AS jre-build
5+
RUN jlink --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.accessibility,jdk.charsets,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.dynalink,jdk.httpserver,jdk.incubator.foreign,jdk.incubator.vector,jdk.internal.vm.ci,jdk.jdwp.agent,jdk.jfr,jdk.jsobject,jdk.localedata,jdk.management,jdk.management.agent,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.xml.dom,jdk.zipfs,jdk.attach \
6+
--output /build/jre \
7+
--no-man-pages \
8+
--no-header-files \
9+
--compress=2
10+
11+
##
12+
## Build Openblocks api-service application
13+
##
14+
FROM maven:3.8-eclipse-temurin-17-alpine AS build-api-service
215
COPY ./server/api-service /openblocks-server
316
WORKDIR /openblocks-server
417
RUN --mount=type=cache,target=/root/.m2 mvn -f pom.xml clean package -DskipTests
518

6-
FROM node:slim AS build-client
7-
COPY ./client /openblocks-client
8-
WORKDIR /openblocks-client
9-
RUN yarn --immutable
19+
# Create required folder structure
20+
RUN mkdir -p /openblocks/api-service/plugins /openblocks/api-service/config /openblocks/api-service/logs
1021

11-
ARG REACT_APP_COMMIT_ID=test
12-
ARG REACT_APP_ENV=production
13-
ARG REACT_APP_EDITION=community
14-
RUN yarn build
22+
# Define openblocks main jar and plugin jars
23+
ARG JAR_FILE=/openblocks-server/openblocks-server/target/openblocks-server-1.0-SNAPSHOT.jar
24+
ARG PLUGIN_JARS=/openblocks-server/openblocks-plugins/*/target/*.jar
1525

16-
FROM node:slim AS build-node
17-
COPY ./server/node-service /openblocks-node
18-
WORKDIR /openblocks-node
19-
RUN yarn --immutable
20-
RUN yarn build
26+
# Copy Java runtime for running server
27+
COPY --from=jre-build /build/jre /openblocks/api-service/jre
2128

22-
FROM openjdk:17-slim AS jre-build
23-
RUN jlink --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.accessibility,jdk.charsets,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.dynalink,jdk.httpserver,jdk.incubator.foreign,jdk.incubator.vector,jdk.internal.vm.ci,jdk.jdwp.agent,jdk.jfr,jdk.jsobject,jdk.localedata,jdk.management,jdk.management.agent,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.xml.dom,jdk.zipfs,jdk.attach \
24-
--output /build/jre \
25-
--no-man-pages \
26-
--no-header-files \
27-
--compress=2
29+
# Copy openblocks server application and plugins
30+
RUN cp ${JAR_FILE} /openblocks/api-service/server.jar \
31+
&& cp ${PLUGIN_JARS} /openblocks/api-service/plugins/
32+
33+
# Copy openblocks server configuration
34+
COPY server/api-service/openblocks-server/src/main/resources/selfhost/ce/application.yml /openblocks/api-service/config/
35+
COPY server/api-service/openblocks-server/src/main/resources/selfhost/ce/application-selfhost.yml /openblocks/api-service/config/
2836

29-
FROM ubuntu:20.04
37+
# Add bootstrapfile
38+
COPY deploy/docker/api-service/entrypoint.sh /openblocks/api-service/entrypoint.sh
39+
COPY deploy/docker/api-service/init.sh /openblocks/api-service/init.sh
40+
RUN chmod +x /openblocks/api-service/*.sh
41+
42+
##
43+
## Intermediary Openblocks api-service image
44+
##
45+
## To create a separate image out of it, build it with:
46+
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-api-service --target openblocks-ce-api-service .
47+
##
48+
FROM ubuntu:jammy as openblocks-ce-api-service
3049
LABEL maintainer="openblocks"
3150

32-
# Update APT packages - Base Layer python-setuptools
33-
RUN apt-get update && DEBIAN_FRONTEND=noninteractive \
34-
apt-get install --no-install-recommends -y \
35-
supervisor curl nginx wget netcat software-properties-common gettext python3-pip git gnupg vim iputils-ping gosu\
36-
&& add-apt-repository ppa:redislabs/redis \
37-
&& apt-get remove -y git python3-pip \
38-
&& apt-get clean \
39-
&& rm -rf /var/lib/apt/lists/*
51+
RUN apt-get update && apt-get install -y --no-install-recommends gosu \
52+
&& rm -rf /var/cache/apt/lists \
53+
&& addgroup --system --gid 9001 openblocks \
54+
&& adduser --system --disabled-password --no-create-home --uid 9001 --gid 9001 openblocks
55+
56+
# Copy openblocks server configuration
57+
COPY --chown=openblocks:openblocks --from=build-api-service /openblocks/api-service /openblocks/api-service
58+
59+
EXPOSE 8080
60+
CMD [ "sh" , "/openblocks/api-service/entrypoint.sh" ]
4061

41-
# Install MongoDB v4.0.5, Redis - Service Layer
42-
RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -
62+
#############################################################################
4363

44-
RUN echo "deb [ arch=amd64,arm64 ]http://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
45-
&& apt-get remove wget -y
64+
##
65+
## Build openblocks node service
66+
##
67+
FROM ubuntu:jammy as build-node-service
4668

47-
RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - \
48-
&& apt-get -y install --no-install-recommends -y mongodb-org=4.4.6 redis nodejs \
49-
&& apt-get clean \
50-
&& rm -rf /var/lib/apt/lists/*
69+
RUN apt update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y curl xz-utils ca-certificates \
70+
&& mkdir -p /openblocks/node-service/nodejs
5171

72+
# Download and extract nodejs
73+
RUN curl -fsSL 'https://nodejs.org/dist/v19.4.0/node-v19.4.0-linux-x64.tar.xz' | tar --directory /openblocks/node-service/nodejs --strip-components=1 -Jxf -
74+
75+
# Install yarn
76+
ENV PATH="/openblocks/node-service/nodejs/bin:${PATH}"
77+
#RUN export PATH=${PATH}:/openblocks/node-service/nodejs/bin \
5278
RUN npm install -g yarn
5379

54-
# Clean up cache file - Service layer
55-
RUN rm -rf \
56-
/root/.cache \
57-
/root/.npm \
58-
/root/.pip \
59-
/usr/local/share/doc \
60-
/usr/share/doc \
61-
/usr/share/man \
62-
/var/lib/apt/lists/* \
63-
/tmp/*
80+
# Copy and build the node-service app
81+
COPY server/node-service/ /openblocks/node-service/app/
82+
WORKDIR /openblocks/node-service/app/
83+
RUN yarn --immutable
84+
RUN yarn build
6485

65-
# Define volumes - Service Layer
66-
VOLUME [ "/openblocks-stacks" ]
86+
# Copy startup script
87+
COPY deploy/docker/node-service/entrypoint.sh /openblocks/node-service/entrypoint.sh
88+
COPY deploy/docker/node-service/init.sh /openblocks/node-service/init.sh
89+
RUN chmod +x /openblocks/node-service/*.sh
90+
91+
##
92+
## Intermediary Openblocks node service image
93+
##
94+
## To create a separate image out of it, build it with:
95+
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-node-service --target openblocks-ce-node-service .
96+
##
97+
FROM ubuntu:jammy as openblocks-ce-node-service
98+
LABEL maintainer="openblocks"
6799

68-
ENV OPENBLOCKS_SERVER_PROXY_PASS http://localhost:8080
69-
ENV OPENBLOCKS_NODE_PROXY_PASS http://localhost:6060
100+
RUN apt-get update && apt-get install -y --no-install-recommends gosu \
101+
&& rm -rf /var/cache/apt/lists \
102+
&& addgroup --system --gid 9001 openblocks \
103+
&& adduser --system --disabled-password --no-create-home --uid 9001 --gid 9001 openblocks
70104

71-
# copy jre
72-
COPY --from=jre-build /build/jre /app
105+
COPY --from=build-node-service /openblocks/node-service /openblocks/node-service
73106

74-
ARG JAR_FILE=/openblocks-server/openblocks-server/target/openblocks-server-1.0-SNAPSHOT.jar
75-
ARG PLUGIN_JARS=/openblocks-server/openblocks-plugins/*/target/*.jar
107+
EXPOSE 6060
108+
CMD [ "/bin/sh", "/openblocks/node-service/entrypoint.sh" ]
109+
110+
#############################################################################
111+
112+
##
113+
## Build openblocks client application
114+
##
115+
FROM node:19.4-slim AS build-client
116+
COPY ./client /openblocks-client
117+
WORKDIR /openblocks-client
118+
RUN yarn --immutable
119+
120+
# curl is required for yarn build to succeed, because it calls it while building client
121+
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates
122+
123+
ARG REACT_APP_COMMIT_ID=test
124+
ARG REACT_APP_ENV=production
125+
ARG REACT_APP_EDITION=community
126+
RUN yarn build
76127

77-
RUN mkdir -p /openblocks /openblocks/plugins /var/www/openblocks /env2
78128

79-
COPY --from=build-server ${JAR_FILE} /openblocks/server/api-service/server.jar
80-
COPY --from=build-server ${PLUGIN_JARS} /openblocks/server/api-service/plugins/
129+
##
130+
## Intermediary Openblocks client image
131+
##
132+
## To create a separate image out of it, build it with:
133+
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-frontend --target openblocks-ce-frontend .
134+
##
135+
FROM nginx:1.23.3 as openblocks-ce-frontend
136+
LABEL maintainer="openblocks"
81137

82-
# copy tace-fe build
83-
COPY --from=build-client /openblocks-client/packages/openblocks/build/ /openblocks/client/
138+
# Change default nginx user into openblocks user
139+
RUN usermod --login openblocks --uid 9001 nginx \
140+
&& groupmod --new-name openblocks --gid 9001 nginx
84141

85-
# copy node-service
86-
COPY --from=build-node /openblocks-node /openblocks/server/node-service
87-
COPY ./deploy/docker/scripts/start-node-service.sh /openblocks/server/node-service/start-node-service.sh
142+
# Copy openblocks client data
143+
COPY --chown=openblocks:openblocks --from=build-client /openblocks-client/packages/openblocks/build/ /openblocks/client
88144

89-
# copy nginx conf
90-
COPY ./deploy/docker/templates/nginx/* /openblocks/nginx/
91-
COPY ./deploy/docker/scripts/start-nginx.sh /openblocks/nginx/start-nginx.sh
145+
# Copy additional nginx init scripts
146+
COPY deploy/docker/frontend/00-change-nginx-user.sh /docker-entrypoint.d/00-change-nginx-user.sh
147+
COPY deploy/docker/frontend/01-update-nginx-conf.sh /docker-entrypoint.d/01-update-nginx-conf.sh
92148

93-
# copy redis conf
94-
COPY ./deploy/docker/templates/redis.conf /etc/redis/redis.conf
149+
RUN chmod +x /docker-entrypoint.d/00-change-nginx-user.sh && \
150+
chmod +x /docker-entrypoint.d/01-update-nginx-conf.sh
95151

96-
# Add process config to be run by supervisord
97-
COPY ./deploy/docker/templates/supervisord.conf /etc/supervisor/supervisord.conf
98-
COPY ./deploy/docker/templates/supervisord/* /etc/supervisor/conf.d/
152+
COPY deploy/docker/frontend/nginx.conf /etc/nginx/nginx.conf
153+
EXPOSE 3000
99154

100-
# copy application.yml
101-
COPY ./server/api-service/openblocks-server/src/main/resources/selfhost/ce/application.yml /openblocks/env/
102-
COPY ./server/api-service/openblocks-server/src/main/resources/selfhost/ce/application-selfhost.yml /openblocks/env2/
155+
#############################################################################
103156

104-
# Add bootstrapfile
105-
COPY ./deploy/docker/entrypoint.sh /openblocks/
106-
RUN chmod +x /openblocks/entrypoint.sh
157+
##
158+
## Build Openblocks all-in-one image
159+
##
160+
FROM openblocks-ce-frontend
161+
LABEL maintainer="openblocks"
162+
163+
# Install required packages
164+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y bash gnupg curl lsb-release \
165+
&& curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg \
166+
&& echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb bullseye main" | tee /etc/apt/sources.list.d/redis.list \
167+
&& curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-archive-keyring.gpg \
168+
&& echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
169+
&& apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends -y \
170+
mongodb-org=4.4.6 \
171+
redis \
172+
supervisor \
173+
gosu \
174+
&& rm -rf /var/cache/apt/lists
175+
176+
# Add openblocks api-service
177+
COPY --chown=openblocks:openblocks --from=openblocks-ce-api-service /openblocks/api-service /openblocks/api-service
178+
179+
# Add openblocks node-service
180+
COPY --chown=openblocks:openblocks --from=openblocks-ce-node-service /openblocks/node-service /openblocks/node-service
181+
182+
# Add services configuration
183+
COPY --chown=openblocks:openblocks deploy/docker/all-in-one/etc /openblocks/etc
184+
185+
# Add startup script
186+
COPY --chown=openblocks:openblocks deploy/docker/all-in-one/entrypoint.sh /openblocks/entrypoint.sh
107187

108188
EXPOSE 3000
109189

110-
ENTRYPOINT [ "sh" , "/openblocks/entrypoint.sh" ]
111-
CMD ["/usr/bin/supervisord", "-n" , "-c" , "/etc/supervisor/supervisord.conf"]
190+
ENTRYPOINT [ "/bin/sh" , "/openblocks/entrypoint.sh" ]
191+
CMD ["/usr/bin/supervisord", "-n" , "-c" , "/openblocks/etc/supervisord.conf"]
112192

0 commit comments

Comments
 (0)