Clarify script checks requiring shell

Closes https://github.com/hashicorp/nomad/issues/5981
This commit is contained in:
Mahmood Ali 2019-07-22 18:34:59 +08:00
parent 790e18b973
commit 305b61631e

View file

@ -268,45 +268,39 @@ resources {
} }
``` ```
### Check with Bash-isms ### Script Checks with Shells
This example shows a common mistake and correct behavior for custom checks. This example shows a service with a script check that is evaluated and interpolated in a shell; it
Suppose a health check like this: tests whether a file is present at `${HEALTH_CHECK_FILE}` environment variable:
```shell
$ test -f /tmp/file.txt
```
In this example `test` is not actually a command (binary) on the system; it is a
built-in shell function to bash. Thus, the following **would not work**:
```hcl
service {
check {
type = "script"
command = "test -f /tmp/file.txt" # THIS IS NOT CORRECT
}
}
```
Nomad will attempt to find an executable named `test` on your system, but it
does not exist. It is actually just a function of bash. Additionally, it is not
possible to specify the arguments in a single string. Here is the correct
solution:
```hcl ```hcl
service { service {
check { check {
type = "script" type = "script"
command = "/bin/bash" command = "/bin/bash"
args = ["-c", "test -f /tmp/file.txt"] args = ["-c", "test -f ${HEALTH_CHECK_FILE}"]
} }
} }
``` ```
The `command` is actually `/bin/bash`, since that is the actual process we are Using `/bin/bash` (or another shell) is required here to interpolate the `${HEALTH_CHECK_FILE}` value.
running. The arguments to that command are the script itself, which each
argument provided as a value to the `args` array. The following examples of `command` fields **will not work**:
```hcl
# invalid because command is not a path
check {
type = "script"
command = "test -f /tmp/file.txt"
}
# invalid because path will not be interpolated
check {
type = "script"
command = "/bin/test"
args = ["-f", "${HEALTH_CHECK_FILE}"]
}
```
### HTTP Health Check ### HTTP Health Check