From 6f304bca16b305f23aaea5e11867837eff0bfe30 Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Sun, 25 Feb 2024 10:52:47 +0100 Subject: [PATCH 1/4] feat: add yaml to/from functions --- go.mod | 2 +- internal/template/template.go | 4 ++++ internal/template/yaml.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 internal/template/yaml.go diff --git a/go.mod b/go.mod index 3203a180..606e3746 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/Masterminds/sprig/v3 v3.2.3 github.com/fsouza/go-dockerclient v1.10.2 github.com/stretchr/testify v1.8.4 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -47,5 +48,4 @@ require ( golang.org/x/sys v0.16.0 // indirect golang.org/x/tools v0.6.0 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/template/template.go b/internal/template/template.go index 11aff2f8..def540d3 100644 --- a/internal/template/template.go +++ b/internal/template/template.go @@ -75,6 +75,10 @@ func newTemplate(name string) *template.Template { "replace": strings.Replace, "parseBool": strconv.ParseBool, "parseJson": unmarshalJson, + "fromYaml": fromYaml, + "toYaml": toYaml, + "mustFromYaml": mustFromYaml, + "mustToYaml": mustToYaml, "queryEscape": url.QueryEscape, "sha1": hashSha1, "split": strings.Split, diff --git a/internal/template/yaml.go b/internal/template/yaml.go new file mode 100644 index 00000000..f6fcfcf0 --- /dev/null +++ b/internal/template/yaml.go @@ -0,0 +1,31 @@ +package template + +import "gopkg.in/yaml.v3" + +// fromYaml decodes YAML into a structured value, ignoring errors. +func fromYaml(v string) interface{} { + output, _ := mustFromYaml(v) + return output +} + +// mustFromYaml decodes YAML into a structured value, returning errors. +func mustFromYaml(v string) (interface{}, error) { + var output interface{} + err := yaml.Unmarshal([]byte(v), &output) + return output, err +} + +// toYaml encodes an item into a YAML string +func toYaml(v interface{}) string { + output, _ := mustToYaml(v) + return string(output) +} + +// toYaml encodes an item into a YAML string, returning errors +func mustToYaml(v interface{}) (string, error) { + output, err := yaml.Marshal(v) + if err != nil { + return "", err + } + return string(output), nil +} From fa475c67373829ee01124759aec35ba7c3f5d8d5 Mon Sep 17 00:00:00 2001 From: Nicolas Duchon Date: Sun, 25 Feb 2024 10:53:57 +0100 Subject: [PATCH 2/4] tests: yaml to/from functions --- internal/template/yaml_test.go | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 internal/template/yaml_test.go diff --git a/internal/template/yaml_test.go b/internal/template/yaml_test.go new file mode 100644 index 00000000..f8e47aed --- /dev/null +++ b/internal/template/yaml_test.go @@ -0,0 +1,36 @@ +package template + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +var testYaml = `bool: true +list: + - foo + - bar +number: 42 +string: test +` + +var testJson = `{"bool":true,"list":["foo","bar"],"number":42,"string":"test"}` + +var testDict = map[string]interface{}{ + "bool": true, + "number": 42, + "string": "test", + "list": []interface{}{ + "foo", + "bar", + }, +} + +func TestFromYaml(t *testing.T) { + assert.Equal(t, testDict, fromYaml(testYaml)) + assert.Equal(t, testDict, fromYaml(testJson)) +} + +func TestToYaml(t *testing.T) { + assert.Equal(t, testYaml, toYaml(testDict)) +} From b854b5a4d9fdddf106df38fb6c4dadd23f8e0f1d Mon Sep 17 00:00:00 2001 From: Nicolas Duchon Date: Sun, 25 Feb 2024 11:03:32 +0100 Subject: [PATCH 3/4] docs: run prettier on README.md --- README.md | 226 +++++++++++++++++++++++++++--------------------------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index 59005a00..80b2d5b4 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,37 @@ -docker-gen -===== - +# docker-gen [![Tests](https://github.com/nginx-proxy/docker-gen/actions/workflows/tests.yml/badge.svg)](https://github.com/nginx-proxy/docker-gen/actions/workflows/tests.yml) [![GitHub release](https://img.shields.io/github/v/release/nginx-proxy/docker-gen)](https://github.com/nginx-proxy/docker-gen/releases) [![Docker Image Size](https://img.shields.io/docker/image-size/nginxproxy/docker-gen?sort=semver)](https://hub.docker.com/r/nginxproxy/docker-gen "Click to view the image on Docker Hub") -[![Docker stars](https://img.shields.io/docker/stars/nginxproxy/docker-gen.svg)](https://hub.docker.com/r/nginxproxy/docker-gen 'DockerHub') -[![Docker pulls](https://img.shields.io/docker/pulls/nginxproxy/docker-gen.svg)](https://hub.docker.com/r/nginxproxy/docker-gen 'DockerHub') +[![Docker stars](https://img.shields.io/docker/stars/nginxproxy/docker-gen.svg)](https://hub.docker.com/r/nginxproxy/docker-gen "DockerHub") +[![Docker pulls](https://img.shields.io/docker/pulls/nginxproxy/docker-gen.svg)](https://hub.docker.com/r/nginxproxy/docker-gen "DockerHub") `docker-gen` is a file generator that renders templates using docker container meta-data. It can be used to generate various kinds of files for: - * **Centralized logging** - [fluentd](https://github.com/nginx-proxy/docker-gen/blob/main/templates/fluentd.conf.tmpl), logstash or other centralized logging tools that tail the containers JSON log file or files within the container. - * **Log Rotation** - [logrotate](https://github.com/nginx-proxy/docker-gen/blob/main/templates/logrotate.tmpl) files to rotate container JSON log files - * **Reverse Proxy Configs** - [nginx](https://github.com/nginx-proxy/docker-gen/blob/main/templates/nginx.tmpl), [haproxy](https://github.com/jwilder/docker-discover), etc. reverse proxy configs to route requests from the host to containers - * **Service Discovery** - Scripts (python, bash, etc..) to register containers within [etcd](https://github.com/jwilder/docker-register), hipache, etc.. +- **Centralized logging** - [fluentd](https://github.com/nginx-proxy/docker-gen/blob/main/templates/fluentd.conf.tmpl), logstash or other centralized logging tools that tail the containers JSON log file or files within the container. +- **Log Rotation** - [logrotate](https://github.com/nginx-proxy/docker-gen/blob/main/templates/logrotate.tmpl) files to rotate container JSON log files +- **Reverse Proxy Configs** - [nginx](https://github.com/nginx-proxy/docker-gen/blob/main/templates/nginx.tmpl), [haproxy](https://github.com/jwilder/docker-discover), etc. reverse proxy configs to route requests from the host to containers +- **Service Discovery** - Scripts (python, bash, etc..) to register containers within [etcd](https://github.com/jwilder/docker-register), hipache, etc.. -=== +--- ### Installation There are three common ways to run docker-gen: -* on the host -* bundled in a container with another application -* separate standalone containers + +- on the host +- bundled in a container with another application +- separate standalone containers #### Host Install Linux/OSX binaries for release [0.9.0](https://github.com/nginx-proxy/docker-gen/releases) -* [amd64](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-linux-amd64-0.9.0.tar.gz) -* [i386](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-linux-i386-0.9.0.tar.gz) -* [alpine-linux](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-alpine-linux-amd64-0.9.0.tar.gz) +- [amd64](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-linux-amd64-0.9.0.tar.gz) +- [i386](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-linux-i386-0.9.0.tar.gz) +- [alpine-linux](https://github.com/nginx-proxy/docker-gen/releases/download/0.9.0/docker-gen-alpine-linux-amd64-0.9.0.tar.gz) Download the version you need, untar, and install to your PATH. @@ -67,6 +66,7 @@ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx ``` Fetch the template and start the docker-gen container with the shared volume: + ```console mkdir -p /tmp/templates && cd /tmp/templates curl -o nginx.tmpl https://raw.githubusercontent.com/nginx-proxy/docker-gen/main/templates/nginx.tmpl @@ -82,9 +82,10 @@ Start a container, taking note of any Environment variables a container expects. docker run --env VIRTUAL_HOST='example.com' --env VIRTUAL_PORT=80 ... ``` -=== +--- ### Usage + ``` $ docker-gen Usage: docker-gen [options] template [dest] @@ -144,7 +145,6 @@ Environment Variables: If no `` file is specified, the output is sent to stdout. Mainly useful for debugging. - ### Configuration file Using the -config flag from above you can tell docker-gen to use the specified config file instead of command-line options. Multiple templates can be defined and they will be executed in the order that they appear in the config file. @@ -152,6 +152,7 @@ Using the -config flag from above you can tell docker-gen to use the specified c An example configuration file, **docker-gen.cfg** can be found in the examples folder. #### Configuration File Syntax + ```ini [[config]] # Starts a configuration section @@ -184,7 +185,9 @@ containername = 1 container_id = 1 # or the container id can be used followed by the signal to send ``` + Putting it all together here is an example configuration file. + ```ini [[config]] template = "/etc/nginx/nginx.conf.tmpl" @@ -208,7 +211,7 @@ nginx = 1 # 1 is a signal number to be sent; here SIGHUP e75a60548dc9 = 1 # a key can be either container name (nginx) or ID ``` -=== +--- ### Templating @@ -320,101 +323,101 @@ For example, this is a JSON version of an emitted RuntimeContainer struct: ```json { - "ID":"71e9768075836eb38557adcfc71a207386a0c597dbeda240cf905df79b18cebf", - "Addresses":[ - { - "IP":"172.17.0.4", - "Port":"22", - "Proto":"tcp", - "HostIP":"192.168.10.24", - "HostPort":"2222" - } - ], - "Gateway":"172.17.42.1", - "Node": { - "ID":"I2VY:P7PF:TZD5:PGWB:QTI7:QDSP:C5UD:DYKR:XKKK:TRG2:M2BL:DFUN", - "Name":"docker-test", - "Address": { - "IP":"192.168.10.24" - } - }, - "Labels": { - "operatingsystem":"Ubuntu 14.04.2 LTS", - "storagedriver":"devicemapper", - "anything_foo":"something_bar" - }, - "IP":"172.17.0.4", - "Name":"docker_register", - "Hostname":"71e976807583", - "Image":{ - "Registry":"jwilder", - "Repository":"docker-register" - }, - "Env":{ - "ETCD_HOST":"172.17.42.1:4001", - "PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "DOCKER_HOST":"unix:///var/run/docker.sock", - "HOST_IP":"172.17.42.1" - }, - "Volumes":{ - "/mnt":{ - "Path":"/mnt", - "HostPath":"/Users/joebob/tmp", - "ReadWrite":true - } - } + "ID": "71e9768075836eb38557adcfc71a207386a0c597dbeda240cf905df79b18cebf", + "Addresses": [ + { + "IP": "172.17.0.4", + "Port": "22", + "Proto": "tcp", + "HostIP": "192.168.10.24", + "HostPort": "2222" + } + ], + "Gateway": "172.17.42.1", + "Node": { + "ID": "I2VY:P7PF:TZD5:PGWB:QTI7:QDSP:C5UD:DYKR:XKKK:TRG2:M2BL:DFUN", + "Name": "docker-test", + "Address": { + "IP": "192.168.10.24" + } + }, + "Labels": { + "operatingsystem": "Ubuntu 14.04.2 LTS", + "storagedriver": "devicemapper", + "anything_foo": "something_bar" + }, + "IP": "172.17.0.4", + "Name": "docker_register", + "Hostname": "71e976807583", + "Image": { + "Registry": "jwilder", + "Repository": "docker-register" + }, + "Env": { + "ETCD_HOST": "172.17.42.1:4001", + "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "DOCKER_HOST": "unix:///var/run/docker.sock", + "HOST_IP": "172.17.42.1" + }, + "Volumes": { + "/mnt": { + "Path": "/mnt", + "HostPath": "/Users/joebob/tmp", + "ReadWrite": true + } + } } ``` #### Functions -* [Functions from Go](https://pkg.go.dev/text/template#hdr-Functions) -* [Functions from Sprig v3](https://masterminds.github.io/sprig/), except for those that have the same name as one of the following functions. -* *`closest $array $value`*: Returns the longest matching substring in `$array` that matches `$value` -* *`coalesce ...`*: Returns the first non-nil argument. -* *`contains $map $key`*: Returns `true` if `$map` contains `$key`. Takes maps from `string` to any type. -* *`dir $path`*: Returns an array of filenames in the specified `$path`. -* *`exists $path`*: Returns `true` if `$path` refers to an existing file or directory. Takes a string. -* *`eval $templateName [$data]`*: Evaluates the named template like Go's built-in `template` action, but instead of writing out the result it returns the result as a string so that it can be post-processed. The `$data` argument may be omitted, which is equivalent to passing `nil`. -* *`groupBy $containers $fieldPath`*: Groups an array of `RuntimeContainer` instances based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value, which must be a string. Returns a map from the value of the field path expression to an array of containers having that value. Containers that do not have a value for the field path in question are omitted. -* *`groupByKeys $containers $fieldPath`*: Returns the same as `groupBy` but only returns the keys of the map. -* *`groupByMulti $containers $fieldPath $sep`*: Like `groupBy`, but the string value specified by `$fieldPath` is first split by `$sep` into a list of strings. A container whose `$fieldPath` value contains a list of strings will show up in the map output under each of those strings. -* *`groupByLabel $containers $label`*: Returns the same as `groupBy` but grouping by the given label's value. -* *`include $file`*: Returns content of `$file`, and empty string if file reading error. -* *`intersect $slice1 $slice2`*: Returns the strings that exist in both string slices. -* *`json $value`*: Returns the JSON representation of `$value` as a `string`. -* *`keys $map`*: Returns the keys from `$map`. If `$map` is `nil`, a `nil` is returned. If `$map` is not a `map`, an error will be thrown. -* *`parseBool $string`*: parseBool returns the boolean value represented by the string. It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. Any other value returns an error. Alias for [`strconv.ParseBool`](http://golang.org/pkg/strconv/#ParseBool) -* *`replace $string $old $new $count`*: Replaces up to `$count` occurences of `$old` with `$new` in `$string`. Alias for [`strings.Replace`](http://golang.org/pkg/strings/#Replace) -* *`sha1 $string`*: Returns the hexadecimal representation of the SHA1 hash of `$string`. -* *`split $string $sep`*: Splits `$string` into a slice of substrings delimited by `$sep`. Alias for [`strings.Split`](http://golang.org/pkg/strings/#Split) -* *`splitN $string $sep $count`*: Splits `$string` into a slice of substrings delimited by `$sep`, with number of substrings returned determined by `$count`. Alias for [`strings.SplitN`](https://golang.org/pkg/strings/#SplitN) -* *`sortStringsAsc $strings`: Returns a slice of strings `$strings` sorted in ascending order. -* *`sortStringsDesc $strings`: Returns a slice of strings `$strings` sorted in descending (reverse) order. -* *`sortObjectsByKeysAsc $objects $fieldPath`: Returns the array `$objects`, sorted in ascending order based on the values of a field path expression `$fieldPath`. -* *`sortObjectsByKeysDesc $objects $fieldPath`: Returns the array `$objects`, sorted in descending (reverse) order based on the values of a field path expression `$fieldPath`. -* *`trimPrefix $prefix $string`*: If `$prefix` is a prefix of `$string`, return `$string` with `$prefix` trimmed from the beginning. Otherwise, return `$string` unchanged. -* *`trimSuffix $suffix $string`*: If `$suffix` is a suffix of `$string`, return `$string` with `$suffix` trimmed from the end. Otherwise, return `$string` unchanged. -* *`toLower $string`*: Replace capital letters in `$string` to lowercase. -* *`toUpper $string`*: Replace lowercase letters in `$string` to uppercase. -* *`when $condition $trueValue $falseValue`*: Returns the `$trueValue` when the `$condition` is `true` and the `$falseValue` otherwise -* *`where $items $fieldPath $value`*: Filters an array or slice based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items having that value. -* *`whereNot $items $fieldPath $value`*: Filters an array or slice based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items **not** having that value. -* *`whereExist $items $fieldPath`*: Like `where`, but returns only items where `$fieldPath` exists (is not nil). -* *`whereNotExist $items $fieldPath`*: Like `where`, but returns only items where `$fieldPath` does not exist (is nil). -* *`whereAny $items $fieldPath $sep $values`*: Like `where`, but the string value specified by `$fieldPath` is first split by `$sep` into a list of strings. The comparison value is a string slice with possible matches. Returns items which OR intersect these values. -* *`whereAll $items $fieldPath $sep $values`*: Like `whereAny`, except all `$values` must exist in the `$fieldPath`. -* *`whereLabelExists $containers $label`*: Filters a slice of containers based on the existence of the label `$label`. -* *`whereLabelDoesNotExist $containers $label`*: Filters a slice of containers based on the non-existence of the label `$label`. -* *`whereLabelValueMatches $containers $label $pattern`*: Filters a slice of containers based on the existence of the label `$label` with values matching the regular expression `$pattern`. - -=== +- [Functions from Go](https://pkg.go.dev/text/template#hdr-Functions) +- [Functions from Sprig v3](https://masterminds.github.io/sprig/), except for those that have the same name as one of the following functions. +- _`closest $array $value`_: Returns the longest matching substring in `$array` that matches `$value` +- _`coalesce ...`_: Returns the first non-nil argument. +- _`contains $map $key`_: Returns `true` if `$map` contains `$key`. Takes maps from `string` to any type. +- _`dir $path`_: Returns an array of filenames in the specified `$path`. +- _`exists $path`_: Returns `true` if `$path` refers to an existing file or directory. Takes a string. +- _`eval $templateName [$data]`_: Evaluates the named template like Go's built-in `template` action, but instead of writing out the result it returns the result as a string so that it can be post-processed. The `$data` argument may be omitted, which is equivalent to passing `nil`. +- _`groupBy $containers $fieldPath`_: Groups an array of `RuntimeContainer` instances based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value, which must be a string. Returns a map from the value of the field path expression to an array of containers having that value. Containers that do not have a value for the field path in question are omitted. +- _`groupByKeys $containers $fieldPath`_: Returns the same as `groupBy` but only returns the keys of the map. +- _`groupByMulti $containers $fieldPath $sep`_: Like `groupBy`, but the string value specified by `$fieldPath` is first split by `$sep` into a list of strings. A container whose `$fieldPath` value contains a list of strings will show up in the map output under each of those strings. +- _`groupByLabel $containers $label`_: Returns the same as `groupBy` but grouping by the given label's value. +- _`include $file`_: Returns content of `$file`, and empty string if file reading error. +- _`intersect $slice1 $slice2`_: Returns the strings that exist in both string slices. +- _`json $value`_: Returns the JSON representation of `$value` as a `string`. +- _`keys $map`_: Returns the keys from `$map`. If `$map` is `nil`, a `nil` is returned. If `$map` is not a `map`, an error will be thrown. +- _`parseBool $string`_: parseBool returns the boolean value represented by the string. It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. Any other value returns an error. Alias for [`strconv.ParseBool`](http://golang.org/pkg/strconv/#ParseBool) +- _`replace $string $old $new $count`_: Replaces up to `$count` occurences of `$old` with `$new` in `$string`. Alias for [`strings.Replace`](http://golang.org/pkg/strings/#Replace) +- _`sha1 $string`_: Returns the hexadecimal representation of the SHA1 hash of `$string`. +- _`split $string $sep`_: Splits `$string` into a slice of substrings delimited by `$sep`. Alias for [`strings.Split`](http://golang.org/pkg/strings/#Split) +- _`splitN $string $sep $count`_: Splits `$string` into a slice of substrings delimited by `$sep`, with number of substrings returned determined by `$count`. Alias for [`strings.SplitN`](https://golang.org/pkg/strings/#SplitN) +- _`sortStringsAsc $strings`_: Returns a slice of strings `$strings` sorted in ascending order. +- _`sortStringsDesc $strings`_: Returns a slice of strings `$strings` sorted in descending (reverse) order. +- _`sortObjectsByKeysAsc $objects $fieldPath`_: Returns the array `$objects`, sorted in ascending order based on the values of a field path expression `$fieldPath`. +- _`sortObjectsByKeysDesc $objects $fieldPath`_: Returns the array `$objects`, sorted in descending (reverse) order based on the values of a field path expression `$fieldPath`. +- _`trimPrefix $prefix $string`_: If `$prefix` is a prefix of `$string`, return `$string` with `$prefix` trimmed from the beginning. Otherwise, return `$string` unchanged. +- _`trimSuffix $suffix $string`_: If `$suffix` is a suffix of `$string`, return `$string` with `$suffix` trimmed from the end. Otherwise, return `$string` unchanged. +- _`toLower $string`_: Replace capital letters in `$string` to lowercase. +- _`toUpper $string`_: Replace lowercase letters in `$string` to uppercase. +- _`when $condition $trueValue $falseValue`_: Returns the `$trueValue` when the `$condition` is `true` and the `$falseValue` otherwise +- _`where $items $fieldPath $value`_: Filters an array or slice based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items having that value. +- _`whereNot $items $fieldPath $value`_: Filters an array or slice based on the values of a field path expression `$fieldPath`. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items **not** having that value. +- _`whereExist $items $fieldPath`_: Like `where`, but returns only items where `$fieldPath` exists (is not nil). +- _`whereNotExist $items $fieldPath`_: Like `where`, but returns only items where `$fieldPath` does not exist (is nil). +- _`whereAny $items $fieldPath $sep $values`_: Like `where`, but the string value specified by `$fieldPath` is first split by `$sep` into a list of strings. The comparison value is a string slice with possible matches. Returns items which OR intersect these values. +- _`whereAll $items $fieldPath $sep $values`_: Like `whereAny`, except all `$values` must exist in the `$fieldPath`. +- _`whereLabelExists $containers $label`_: Filters a slice of containers based on the existence of the label `$label`. +- _`whereLabelDoesNotExist $containers $label`_: Filters a slice of containers based on the non-existence of the label `$label`. +- _`whereLabelValueMatches $containers $label $pattern`_: Filters a slice of containers based on the existence of the label `$label` with values matching the regular expression `$pattern`. + +--- ### Examples -* [Automated Nginx Reverse Proxy for Docker](http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/) -* [Docker Log Management With Fluentd](http://jasonwilder.com/blog/2014/03/17/docker-log-management-using-fluentd/) -* [Docker Service Discovery Using Etcd and Haproxy](http://jasonwilder.com/blog/2014/07/15/docker-service-discovery/) +- [Automated Nginx Reverse Proxy for Docker](http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/) +- [Docker Log Management With Fluentd](http://jasonwilder.com/blog/2014/03/17/docker-log-management-using-fluentd/) +- [Docker Service Discovery Using Etcd and Haproxy](http://jasonwilder.com/blog/2014/07/15/docker-service-discovery/) #### NGINX Reverse Proxy Config @@ -449,7 +452,6 @@ docker-gen -watch -notify "restart fluentd" templates/fluentd.tmpl /etc/fluent/f #### Service Discovery in Etcd - This template is an example of generating a script that is then executed. This template generates a python script that is then executed which register containers in Etcd using its HTTP API. @@ -457,14 +459,13 @@ a python script that is then executed which register containers in Etcd using it docker-gen -notify "/bin/bash /tmp/etcd.sh" -interval 10 templates/etcd.tmpl /tmp/etcd.sh ``` - ### Development This project uses [Go Modules](https://golang.org/ref/mod) for managing 3rd party dependencies. -This means that at least `go 1.11` is required. +This means that at least `go 1.11` is required. -For `go 1.11` and `go 1.12` it is additionally required to manually enable support by setting `GO111MODULE=on`. -For later versions, this is not required. +For `go 1.11` and `go 1.12` it is additionally required to manually enable support by setting `GO111MODULE=on`. +For later versions, this is not required. ```console git clone @@ -475,9 +476,8 @@ make ### TODO - * Add event status for handling start and stop events differently +- Add event status for handling start and stop events differently ### License MIT - From 3228d104da2b4d474b1171a7e9ceab786abd7c64 Mon Sep 17 00:00:00 2001 From: Nicolas Duchon Date: Sun, 25 Feb 2024 11:06:02 +0100 Subject: [PATCH 4/4] docs: yaml to/from docs --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 80b2d5b4..b76c7ce0 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,8 @@ For example, this is a JSON version of an emitted RuntimeContainer struct: - _`include $file`_: Returns content of `$file`, and empty string if file reading error. - _`intersect $slice1 $slice2`_: Returns the strings that exist in both string slices. - _`json $value`_: Returns the JSON representation of `$value` as a `string`. +- _`fromYaml $string` / `mustFromYaml $string`_: Similar to [Sprig's `fromJson` / `mustFromJson`](https://github.com/Masterminds/sprig/blob/master/docs/defaults.md#fromjson-mustfromjson), but for YAML. +- _`toYaml $dict` / `mustToYaml $dict`_: Similar to [Sprig's `toJson` / `mustToJson`](https://github.com/Masterminds/sprig/blob/master/docs/defaults.md#tojson-musttojson), but for YAML. - _`keys $map`_: Returns the keys from `$map`. If `$map` is `nil`, a `nil` is returned. If `$map` is not a `map`, an error will be thrown. - _`parseBool $string`_: parseBool returns the boolean value represented by the string. It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. Any other value returns an error. Alias for [`strconv.ParseBool`](http://golang.org/pkg/strconv/#ParseBool) - _`replace $string $old $new $count`_: Replaces up to `$count` occurences of `$old` with `$new` in `$string`. Alias for [`strings.Replace`](http://golang.org/pkg/strings/#Replace)