-
Star
(536)
You must be signed in to star a gist -
Fork
(165)
You must be signed in to fork a gist
-
-
Save mpneuried/0594963ad38e68917ef189b4e6a269db to your computer and use it in GitHub Desktop.
# Port to run the container | |
PORT=4000 | |
# Until here you can define all the individual configurations for your app |
# You have to define the values in {} | |
APP_NAME=my-super-app | |
DOCKER_REPO={account-nr}.dkr.ecr.{region}.amazonaws.com | |
# optional aws-cli options | |
AWS_CLI_PROFILE={aws-cli-profile} | |
AWS_CLI_REGION={aws-cli-region} |
# import config. | |
# You can change the default config with `make cnf="config_special.env" build` | |
cnf ?= config.env | |
include $(cnf) | |
export $(shell sed 's/=.*//' $(cnf)) | |
# import deploy config | |
# You can change the default deploy config with `make cnf="deploy_special.env" release` | |
dpl ?= deploy.env | |
include $(dpl) | |
export $(shell sed 's/=.*//' $(dpl)) | |
# grep the version from the mix file | |
VERSION=$(shell ./version.sh) | |
# HELP | |
# This will output the help for each task | |
# thanks to https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html | |
.PHONY: help | |
help: ## This help. | |
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | |
.DEFAULT_GOAL := help | |
# DOCKER TASKS | |
# Build the container | |
build: ## Build the container | |
docker build -t $(APP_NAME) . | |
build-nc: ## Build the container without caching | |
docker build --no-cache -t $(APP_NAME) . | |
run: ## Run container on port configured in `config.env` | |
docker run -i -t --rm --env-file=./config.env -p=$(PORT):$(PORT) --name="$(APP_NAME)" $(APP_NAME) | |
up: build run ## Run container on port configured in `config.env` (Alias to run) | |
stop: ## Stop and remove a running container | |
docker stop $(APP_NAME); docker rm $(APP_NAME) | |
release: build-nc publish ## Make a release by building and publishing the `{version}` ans `latest` tagged containers to ECR | |
# Docker publish | |
publish: repo-login publish-latest publish-version ## Publish the `{version}` ans `latest` tagged containers to ECR | |
publish-latest: tag-latest ## Publish the `latest` taged container to ECR | |
@echo 'publish latest to $(DOCKER_REPO)' | |
docker push $(DOCKER_REPO)/$(APP_NAME):latest | |
publish-version: tag-version ## Publish the `{version}` taged container to ECR | |
@echo 'publish $(VERSION) to $(DOCKER_REPO)' | |
docker push $(DOCKER_REPO)/$(APP_NAME):$(VERSION) | |
# Docker tagging | |
tag: tag-latest tag-version ## Generate container tags for the `{version}` ans `latest` tags | |
tag-latest: ## Generate container `{version}` tag | |
@echo 'create tag latest' | |
docker tag $(APP_NAME) $(DOCKER_REPO)/$(APP_NAME):latest | |
tag-version: ## Generate container `latest` tag | |
@echo 'create tag $(VERSION)' | |
docker tag $(APP_NAME) $(DOCKER_REPO)/$(APP_NAME):$(VERSION) | |
# HELPERS | |
# generate script to login to aws docker repo | |
CMD_REPOLOGIN := "eval $$\( aws ecr" | |
ifdef AWS_CLI_PROFILE | |
CMD_REPOLOGIN += " --profile $(AWS_CLI_PROFILE)" | |
endif | |
ifdef AWS_CLI_REGION | |
CMD_REPOLOGIN += " --region $(AWS_CLI_REGION)" | |
endif | |
CMD_REPOLOGIN += " get-login --no-include-email \)" | |
# login to AWS-ECR | |
repo-login: ## Auto login to AWS-ECR unsing aws-cli | |
@eval $(CMD_REPOLOGIN) | |
version: ## Output the current version | |
@echo $(VERSION) | |
### THIS IST THE VERSION WITH docker-compose | |
# import config. | |
# You can change the default config with `make cnf="config_special.env" build` | |
cnf ?= config.env | |
include $(cnf) | |
export $(shell sed 's/=.*//' $(cnf)) | |
# import deploy config | |
# You can change the default deploy config with `make cnf="deploy_special.env" release` | |
dpl ?= deploy.env | |
include $(dpl) | |
export $(shell sed 's/=.*//' $(dpl)) | |
# grep the version from the mix file | |
VERSION=$(shell ./version.sh) | |
# HELP | |
# This will output the help for each task | |
# thanks to https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html | |
.PHONY: help | |
help: ## This help. | |
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | |
.DEFAULT_GOAL := help | |
# DOCKER TASKS | |
# Build the container | |
build: ## Build the release and develoment container. The development | |
docker-compose build --no-cache $(APP_NAME) | |
docker-compose run $(APP_NAME) grunt build | |
docker build -t $(APP_NAME) . | |
run: stop ## Run container on port configured in `config.env` | |
docker run -i -t --rm --env-file=./config.env -p=$(PORT):$(PORT) --name="$(APP_NAME)" $(APP_NAME) | |
dev: ## Run container in development mode | |
docker-compose build --no-cache $(APP_NAME) && docker-compose run $(APP_NAME) | |
# Build and run the container | |
up: ## Spin up the project | |
docker-compose up --build $(APP_NAME) | |
stop: ## Stop running containers | |
docker stop $(APP_NAME) | |
rm: stop ## Stop and remove running containers | |
docker rm $(APP_NAME) | |
clean: ## Clean the generated/compiles files | |
echo "nothing clean ..." | |
# Docker release - build, tag and push the container | |
release: build publish ## Make a release by building and publishing the `{version}` ans `latest` tagged containers to ECR | |
# Docker publish | |
publish: repo-login publish-latest publish-version ## publish the `{version}` ans `latest` tagged containers to ECR | |
publish-latest: tag-latest ## publish the `latest` taged container to ECR | |
@echo 'publish latest to $(DOCKER_REPO)' | |
docker push $(DOCKER_REPO)/$(APP_NAME):latest | |
publish-version: tag-version ## publish the `{version}` taged container to ECR | |
@echo 'publish $(VERSION) to $(DOCKER_REPO)' | |
docker push $(DOCKER_REPO)/$(APP_NAME):$(VERSION) | |
# Docker tagging | |
tag: tag-latest tag-version ## Generate container tags for the `{version}` ans `latest` tags | |
tag-latest: ## Generate container `{version}` tag | |
@echo 'create tag latest' | |
docker tag $(APP_NAME) $(DOCKER_REPO)/$(APP_NAME):latest | |
tag-version: ## Generate container `latest` tag | |
@echo 'create tag $(VERSION)' | |
docker tag $(APP_NAME) $(DOCKER_REPO)/$(APP_NAME):$(VERSION) | |
# HELPERS | |
# generate script to login to aws docker repo | |
CMD_REPOLOGIN := "aws ecr" | |
ifdef AWS_CLI_PROFILE | |
CMD_REPOLOGIN += "--profile $(AWS_CLI_PROFILE)" | |
endif | |
ifdef AWS_CLI_REGION | |
CMD_REPOLOGIN += "--region $(AWS_CLI_REGION)" | |
endif | |
CMD_REPOLOGIN += "get-login --no-include-email" | |
repo-login: ## Auto login to AWS-ECR unsing aws-cli | |
@eval $(CMD_REPOLOGIN) | |
version: ## output to version | |
@echo $(VERSION) |
# INSTALL | |
# - copy the files deploy.env, config.env, version.sh and Makefile to your repo | |
# - replace the vars in deploy.env | |
# - define the version script | |
# Build the container | |
make build | |
# Build and publish the container | |
make release | |
# Publish a container to AWS-ECR. | |
# This includes the login to the repo | |
make publish | |
# Run the container | |
make run | |
# Build an run the container | |
make up | |
# Stop the running container | |
make stop | |
# Build the container with differnt config and deploy file | |
make cnf=another_config.env dpl=another_deploy.env build |
# Example version script. | |
# Please choose one version or create your own | |
# Node.js: grep the version from a package.json file with jq | |
jq -rM '.version' package.json | |
# Elixir: grep the version from a mix file | |
cat mix.exs | grep version | grep '\([0-9]\+\.\?\)\{3\}' -o |
Escaping colon like this worked:
Escaping colon like this worked:
$(PORT):$ (PORT)
You mentioned on https://gist.github.com/mpneuried/0594963ad38e68917ef189b4e6a269db#gistcomment-2896932 that you used -p
Isn't it a best practice to specify all
as your default target instead of help https://www.gnu.org/prep/standards/html_node/Standard-Targets.html#Standard-Targets
@SpyPower that error must have been due to @fd98279 forgetting to tab-indent the line properly. Unless indented, make
would think the whole line is a target: dependencies
kind of line and get confused by the colon.
Do you get this error for make run?
run:$(APP_NAME) at port $ (PORT)"
@echo "Run docker image
docker run -d -i -t --rm --env-file=./config.env -p=$(PORT):$(PORT) --name="$(APP_NAME)" $(APP_NAME)
vagrant@linux:$ make run
make: Circular 8888 <- 8888 dependency dropped.
-p argument PORT:PORT is causing make to treat that line a circular dependency