docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
jq é requirido O arquivo package.json é utilizado como referencia para o tagueamento das imagens docker
make help
make run ARGS="-d"
make run-dev
make sh-dev| version: "3.5" | |
| services: | |
| server: | |
| build: | |
| target: development | |
| image: company/app-name:${APP_VERSION:-latest}-dev | |
| container_name: "app-name-dev" | |
| environment: | |
| - NODE_ENV=development | |
| - PORT=3073 | |
| ports: | |
| - 3073:3073 | |
| command: "sh -c 'yarn install && yarn run pm2:flush && yarn run start:dev'" |
| version: "3.5" | |
| services: | |
| server: | |
| build: | |
| context: . | |
| dockerfile: Dockerfile | |
| target: production | |
| image: m4ucorp/ativacao-auth:${APP_VERSION:-latest} | |
| restart: unless-stopped | |
| working_dir: /app | |
| container_name: "ativacao-auth" | |
| environment: | |
| - NODE_ENV=production | |
| - PORT=8000 | |
| volumes: | |
| - ./:/app | |
| ports: | |
| - 8000:8000 | |
| command: "yarn run pm2:runtime" |
| FROM node:10.15-alpine as base | |
| RUN apk --no-cache --virtual build-dependencies add \ | |
| python \ | |
| make \ | |
| g++ \ | |
| && rm -f /var/cache/apk/* \ | |
| && npm config set unsafe-perm true \ | |
| && npm install --quiet node-gyp -g --cache /tmp/empty-cache | |
| # builder # | |
| FROM base AS builder | |
| WORKDIR /app | |
| ENV NODE_ENV=production | |
| COPY ./package*.json . | |
| COPY ./yarn.lock . | |
| RUN yarn install && yarn cache clean | |
| COPY . . | |
| # production # | |
| FROM node:10.15-alpine AS production | |
| WORKDIR /app | |
| ## copy project | |
| COPY --from=builder /app . | |
| ENV NODE_ENV=production | |
| CMD [ "yarn", "pm2:runtime" ] | |
| # development # | |
| FROM base AS development | |
| WORKDIR /app | |
| ENV NODE_ENV=development |
| const isProd = process.env.NODE_ENV === 'production' | |
| module.exports = { | |
| apps: [{ | |
| name: 'app-name', | |
| script: './src/index.js', | |
| ignore_watch: ['node_modules', 'data', '.git', '*.log'], | |
| instances: isProd ? 'max' : 1, | |
| exec_mode: 'cluster', | |
| env: { | |
| NODE_ENV: 'development' | |
| }, | |
| env_production: { | |
| NODE_ENV: 'production' | |
| } | |
| }] | |
| } |
| APP_VERSION = $(shell jq -r ".version" package.json) | |
| COMPOSE = docker-compose -f docker-compose.yml | |
| COMPOSE_DEV = $(COMPOSE) -f docker-compose.dev.yml | |
| ENV = APP_VERSION=$(APP_VERSION) | |
| BUILD_CMD = build --force ${ARGS} | |
| UP_CMD = up ${ARGS} | |
| DOWN_CMD = down ${ARGS} | |
| SH_CMD = exec server sh ${ARGS} | |
| image: ## Build docker image with current version of package.json (image-dev available) | |
| - @echo "Bulding docker image v$(APP_VERSION) (prod)" | |
| - $(ENV) $(COMPOSE) $(BUILD_CMD) | |
| image-dev: | |
| - @echo "Bulding docker image v$(APP_VERSION) (dev)" | |
| - $(ENV) $(COMPOSE_DEV) $(BUILD_CMD) | |
| run: ## Run and up project (run-dev available) | |
| - @echo "Running project v$(APP_VERSION) (prod)" | |
| - $(ENV) $(COMPOSE) $(UP_CMD) | |
| run-dev: | |
| - @echo "Running project v$(APP_VERSION) (dev)" | |
| - $(ENV) $(COMPOSE_DEV) $(UP_CMD) | |
| sh: ## Enter inside container sh (sh-dev available) | |
| - $(ENV) $(COMPOSE) $(SH_CMD) | |
| sh-dev: | |
| - $(ENV) $(COMPOSE_DEV) $(SH_CMD) | |
| down: ## Down docker-compose project (down-dev available) | |
| - @echo "Downing project v$(APP_VERSION) (prod)" | |
| - $(ENV) $(COMPOSE) $(DOWN_CMD) | |
| down-dev: | |
| - @echo "Downing project v$(APP_VERSION) (prod)" | |
| - $(ENV) $(COMPOSE_DEV) $(DOWN_CMD) | |
| help: ## Show makefile helper | |
| - @printf '\e[1;33m%-6s\e[m' "Makefile available commands" | |
| - @echo '' | |
| - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' | |
| - @printf '\e[1;32m%-6s\e[m' "> Commands with -dev available use docker-compose.dev.yml as the configuration file." | |
| - @echo -e '\n' | |
| - @printf '\e[1;33m%-6s\e[m' "Passing arguments" | |
| - @echo -e '\nmake image-dev ARGS="--no-cache"' | |
| - @echo -e 'make run ARGS="-d"' | |
| - @echo -e '\nenvironment: \n $(ENV)' | |
| .DEFAULT_GOAL := help | |
| .PHONY: help |
| { | |
| "name": "claro-controle-ativacao-auth", | |
| "version": "1.2.0", | |
| "main": "index.js", | |
| "author": "Vinicius Reis <[email protected]>", | |
| "license": "MIT", | |
| "scripts": { | |
| "start:dev": "yarn pm2:watch && yarn pm2:logs", | |
| "start:prod": "yarn pm2:production && yarn pm2:logs", | |
| "pm2:watch": "pm2 start --watch", | |
| "pm2:runtime": "npx pm2-runtime --json ecosystem.config.js --env production", | |
| "pm2:production": "pm2 start --env production", | |
| "pm2:prune": "pm2 delete auth-server", | |
| "pm2:stop": "pm2 stop auth-server", | |
| "pm2:logs": "pm2 logs -n auth-server --raw", | |
| "pm2:flush": "pm2 flush" | |
| }, | |
| "dependencies": { | |
| "awilix": "^4.2.2", | |
| "config": "^3.2.2", | |
| "fastify": "^2.7.1", | |
| "pm2": "^3.5.1" | |
| }, | |
| "devDependencies": { | |
| "eslint": "^6.1.0", | |
| "eslint-config-standard": "^13.0.1", | |
| "eslint-plugin-import": "^2.18.2", | |
| "eslint-plugin-node": "^9.1.0", | |
| "eslint-plugin-promise": "^4.2.1", | |
| "eslint-plugin-standard": "^4.0.0", | |
| "pino-pretty": "^3.2.0" | |
| } | |
| } |