Configuration
The Nitric CLI uses a configuration file named nitric.yaml
to define the structure of your project. This file specifies the name of your project, where nitric should look for the entrypoints to your application, and other project-specific settings.
Projects created from a template using the Nitric CLI will have a nitric.yaml
file created for you. If you are creating a project from scratch, you can create a nitric.yaml
file in the root of your project.
If you're new to Nitric and starting from a project template, you can skip
this section and start building your application. The nitric.yaml
file will
be created for you. Use this section as a reference when you need to customize
your project configuration or understand how the configuration works.
Example nitric.yaml
name: my-projectservices:- match: services/*runtime: gotype: ''start: go run ./$SERVICE_PATH/...runtimes:go:dockerfile: ./golang.dockerfilecontext: ''args: {}
Configuration Options
name
The name of your project. This is used to identify your project and it used when auto-generating service and resource names during deployment.
services
A list of service types that make up your project. Typically, nitric will build each service in your project into a separate container image. Each service can have its own runtime, build configuration, and start command.
match
A glob pattern that matches service entrypoints. Each file matching this pattern will be treated as a separate service. This allows multiple services to share a single runtime configuration and type
.
For example, with the following configuration:
services:- match: services/*runtime: gotype: ''start: go run ./$SERVICE_PATH/...
And the project structure below:
services/service1/main.goservice2/main.go
services/├── service1/│ └── main.go└── service2/└── main.go
Both service1/main.go
and service2/main.go
will be treated as separate services with the same runtime configuration.
basedir
(optional)
The base directory to search for service entrypoints. If not provided, the base directory is the root of the project. This is useful when you want to group services under a specific directory or you're working with a monorepo.
If you're using a custom runtime configuration, the basedir
value will be used as the context for the Docker build, i.e. it will override
the context
value in the runtime configuration.
runtime
(optional)
The runtime to use for this service. For certain languages like JavaScript, Python and Dart the runtime can be inferred from the file extension. For other languages, you will need to specify the runtime.
If a runtime is provided it must match the name of a runtime configuration in the runtimes
section.
type
(optional)
Type is essentially the name for this group of services. It is used to group services together for deployment and resource management. If not provided, the service will be grouped under the 'default' type.
The most common use case for this is grouping service with similar deployed resource requirements together. For example, you make have a set of services that required additional vCPU or memory resources at runtime. You can group these services together under a specific type and apply resource constraints to that type in a stack file.
For example, if you have a set of services that require additional memory, you can group them together under a type named memory-intensive
, separate from the default type.
services:- match: services/other/*runtime: gostart: go run ./$SERVICE_PATH/...- match: services/memory-intensive/*runtime: go# Group these services under the 'memory-intensive' typetype: memory-intensivestart: go run ./$SERVICE_PATH/...
start
(optional)
The command to start the service during local development. This command is used when running locally using the nitric start
CLI command. This command will be executed once for each service, with the $SERVICE_PATH
environment variable set to the path to the service entrypoint.
For example, with the following configuration:
services:- match: services/*runtime: gotype: ''start: go run ./$SERVICE_PATH/...
And the project structure below:
services/service1/main.goservice2/main.go
When running nitric start
, the following commands will be executed:
go run ./services/service1/main.gogo run ./services/service2/main.go
batch-services
(optional)
A list of batch service types that make up your project. Batch services are used to run high-performance computing tasks, data processing or tasks requiring GPUs, or a large number of vCPUs or memory.
Batch services are similar to services but are optimized for running batch processing tasks. You can read more about batch services in the batch service section.
The configuration options for batch-services
are the same as for services
.
runtimes
(optional)
A list of runtime configurations that can be used by services in your project. Each runtime configuration defines how to build a service for a specific runtime. For example, this can be used to define a custom Dockerfile for a specific runtime.
For example, with the following configuration:
runtimes:go:dockerfile: ./golang.dockerfilecontext: ''args: {}
Nitric ships with a set of default runtime configurations for common languages. You can override these default configurations by providing your own runtime configuration. The runtime configuration must match the runtime name used in the services
section.
dockerfile
The path to the Dockerfile template used to build the services. This path is relative to the root of the project. The Dockerfile template will be provided with the following arguments:
HANDLER
: The service entrypoint path relative to the base directory.
Here is an example of a Dockerfile template for Go services:
FROM golang:alpine AS build# Include the HANDLER argument, nitric will populate this with the service entrypoint pathARG HANDLERWORKDIR /app/COPY go.mod *.sum ./RUN go mod download# Note: Operations like COPY are relative to the `basedir` value in service configuration.# Or the root of the project if not provided.COPY . .# Build the Go App from the provided HANDLER (this will be based on matches in your nitric.yaml fle)RUN go build -o /bin/main ./${HANDLER}/...FROM alpineCOPY --from=build /bin/main /bin/mainRUN chmod +x-rw /bin/mainRUN apk update && \apk add --no-cache tzdata ca-certificates && \update-ca-certificatesENTRYPOINT ["/bin/main"]
The Dockerfile only needs to start your application. The Nitric CLI will automatically wrap this Dockerfile with additional build steps to inject the Nitric runtime and build context for the target platform.
context
(optional)
The build context to use when building the container image. This is the directory that will be provided to the Docker build command as the build context. If not provided, the build context will be the root of the project.
Any services using this runtime which have a basedir
value set will use the
basedir
value as the build context instead of the context
value.
args
(optional)
A map of additional arguments to provide to the Docker build command. These arguments will be provided to the Docker build command as --build-arg
arguments.
For example, with the following configuration:
runtimes:go:dockerfile: ./golang.dockerfilecontext: ''args:GO_VERSION: 1.16