forked from AHRQ-CDS/AHRQ-CDS-Connect-Authoring-Tool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile
137 lines (104 loc) · 5.23 KB
/
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
# OVERVIEW: This is the Dockerfile for a multi-stage build of the CDS Authoring
# Tool. A multi-stage approach was used to keep the overall image size low by
# including only the layers needed at runtime in the final image. For more
# info see: https://docs.docker.com/develop/develop-images/multistage-build/
###############################################################################
# STAGE 0: base
# - Setup base image from which most others derive. This allows for a single
# place to declare the versioned node image we use and any other commands
# common to all (or most?) environments.
###############################################################################
FROM node:14.18.1-alpine as base
ENV NODE_ENV production
###############################################################################
# STAGE 1: install_backend
# - Install production dependencies for the api project
# - Copy over api source code
###############################################################################
FROM base as install_backend
# First copy just the package.json, yarn.lock, and local dependencies so that
# if they have not changed, we can use cached node_modules instead of
# redownloading them all.
COPY ./api/package.json /usr/src/app/api/package.json
COPY ./api/yarn.lock /usr/src/app/api/yarn.lock
COPY ./api/localDependencies /usr/src/app/api/localDependencies
WORKDIR /usr/src/app/api
RUN yarn --production --non-interactive install
# Then copy the rest of the source code
COPY ./api /usr/src/app/api
###############################################################################
# STAGE 2: test_backend
# - Install development dependencies for the api project
# - Run the api tests and pipe results to a log file
###############################################################################
FROM install_backend as test_backend
ENV NODE_ENV test
ENV CI true
WORKDIR /usr/src/app/api
RUN yarn --production=false --non-interactive install
# Some api code shares code w/ frontend, so bring that in for the tests
COPY ./frontend/src/data /usr/src/app/frontend/src/data
RUN yarn run test-ci 2>&1 | tee api-test-report.txt
###############################################################################
# STAGE 3: install_frontend
# - Install packages needed by yarn install (python2, make, g++)
# - Install production dependencies for the frontend project
# - Copy over frontend source code
###############################################################################
FROM base as install_frontend
RUN apk --no-cache add python2 make g++
# First copy just the package.json and yarn.lock so that if they have not
# changed, we can use cached node_modules instead of redownloading them all.
COPY ./frontend/package.json /usr/src/app/frontend/package.json
COPY ./frontend/yarn.lock /usr/src/app/frontend/yarn.lock
WORKDIR /usr/src/app/frontend
RUN yarn --production --non-interactive install
# Then copy the rest of the source code
COPY ./frontend /usr/src/app/frontend
###############################################################################
# STAGE 4: test_frontend
# - Install development dependencies for the frontend project
# - Run the frontend tests and pipe results to a log file
###############################################################################
FROM install_frontend as test_frontend
ENV NODE_ENV test
ENV CI true
WORKDIR /usr/src/app/frontend
RUN yarn --production=false --non-interactive install
RUN yarn run test-ci 2>&1 | tee frontend-test-report.txt
###############################################################################
# STAGE 5: build_frontend
# - Build frontend code to produce standard html, js, and css files
# - NOTE: Based on test_frontend because it needs development dependencies
###############################################################################
FROM test_frontend as build_frontend
ENV NODE_ENV production
WORKDIR /usr/src/app/frontend
RUN yarn build
###############################################################################
# STAGE 6: final
# - Setup NODE_ENV as an argument
# - Install PM2 process manager
# - Copy over all files needed at run-time
# - Expose necessary ports
# - Run as node (more secure than running as root)
###############################################################################
FROM base as final
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
RUN yarn global add [email protected] -g
COPY --chown=node:node --from=install_backend /usr/src/app/api /usr/src/app/api
COPY --chown=node:node --from=install_frontend /usr/src/app/frontend/node_modules /usr/src/app/frontend/node_modules
COPY --chown=node:node --from=build_frontend /usr/src/app/frontend/build /usr/src/app/frontend/build
COPY --chown=node:node ./frontend/src/data /usr/src/app/frontend/src/data
COPY --chown=node:node ./frontend/.env /usr/src/app/frontend
COPY --chown=node:node ./frontend/server.js /usr/src/app/frontend
COPY --chown=node:node ./pm2.config.js /usr/src/app
# Copy over test logs because they're nice to have, but also to force the test stages to run
COPY --chown=node:node --from=test_backend /usr/src/app/api/api-test-report.txt /usr/src/app
COPY --chown=node:node --from=test_frontend /usr/src/app/frontend/frontend-test-report.txt /usr/src/app
EXPOSE 3001
EXPOSE 9000
USER node
WORKDIR /usr/src/app
CMD [ "pm2-docker", "pm2.config.js" ]