-
Notifications
You must be signed in to change notification settings - Fork 1
/
proxy.Dockerfile
218 lines (156 loc) · 6.42 KB
/
proxy.Dockerfile
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
###################################################################
# Stage 1: Install all workspaces (dev)dependencies #
# and generates node_modules folder(s) #
# ----------------------------------------------------------------#
# Notes: #
# 1. this stage relies on buildkit features #
# 2. depend on .dockerignore, you must at least #
# ignore: all **/node_modules folders and .yarn/cache #
###################################################################
FROM registry.access.redhat.com/ubi9/nodejs-20 AS deps
USER root
# install yarn
RUN curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
RUN yum -y install yarn
# install rsync (to fetch cached files)
RUN yum update -y && \
yum install -y rsync
WORKDIR /workspace-install
COPY --chown=default:root yarn.lock .yarnrc.yml ./
COPY --chown=default:root .yarn/ ./.yarn/
# Specific to monerepo's as docker COPY command is pretty limited
# we use buidkit to prepare all files that are necessary for install
# and that will be used to invalidate docker cache.
#
# Files are copied with rsync:
#
# - All package.json present in the host (root, apps/*, proxies/*, packages/*)
#
# Copy all files
WORKDIR /docker-context
COPY --chown=default:root . /docker-context
# mount type bind is not supported on current version (4.10.35) of OpenShift build
# RUN --mount=type=bind,source=./,target=/docker-context \
RUN rsync -amv \
--chown=default:root \
--exclude='node_modules' \
--exclude='*/node_modules' \
--include='package.json' \
--include='*/' --exclude='*' \
/docker-context/ /workspace-install/;
RUN chown -R default:root .
# remove rsync, unused dependencies, and clean yum cache
RUN yum remove -y rsync && \
yum autoremove -y && \
yum clean all && \
rm -rf /var/cache/yum
#
# To speed up installations, we override the default yarn cache folder
# and mount it as a buildkit cache mount (builkit will rotate it if needed)
# This strategy allows to exclude the yarn cache in subsequent docker
# layers (size benefit) and reduce packages fetches.
#
# PS:
# 1. Cache mounts can be used in CI (github actions)
# 2. To manually clear the cache
# > docker builder prune --filter type=exec.cachemount
#
# Does not play well with buildkit on CI
# https://github.com/moby/buildkit/issues/1673
# mount type cache is not supported on current version (4.10.35) of OpenShift build
#RUN --mount=type=cache,target=/root/.yarn3-cache,id=yarn3-cache \
# YARN_CACHE_FOLDER=/root/.yarn3-cache \
# yarn install --immutable --inline-builds
###################################################################
# Stage 2: Build the app #
###################################################################
FROM registry.access.redhat.com/ubi9/nodejs-20 AS builder
USER root
# install yarn
RUN curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
RUN yum -y install yarn
# Use non-root user
USER default
ARG PROXY
# Copy enviromental variables
ARG GRAPHQL_PROXY_DEBUG
# set graphql proxy server port
ARG GRAPHQL_PROXY_PORT
# set linked events api base url
ARG GRAPHQL_PROXY_API_BASE_URL
# set map open data base url
ARG GRAPHQL_PROXY_MAP_OPEN_DATA_API_BASE_URL
ARG GRAPHQL_PROXY_API_BASE_URL
# Set Sentry DSN
ARG GRAPHQL_PROXY_SENTRY_DSN
#Set Sentry environment
ARG GRAPHQL_PROXY_SENTRY_ENVIRONMENT
ARG GRAPHQL_PROXY_DISABLE_WINSTON_LOGGING
ARG GRAPHQL_PROXY_INTROSPECTION
ARG GRAPHQL_PROXY_HAUKI_DATASOURCE
ARG GRAPHQL_PROXY_SERVICE_MAP_DATASOURCE
WORKDIR /app
COPY --chown=default:root . .
COPY --from=deps --chown=default:root /workspace-install ./
# Optional: if the app depends on global /static shared assets like images, locales...
RUN yarn install --immutable --inline-builds
# build
RUN yarn workspace ${PROXY} build
###################################################################
# Optional: develop locally #
# NOTE: "In multi-stage builds, #
# last stage should be the production build." #
###################################################################
FROM registry.access.redhat.com/ubi9/nodejs-20 AS develop
# install yarn
USER root
RUN curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
RUN yum -y install yarn
# Use non-root user
USER default
# Build ARGS
ARG PROXY
ARG GRAPHQL_PROXY_PORT
ENV PATH $PATH:/app/node_modules/.bin
ENV NODE_ENV=development
WORKDIR /app
# Copy the configuration files to the proxies/${PROXY} root
COPY --from=builder --chown=default:root /app/proxies/${PROXY}/package.json ./proxies/${PROXY}/
# Copy the build files to the proxies/${PROXY} root
COPY --from=builder --chown=default:root /app/proxies/${PROXY}/build ./proxies/${PROXY}/build
# The root level files
COPY --from=builder --chown=default:root /app/node_modules ./node_modules
COPY --from=builder --chown=default:root /app/package.json ./package.json
# Expose port
EXPOSE ${GRAPHQL_PROXY_PORT:-4100}
# Start graphql proxy dev server
ENV DEV_START "yarn workspace ${PROXY} dev"
CMD ["sh", "-c", "${DEV_START}"]
###################################################################
# Stage 3: Extract a minimal image from the build #
###################################################################
FROM registry.access.redhat.com/ubi9/nodejs-20 AS runner
# Build ARGS
ARG PROXY
ARG GRAPHQL_PROXY_PORT
ENV PATH $PATH:/app/node_modules/.bin
ENV NODE_ENV production
# install yarn
USER root
RUN curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
RUN yum -y install yarn
# Use non-root user
USER default
WORKDIR /app
# Copy the configuration files to the proxies/${PROXY} root
COPY --from=builder --chown=default:root /app/proxies/${PROXY}/package.json ./proxies/${PROXY}/
# Copy the build files to the proxies/${PROXY} root
COPY --from=builder --chown=default:root /app/proxies/${PROXY}/build ./proxies/${PROXY}/build
# The root level files
COPY --from=builder --chown=default:root /app/node_modules ./node_modules
COPY --from=builder --chown=default:root /app/package.json ./package.json
# Expose port
EXPOSE ${GRAPHQL_PROXY_PORT:-4100}
# Start graphql proxy server
ENV PROD_START "yarn workspace ${PROXY} start"
CMD ["sh", "-c", "${PROD_START}"]