Run it locally
There are two ready-made environments. local is for dotnet run: sample data on, logs to the console. docker is for Docker Compose: sample data on, logs to Seq, database on a volume. Both are for your machine. Neither is for production, which is why neither is the default.
Run it
Section titled “Run it”dotnet run --project ./src/PresentationlaunchSettings.json sets the environment to local and listens on http://localhost:5032 and https://localhost:7032.
docker compose up -d --buildCompose builds the run stage, starts Seq next to it and publishes the API on http://localhost:8080. Shut it down with docker compose down, or docker compose down -v to drop the database too.
docker build . --target run --tag acme-movies:localdocker run --rm -p 8080:8080 -e DOTNET_ENVIRONMENT=docker acme-movies:localWithout Compose there’s no Seq, so the Serilog sink in appsettings.docker.json has nowhere to send the logs. Swap it for Console if you run the image on its own.
Find your way around
Section titled “Find your way around”| Where | What |
|---|---|
/scalar |
The Scalar API reference, built from the OpenAPI document |
/openapi/v1.json |
The OpenAPI document itself |
/health/live |
Answers 200 while the process is up |
/health/ready |
Answers 200 when the database can be reached |
/api/version |
The version stamped into the build |
| http://localhost:5341 | Seq, when running with Docker Compose |
The health endpoints answer without a token even when authentication is on, so a load balancer never needs to log in.
Try the endpoints
Section titled “Try the endpoints”The sample data uses a fixed seed, so these ids are the same on every machine. See the endpoint reference for every parameter and response.
# Search movies, two at a timecurl "http://localhost:5032/api/movies?query=global&limit=2"
# One movie, with its reviewscurl "http://localhost:5032/api/movies/e159975e-4e6a-1ffd-713e-1eb9d8d4a593"
# Write a reviewcurl -X POST "http://localhost:5032/api/reviews" -H "Content-Type: application/json" \ -d '{"authorId":"01fa8b58-05d2-abd4-e55c-2633222dd0a5","movieId":"e159975e-4e6a-1ffd-713e-1eb9d8d4a593","stars":5}'Run the tests
Section titled “Run the tests”dotnet testEach test class builds its own in-memory SQLite database from the migrations and the same fixed seed. No test can change what another one sees, and nothing touches movie-reviews.db.
Run just one part of the Dockerfile
Section titled “Run just one part of the Dockerfile”The Dockerfile has a stage for each job, so you can build only what you need.
| Stage | What it does |
|---|---|
build |
Restores and builds the solution |
test |
Runs every test with coverage |
coverage |
Exports the coverage report to your machine |
publish |
Publishes the Presentation project |
run |
The image you deploy |
docker build . --target coverage --output type=local,dest=outStamp a version
Section titled “Stamp a version”docker build . --target run --tag acme-movies:latest \ --build-arg VERSION_PREFIX=1.2.3 --build-arg VERSION_SUFFIX=betaGET /api/version then reports 1.2.3-beta and the commit it was built from.