Skip to content

Instantly share code, notes, and snippets.

@wilcorrea
Forked from vinicius73/Dockerfile
Created August 15, 2019 20:01
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wilcorrea/6db272c25ba5007f99955e65bb64b73e to your computer and use it in GitHub Desktop.
Save wilcorrea/6db272c25ba5007f99955e65bb64b73e to your computer and use it in GitHub Desktop.
Node project with PM2 and Docker

App Name

Docker compose (development)

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

Makefile

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: company/app-name:${APP_VERSION:-latest}
restart: unless-stopped
working_dir: /app
container_name: "app-name"
environment:
- NODE_ENV=production
- PORT=8000
volumes:
- ./:/app
ports:
- 8000:8000
command: "yarn run start:prod"
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", "start:prod" ]
# 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": "app-name",
"version": "1.2.0",
"main": "src/index.js",
"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:production": "pm2 start --env production",
"pm2:prune": "pm2 delete app-name",
"pm2:stop": "pm2 stop app-name",
"pm2:logs": "pm2 logs -n app-name --raw",
"pm2:flush": "pm2 flush"
},
"dependencies": {
"pm2": "^3.5.1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment