Skip to content

Commit 6f84a66

Browse files
Merge pull request #65 from wednesday-solutions/feat/multi-stage-docker
Feat/multi stage docker
2 parents 4319277 + 9a2b386 commit 6f84a66

File tree

13 files changed

+834
-20
lines changed

13 files changed

+834
-20
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,6 @@ typings/
6565
.next
6666

6767
dist
68+
.env.development
69+
.env.docker
6870

Dockerfile

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
1-
FROM node:14.17-alpine
2-
RUN mkdir -p /app
3-
ADD . /app
4-
WORKDIR /app
1+
FROM node:14.17-alpine AS build1
2+
ARG ENVIRONMENT_NAME
3+
ENV ENVIRONMENT_NAME $ENVIRONMENT_NAME
4+
RUN mkdir -p /app-build
5+
ADD . /app-build
6+
WORKDIR /app-build
7+
RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn --frozen-lockfile
58
RUN yarn
6-
CMD [ "yarn", "start" ]
9+
RUN yarn build:dev
10+
11+
FROM node:14.17-alpine
12+
ARG ENVIRONMENT_NAME
13+
ENV ENVIRONMENT_NAME $ENVIRONMENT_NAME
14+
RUN apk add yarn
15+
ADD package.json /
16+
ADD . /
17+
COPY --from=build1 /app-build/dist ./dist
18+
19+
CMD ["yarn", "start"]
720
EXPOSE 9000

docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ services:
33
app:
44
build:
55
context: .
6+
args:
7+
ENVIRONMENT_NAME: ${ENVIRONMENT_NAME}
68
dockerfile: Dockerfile
79
ports:
810
- "9000:9000"

makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
docker:
2+
docker-compose --env-file ./.env.docker \
3+
-f docker-compose.yml \
4+
-f docker-compose.yml down
5+
6+
docker-compose --env-file ./.env.docker \
7+
-f docker-compose.yml \
8+
-f docker-compose.yml build
9+
10+
docker-compose --env-file ./.env.docker \
11+
-f docker-compose.yml \
12+
-f docker-compose.yml up

package.json

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
"main": "index.js",
66
"scripts": {
77
"test": "jest --coverage",
8-
"start": "export ENVIRONMENT_NAME=local && nodemon",
8+
"start": "node dist/main.js",
9+
"start:development": "ENVIRONMENT_NAME=development node dist/main.js",
10+
"build:env": "webpack-cli --config webpack/production.config.js --stats-error-details",
11+
"build:dev": "webpack-cli --config webpack/dev.config.js --stats-error-details",
12+
"start:local": "ENVIRONMENT_NAME=local && yarn build:dev && yarn start",
913
"start:sharded": "export MONGO_PORT=60000 && yarn start",
1014
"postinstall": "link-module-alias",
1115
"preinstall": "source /usr/local/opt/nvm/nvm.sh; nvm use; command -v link-module-alias && link-module-alias clean || true",
@@ -69,25 +73,33 @@
6973
"response-time": "^2.3.2",
7074
"slack-notify": "^2.0.2",
7175
"swagger-ui-express": "^4.3.0",
72-
"uuid": "^8.3.2"
76+
"uuid": "^8.3.2",
77+
"webpack": "^5.74.0",
78+
"webpack-hot-middleware": "^2.25.2"
7379
},
7480
"devDependencies": {
7581
"@babel/core": "^7.16.7",
7682
"@babel/eslint-parser": "^7.18.2",
7783
"@babel/node": "^7.16.7",
84+
"@babel/plugin-transform-runtime": "^7.18.10",
7885
"@babel/preset-env": "^7.18.2",
7986
"@faker-js/faker": "^6.0.0-alpha.5",
87+
"babel-loader": "^8.2.5",
8088
"eslint": "^8.6.0",
8189
"eslint-config-prettier": "^8.5.0",
8290
"eslint-plugin-prettier": "^4.0.0",
91+
"file-loader": "^6.2.0",
8392
"jest": "^27.4.7",
8493
"jest-coverage-badges": "^1.1.2",
8594
"link-module-alias": "^1.2.0",
8695
"mockingoose": "^2.15.2",
8796
"pre-commit": "^1.2.2",
8897
"prettier": "^2.6.2",
8998
"prettier-standard": "^16.4.1",
90-
"supertest": "^6.2.2"
99+
"regenerator-runtime": "^0.13.9",
100+
"supertest": "^6.2.2",
101+
"terser-webpack-plugin": "^5.3.6",
102+
"webpack-cli": "^4.10.0"
91103
},
92104
"precommit": "lint:staged",
93105
"lint-staged": {

server/api/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@ export default app => {
2121
};
2222

2323
const autoGenerateApisFromModels = app => {
24-
const modelsFolderPath = path.join(
24+
let modelsFolderPath = path.join(
2525
__dirname,
2626
'../../server/database/models/'
2727
);
2828
const fileArray = getModelFiles(modelsFolderPath);
2929
fileArray.forEach(f => {
30-
const { model } = require(modelsFolderPath + f);
30+
// eslint-disable-next-line prefer-template
31+
const { model } = require(`server/database/models/` + f);
3132
const name = f.split('.')[0];
3233

3334
apiGeneratorFactory(app, name, model);

server/api/routes/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ router.get(
2929
fetchAggregatedOrderAmount
3030
);
3131

32-
module.exports = router;
32+
export default router;

server/utils/swagUtils.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ export const generateSwaggerDoc = () => {
7676
);
7777
const fileArray = getModelFiles(modelsFolderPath);
7878
fileArray.forEach(f => {
79-
const { model } = require(modelsFolderPath + f);
79+
// eslint-disable-next-line prefer-template
80+
const { model } = require('server/database/models/' + f);
8081
const name = f.split('.')[0];
8182

8283
const { swaggerPaths, swaggerDefs } = swagGeneratorFactory(name, model);

webpack/dev.config.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* DEVELOPMENT WEBPACK CONFIGURATION
3+
*/
4+
5+
const path = require('path');
6+
const webpack = require('webpack');
7+
8+
module.exports = require('./server.config')({
9+
mode: 'development',
10+
// Add hot reloading in development
11+
entry: [
12+
'webpack-hot-middleware/client?reload=true',
13+
path.join(process.cwd(), '/server/index.js')
14+
],
15+
// Don't use hashes in dev mode for better performance
16+
babelQuery: {
17+
presets: ['@babel/preset-env'],
18+
plugins: ['@babel/plugin-transform-runtime']
19+
},
20+
// Add development plugins
21+
plugins: [
22+
new webpack.HotModuleReplacementPlugin() // Tell webpack we want hot reloading
23+
],
24+
optimization: {}
25+
});

0 commit comments

Comments
 (0)