Skip to content

Commit

Permalink
Merge pull request #65 from wednesday-solutions/feat/multi-stage-docker
Browse files Browse the repository at this point in the history
Feat/multi stage docker
  • Loading branch information
Rushabh-Wednesday authored Oct 25, 2022
2 parents 4319277 + 9a2b386 commit 6f84a66
Show file tree
Hide file tree
Showing 13 changed files with 834 additions and 20 deletions.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@ typings/
.next

dist
.env.development
.env.docker

23 changes: 18 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
FROM node:14.17-alpine
RUN mkdir -p /app
ADD . /app
WORKDIR /app
FROM node:14.17-alpine AS build1
ARG ENVIRONMENT_NAME
ENV ENVIRONMENT_NAME $ENVIRONMENT_NAME
RUN mkdir -p /app-build
ADD . /app-build
WORKDIR /app-build
RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn --frozen-lockfile
RUN yarn
CMD [ "yarn", "start" ]
RUN yarn build:dev

FROM node:14.17-alpine
ARG ENVIRONMENT_NAME
ENV ENVIRONMENT_NAME $ENVIRONMENT_NAME
RUN apk add yarn
ADD package.json /
ADD . /
COPY --from=build1 /app-build/dist ./dist

CMD ["yarn", "start"]
EXPOSE 9000
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ services:
app:
build:
context: .
args:
ENVIRONMENT_NAME: ${ENVIRONMENT_NAME}
dockerfile: Dockerfile
ports:
- "9000:9000"
Expand Down
12 changes: 12 additions & 0 deletions makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
docker:
docker-compose --env-file ./.env.docker \
-f docker-compose.yml \
-f docker-compose.yml down

docker-compose --env-file ./.env.docker \
-f docker-compose.yml \
-f docker-compose.yml build

docker-compose --env-file ./.env.docker \
-f docker-compose.yml \
-f docker-compose.yml up
18 changes: 15 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@
"main": "index.js",
"scripts": {
"test": "jest --coverage",
"start": "export ENVIRONMENT_NAME=local && nodemon",
"start": "node dist/main.js",
"start:development": "ENVIRONMENT_NAME=development node dist/main.js",
"build:env": "webpack-cli --config webpack/production.config.js --stats-error-details",
"build:dev": "webpack-cli --config webpack/dev.config.js --stats-error-details",
"start:local": "ENVIRONMENT_NAME=local && yarn build:dev && yarn start",
"start:sharded": "export MONGO_PORT=60000 && yarn start",
"postinstall": "link-module-alias",
"preinstall": "source /usr/local/opt/nvm/nvm.sh; nvm use; command -v link-module-alias && link-module-alias clean || true",
Expand Down Expand Up @@ -69,25 +73,33 @@
"response-time": "^2.3.2",
"slack-notify": "^2.0.2",
"swagger-ui-express": "^4.3.0",
"uuid": "^8.3.2"
"uuid": "^8.3.2",
"webpack": "^5.74.0",
"webpack-hot-middleware": "^2.25.2"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/eslint-parser": "^7.18.2",
"@babel/node": "^7.16.7",
"@babel/plugin-transform-runtime": "^7.18.10",
"@babel/preset-env": "^7.18.2",
"@faker-js/faker": "^6.0.0-alpha.5",
"babel-loader": "^8.2.5",
"eslint": "^8.6.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.0.0",
"file-loader": "^6.2.0",
"jest": "^27.4.7",
"jest-coverage-badges": "^1.1.2",
"link-module-alias": "^1.2.0",
"mockingoose": "^2.15.2",
"pre-commit": "^1.2.2",
"prettier": "^2.6.2",
"prettier-standard": "^16.4.1",
"supertest": "^6.2.2"
"regenerator-runtime": "^0.13.9",
"supertest": "^6.2.2",
"terser-webpack-plugin": "^5.3.6",
"webpack-cli": "^4.10.0"
},
"precommit": "lint:staged",
"lint-staged": {
Expand Down
5 changes: 3 additions & 2 deletions server/api/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@ export default app => {
};

const autoGenerateApisFromModels = app => {
const modelsFolderPath = path.join(
let modelsFolderPath = path.join(
__dirname,
'../../server/database/models/'
);
const fileArray = getModelFiles(modelsFolderPath);
fileArray.forEach(f => {
const { model } = require(modelsFolderPath + f);
// eslint-disable-next-line prefer-template
const { model } = require(`server/database/models/` + f);
const name = f.split('.')[0];

apiGeneratorFactory(app, name, model);
Expand Down
2 changes: 1 addition & 1 deletion server/api/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ router.get(
fetchAggregatedOrderAmount
);

module.exports = router;
export default router;
3 changes: 2 additions & 1 deletion server/utils/swagUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ export const generateSwaggerDoc = () => {
);
const fileArray = getModelFiles(modelsFolderPath);
fileArray.forEach(f => {
const { model } = require(modelsFolderPath + f);
// eslint-disable-next-line prefer-template
const { model } = require('server/database/models/' + f);
const name = f.split('.')[0];

const { swaggerPaths, swaggerDefs } = swagGeneratorFactory(name, model);
Expand Down
25 changes: 25 additions & 0 deletions webpack/dev.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* DEVELOPMENT WEBPACK CONFIGURATION
*/

const path = require('path');
const webpack = require('webpack');

module.exports = require('./server.config')({
mode: 'development',
// Add hot reloading in development
entry: [
'webpack-hot-middleware/client?reload=true',
path.join(process.cwd(), '/server/index.js')
],
// Don't use hashes in dev mode for better performance
babelQuery: {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-transform-runtime']
},
// Add development plugins
plugins: [
new webpack.HotModuleReplacementPlugin() // Tell webpack we want hot reloading
],
optimization: {}
});
12 changes: 12 additions & 0 deletions webpack/production.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = require('./server.config')({
mode: 'production',
entry: [path.join(process.cwd(), '/server/index.js')],
plugins: [],
optimization: {
minimize: true,
minimizer: [new TerserPlugin()]
}
});
66 changes: 66 additions & 0 deletions webpack/server.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const path = require('path');
const webpack = require('webpack');
const dotenv = require('dotenv');
require('@babel/register'); // will bind itself to node's require and automatically compile files on the fly

const dotEnvFile =
process.env.ENVIRONMENT_NAME === 'production'
? `.env`
: `.env.${process.env.ENVIRONMENT_NAME || 'local'}`;

const env = dotenv.config({ path: dotEnvFile }).parsed;

const envKeys = {
...Object.keys(process.env).reduce((prev, next) => {
prev[`process.env.${next}`] = JSON.stringify(process.env[next]);
return prev;
}, {}),
...Object.keys(env).reduce((prev, next) => {
prev[`process.env.${next}`] = JSON.stringify(env[next]);
return prev;
}, {})
};

module.exports = (options = {}) => ({
mode: options.mode,
entry: options.entry,
devtool: 'source-map',
module: {
rules: [
{
test: /\.jsx?$/, // Transform all .js and .jsx files required somewhere with Babel
exclude: /node_modules/,
use: {
loader: 'babel-loader', // allows transpiling JavaScript files using Babel and webpack
options: options.babelQuery
}
}
]
},
plugins: options.plugins.concat([new webpack.DefinePlugin(envKeys)]),
optimization: options.optimization,
node: {
__dirname: true
},
resolve: {
modules: ['node_modules'],
alias: {
utils: path.resolve(__dirname, '../server/utils'),
middlewares: path.resolve(__dirname, '../server/middlewares'),
server: path.resolve(__dirname, '../server'),
api: path.resolve(__dirname, '../server/api'),
config: path.resolve(__dirname, '../config'),
services: path.resolve(__dirname, '../server/services'),
database: path.resolve(__dirname, '../server/database'),
daos: path.resolve(__dirname, '../server/daos'),
'superagent-proxy': false
},

extensions: ['.js']
},
output: {
libraryTarget: 'commonjs'
},

target: 'node'
});
Loading

0 comments on commit 6f84a66

Please sign in to comment.