Personally, I like setting up a docker environment.
An example from a pet project:
docker-compose.yml
version: '3.3'
services:
app:
build:
context: .
dockerfile: Dockerfile
working_dir: /app
command: 'mix phx.server'
ports:
- '4000:4000'
volumes:
- '~/.bash-history:/.bash-history'
- '.:/app:cached'
- '/tmp:/tmp:delegated'
- '.bashrc:/root/.bashrc:cached'
- '/var/run/docker.sock:/var/run/docker.sock:cached'
- '/var/tmp:/var/tmp:cached'
- '/tmp:/tmp:cached'
depends_on:
- db
db:
image: postgres:11-alpine
volumes:
- 'pgdata:/var/lib/postgres/data'
volumes:
pgdata:
Makefile
start:
docker-compose up -d
stop:
docker-compose down
build:
docker-compose build app
shell:
docker-compose run --rm app bash
install:
docker-compose run --rm app mix deps.get
install-assets:
docker-compose run --rm app bash -c "cd assets && npm install && node node_modules/webpack/bin/webpack.js --mode development"
compile:
docker-compose run --rm app bash -c "mix do compile, phx.digest"
db-setup:
docker-compose run --rm app mix ecto.setup
db-reset:
docker-compose run --rm app mix ecto.reset
start-interactive:
docker-compose run --rm --service-ports app iex -S mix phx.server
test:
docker-compose run --rm app mix test
setup: build install install-assets compile db-setup
.PHONY: test