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" | |
} | |
} |