--- layout: guides page_title: Configuring Tasks - Operating a Job sidebar_title: Configuring Tasks description: |- Most applications require some kind of configuration. Whether the configuration is provided via the command line, environment variables, or a configuration file, Nomad has built-in functionality for configuration. This section details three common patterns for configuring tasks. --- # Configuring Tasks Most applications require some kind of local configuration. While command line arguments are the simplest method, many applications require more complex configurations provided via environment variables or configuration files. This section explores how to configure Nomad jobs to support many common configuration use cases. ## Command-line Arguments Many tasks accept configuration via command-line arguments. For example, consider the [http-echo](https://github.com/hashicorp/http-echo) server which is a small go binary that renders the provided text as a webpage. The binary accepts two parameters: - `-listen` - the `address:port` to listen on - `-text` - the text to render as the HTML page Outside of Nomad, the server is started like this: ```shell $ http-echo -listen=":5678" -text="hello world" ``` The Nomad equivalent job file might look something like this: ```hcl job "docs" { datacenters = ["dc1"] group "example" { task "server" { driver = "exec" config { command = "/bin/http-echo" args = [ "-listen", ":5678", "-text", "hello world", ] } resources { network { mbits = 10 port "http" { static = "5678" } } } } } } ``` ~> **This assumes** the http-echo binary is already installed and available in the system path. Nomad can also optionally fetch the binary using the artifact resource. Nomad has many [drivers](/docs/drivers), and most support passing arguments to their tasks via the `args` parameter. This parameter also supports [Nomad interpolation](/docs/runtime/interpolation). For example, if you wanted Nomad to dynamically allocate a high port to bind the service on instead of relying on a static port for the previous job: ```hcl job "docs" { datacenters = ["dc1"] group "example" { task "server" { driver = "exec" config { command = "/bin/http-echo" args = [ "-listen", ":${NOMAD_PORT_http}", "-text", "hello world", ] } resources { network { mbits = 10 port "http" {} } } } } } ``` ## Environment Variables Some applications can be configured via environment variables. [The Twelve-Factor App](https://12factor.net/config) document suggests configuring applications through environment variables. Nomad supports custom environment variables in two ways: - Interpolation in an `env` stanza - Templated in a `template` stanza ### `env` stanza Each task may have an `env` stanza which specifies environment variables: ```hcl task "server" { env { my_key = "my-value" } } ``` The `env` stanza also supports [interpolation](/docs/runtime/interpolation): ```hcl task "server" { env { LISTEN_PORT = "${NOMAD_PORT_http}" } } ``` See the [`env`](/docs/job-specification/env) docs for details. ### Environment Templates Nomad's [`template`][template] stanza can be used to generate environment variables. Environment variables may be templated with [Node attributes and metadata][nodevars], the contents of files on disk, Consul keys, or secrets from Vault: ```hcl template { data = <