Top Related Projects
Automated nginx proxy for Docker containers using docker-gen
The Cloud Native Application Proxy
Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Docker container for managing Nginx proxy hosts with a simple, powerful interface
Automated ACME SSL certificate generation for nginx-proxy
Quick Overview
Docker-gen is a file generator tool that uses templates to generate files based on Docker container metadata. It can be used to dynamically configure Nginx reverse proxy settings, HAProxy configurations, or any other file-based configurations that need to adapt to changes in Docker container environments.
Pros
- Automatically generates configuration files based on Docker container metadata
- Supports a wide range of template engines (Go templates, Sed, or custom commands)
- Can watch Docker events and regenerate files on container start/stop
- Integrates well with other Docker-based tools and workflows
Cons
- Requires understanding of Go templates for advanced usage
- May add complexity to simple Docker setups
- Limited documentation for some advanced features
- Potential performance impact when managing large numbers of containers
Code Examples
- Basic Nginx proxy configuration template:
{{ range $host, $containers := groupBy $ "Env.VIRTUAL_HOST" }}
upstream {{ $host }} {
{{ range $container := $containers }}
server {{ $container.IP }}:{{ $container.Env.VIRTUAL_PORT }};
{{ end }}
}
server {
server_name {{ $host }};
location / {
proxy_pass http://{{ $host }};
}
}
{{ end }}
This template generates Nginx server blocks for each unique VIRTUAL_HOST
environment variable across containers.
- Custom header addition based on container labels:
{{ range $host, $containers := groupBy $ "Env.VIRTUAL_HOST" }}
server {
server_name {{ $host }};
location / {
proxy_pass http://backend;
{{ range $container := $containers }}
{{ if $container.Labels.custom_header }}
add_header X-Custom-Header "{{ $container.Labels.custom_header }}";
{{ end }}
{{ end }}
}
}
{{ end }}
This example adds custom headers to the Nginx configuration based on container labels.
- Generate environment variables file:
{{ range $container := $ }}
{{ range $key, $value := $container.Env }}
{{ $key }}={{ $value }}
{{ end }}
{{ end }}
This template generates an environment variables file containing all environment variables from all containers.
Getting Started
-
Install docker-gen:
go get github.com/nginx-proxy/docker-gen
-
Create a template file (e.g.,
nginx.tmpl
) with your desired configuration. -
Run docker-gen:
docker-gen -notify-sighup nginx -watch -only-exposed /path/to/nginx.tmpl /etc/nginx/nginx.conf
This command will generate the Nginx configuration file, watch for Docker events, and reload Nginx when changes occur.
Competitor Comparisons
Automated nginx proxy for Docker containers using docker-gen
Pros of nginx-proxy
- Provides an all-in-one solution for automatic nginx proxy configuration
- Easier setup and configuration for beginners
- Includes built-in Let's Encrypt support for automatic SSL certificate management
Cons of nginx-proxy
- Less flexible than docker-gen for custom configurations
- May have higher resource usage due to additional components
- Limited to nginx-specific use cases
Code Comparison
nginx-proxy (docker-compose.yml):
version: '3'
services:
nginx-proxy:
image: nginxproxy/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
docker-gen (docker-compose.yml):
version: '3'
services:
nginx:
image: nginx
docker-gen:
image: nginxproxy/docker-gen
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
The nginx-proxy example shows a simpler setup with a single service, while the docker-gen example demonstrates separate nginx and docker-gen services, offering more flexibility but requiring additional configuration.
The Cloud Native Application Proxy
Pros of Traefik
- Built-in automatic HTTPS with Let's Encrypt integration
- Native Docker integration with real-time configuration updates
- Supports multiple backends and load balancing out of the box
Cons of Traefik
- Steeper learning curve due to more complex configuration options
- Can be resource-intensive for small-scale deployments
- Less mature and battle-tested compared to Nginx
Code Comparison
Traefik configuration (YAML):
http:
routers:
my-router:
rule: "Host(`example.com`)"
service: my-service
services:
my-service:
loadBalancer:
servers:
- url: "http://localhost:8080"
Docker-gen configuration (Nginx template):
server {
server_name example.com;
location / {
proxy_pass http://localhost:8080;
}
}
Both Traefik and Docker-gen with Nginx-proxy serve as reverse proxy solutions for containerized environments. Traefik offers more built-in features and native Docker integration, while Docker-gen with Nginx-proxy provides a simpler setup based on the widely-used Nginx server. The choice between them depends on specific project requirements, scale, and familiarity with the respective technologies.
Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Pros of Caddy
- Automatic HTTPS with Let's Encrypt integration
- Simpler configuration syntax
- Built-in HTTP/3 support
Cons of Caddy
- Less mature ecosystem compared to Nginx
- Potentially higher resource usage for some configurations
Code Comparison
Caddy configuration:
example.com {
reverse_proxy localhost:8080
}
docker-gen configuration:
server {
server_name example.com;
location / {
proxy_pass http://localhost:8080;
}
}
Caddy offers a more concise configuration syntax, while docker-gen (used with Nginx) provides more granular control over server settings.
Both projects serve as reverse proxy solutions, but Caddy focuses on simplicity and automatic HTTPS, while docker-gen with Nginx offers more flexibility and a larger ecosystem of modules and extensions.
Caddy is a standalone web server with built-in proxy capabilities, whereas docker-gen is a template rendering tool often used in conjunction with Nginx to generate dynamic configurations in containerized environments.
Docker container for managing Nginx proxy hosts with a simple, powerful interface
Pros of nginx-proxy-manager
- User-friendly web interface for managing proxy hosts and SSL certificates
- Built-in Let's Encrypt integration for easy SSL certificate management
- Access lists and basic authentication features for enhanced security
Cons of nginx-proxy-manager
- Requires more system resources due to additional components (e.g., database)
- Less flexible for advanced customizations compared to docker-gen
- May have a steeper learning curve for users familiar with traditional Nginx configuration
Code Comparison
nginx-proxy-manager (Docker Compose example):
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
docker-gen (Docker Compose example):
version: '3'
services:
nginx-proxy:
image: nginxproxy/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs
Both projects aim to simplify Nginx reverse proxy management in Docker environments, but they take different approaches. nginx-proxy-manager offers a more user-friendly interface and integrated features, while docker-gen provides a lightweight and flexible solution for advanced users comfortable with manual configuration.
Automated ACME SSL certificate generation for nginx-proxy
Pros of acme-companion
- Automated SSL certificate generation and renewal using Let's Encrypt
- Seamless integration with nginx-proxy for HTTPS support
- Supports wildcard certificates for subdomains
Cons of acme-companion
- Requires additional configuration and setup compared to docker-gen
- May introduce complexity for simple setups that don't require SSL
- Potential for rate limiting issues with Let's Encrypt API
Code Comparison
docker-gen:
docker run -d \
--name nginx-proxy \
-p 80:80 \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
jwilder/nginx-proxy
acme-companion:
docker run -d \
--name nginx-proxy \
-p 80:80 -p 443:443 \
-v /path/to/certs:/etc/nginx/certs:ro \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
jwilder/nginx-proxy
docker run -d \
--name nginx-proxy-acme \
--volumes-from nginx-proxy \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /path/to/acme:/etc/acme.sh \
nginxproxy/acme-companion
The code comparison shows that acme-companion requires an additional container and more volume mounts for SSL certificate management, while docker-gen has a simpler setup for basic reverse proxy functionality without SSL.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
docker-gen
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, logstash or other centralized logging tools that tail the containers JSON log file or files within the container.
- Log Rotation - logrotate files to rotate container JSON log files
- Reverse Proxy Configs - nginx, haproxy, etc. reverse proxy configs to route requests from the host to containers
- Service Discovery - Scripts (python, bash, etc..) to register containers within etcd, 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
Host Install
Download the version you need, untar, and install to your PATH.
wget https://github.com/nginx-proxy/docker-gen/releases/download/0.12.0/docker-gen-linux-amd64-0.12.0.tar.gz
tar xvzf docker-gen-linux-amd64-0.12.0.tar.gz
./docker-gen
Bundled Container Install
Docker-gen can be bundled inside of a container along-side applications.
nginx-proxy/nginx-proxy trusted build is an example of running docker-gen within a container along-side nginx. jwilder/docker-register is an example of running docker-gen within a container to do service registration with etcd.
Separate Container Install
It can also be run as two separate containers using the nginx-proxy/docker-gen image, together with virtually any other image.
This is how you could run the official nginx image and
have docker-gen generate a reverse proxy config in the same way that nginx-proxy
works. You may want to do
this to prevent having the docker socket bound to a publicly exposed container service.
Start nginx with a shared volume:
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:
mkdir -p /tmp/templates && cd /tmp/templates
curl -o nginx.tmpl https://raw.githubusercontent.com/nginx-proxy/docker-gen/main/templates/nginx.tmpl
docker run -d --name nginx-gen --volumes-from nginx \
-v /var/run/docker.sock:/tmp/docker.sock:rw \
-v /tmp/templates:/etc/docker-gen/templates \
-t nginxproxy/docker-gen -notify-sighup nginx -watch -only-exposed /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
Start a container, taking note of any Environment variables a container expects. See the top of a template for details.
docker run --env VIRTUAL_HOST='example.com' --env VIRTUAL_PORT=80 ...
Usage
$ docker-gen
Usage: docker-gen [options] template [dest]
Generate files from docker container meta-data
Options:
-config value
config files with template directives. Config files will be merged if this option is specified multiple times. (default [])
-endpoint string
docker api endpoint (tcp|unix://..). Default unix:///var/run/docker.sock
-interval int
notify command interval (secs)
-keep-blank-lines
keep blank lines in the output file
-notify restart xyz
run command after template is regenerated (e.g restart xyz)
-notify-output
log the output(stdout/stderr) of notify command
-notify-sighup container-ID
send HUP signal to container.
Equivalent to 'docker kill -s HUP container-ID', or `-notify-container container-ID -notify-signal 1`.
You can pass this option multiple times to send HUP to multiple containers.
-notify-container container-ID
send -notify-signal signal (defaults to 1 / HUP) to container.
You can pass this option multiple times to notify multiple containers.
-notify-filter key=value
container filter for notification (e.g -notify-filter name=foo).
You can pass this option multiple times to combine filters with AND.
https://docs.docker.com/engine/reference/commandline/ps/#filter
-notify-signal signal
signal to send to the -notify-container and -notify-filter. -1 to call docker restart. Defaults to 1 aka. HUP.
All available signals available on the dockerclient
https://github.com/fsouza/go-dockerclient/blob/main/signal.go
-only-exposed
only include containers with exposed ports
-only-published
only include containers with published ports (implies -only-exposed)
-include-stopped
include stopped containers
-tlscacert string
path to TLS CA certificate file (default "~/.docker/machine/machines/default/ca.pem")
-tlscert string
path to TLS client certificate file (default "~/.docker/machine/machines/default/cert.pem")
-tlskey string
path to TLS client key file (default "~/.docker/machine/machines/default/key.pem")
-tlsverify
verify docker daemon's TLS certicate (default true)
-version
show version
-watch
watch for container changes
-wait
minimum (and/or maximum) duration to wait after each container change before triggering
Arguments:
template - path to a template to generate
dest - path to write the template. If not specfied, STDOUT is used
Environment Variables:
DOCKER_HOST - default value for -endpoint
DOCKER_CERT_PATH - directory path containing key.pem, cert.pm and ca.pem
DOCKER_TLS_VERIFY - enable client TLS verification]
If no <dest>
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.
An example configuration file, docker-gen.cfg can be found in the examples folder.
Configuration File Syntax
[[config]]
# Starts a configuration section
dest = "path/to/a/file"
# path to write the template. If not specfied, STDOUT is used
notifycmd = "/etc/init.d/foo reload"
# run command after template is regenerated (e.g restart xyz)
onlyexposed = true
# only include containers with exposed ports
template = "/path/to/a/template/file.tmpl"
# path to a template to generate
watch = true
# watch for container changes
wait = "500ms:2s"
# debounce changes with a min:max duration. Only applicable if watch = true
[config.NotifyContainers]
# Starts a notify container section
containername = 1
# container name followed by the signal to send
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.
[[config]]
template = "/etc/nginx/nginx.conf.tmpl"
dest = "/etc/nginx/sites-available/default"
onlyexposed = true
notifycmd = "/etc/init.d/nginx reload"
[[config]]
template = "/etc/logrotate.conf.tmpl"
dest = "/etc/logrotate.d/docker"
watch = true
[[config]]
template = "/etc/docker-gen/templates/nginx.tmpl"
dest = "/etc/nginx/conf.d/default.conf"
watch = true
wait = "500ms:2s"
[config.NotifyContainers]
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
The templates used by docker-gen are written using the Go text/template language. In addition to the built-in functions supplied by Go, docker-gen uses sprig and some additional functions to make it simpler (or possible) to generate your desired output. Some templates rely on environment variables within the container to make decisions on what to generate from the template.
Several templates may be parsed at once by using a semicolon (;
) to delimit the template
value. This can be used as a proxy for Golang's nested template functionality. In all cases, the main rendered template should go first.
[[config]]
template = "/etc/docker-gen/templates/nginx.tmpl;/etc/docker-gen/templates/header.tmpl"
dest = "/etc/nginx/conf.d/default.conf"
watch = true
wait = "500ms:2s"
Emit Structure
Within the templates, the object emitted by docker-gen will be a structure consisting of following Go structs:
type RuntimeContainer struct {
ID string
Created time.Time
Addresses []Address
Networks []Network
Gateway string
Name string
Hostname string
Image DockerImage
Env map[string]string
Volumes map[string]Volume
Node SwarmNode
Labels map[string]string
IP string
IP6LinkLocal string
IP6Global string
Mounts []Mount
State State
}
type Address struct {
IP string
IP6LinkLocal string
IP6Global string
Port string
HostPort string
Proto string
HostIP string
}
type Network struct {
IP string
Name string
Gateway string
EndpointID string
IPv6Gateway string
GlobalIPv6Address string
MacAddress string
GlobalIPv6PrefixLen int
IPPrefixLen int
Internal bool
}
type DockerImage struct {
Registry string
Repository string
Tag string
}
type Mount struct {
Name string
Source string
Destination string
Driver string
Mode string
RW bool
}
type Volume struct {
Path string
HostPath string
ReadWrite bool
}
type SwarmNode struct {
ID string
Name string
Address Address
}
type State struct {
Running bool
Health Health
}
type Health struct {
Status string
}
// Accessible from the root in templates as .Docker
type Docker struct {
Name string
NumContainers int
NumImages int
Version string
ApiVersion string
GoVersion string
OperatingSystem string
Architecture string
CurrentContainerID string
}
// Host environment variables accessible from root in templates as .Env
For example, this is a JSON version of an emitted RuntimeContainer struct:
{
"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
- Functions from Sprig v3, 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.comment $delimiter $string
: Returns$string
with each line prefixed by$delimiter
(helpful for debugging combined with SprigtoPrettyJson
:{{ toPrettyJson $ | comment "#" }}
).contains $map $key
: Returnstrue
if$map
contains$key
. Takes maps fromstring
to any type.dir $path
: Returns an array of filenames in the specified$path
.exists $path
: Returnstrue
if$path
refers to an existing file or directory. Takes a string.eval $templateName [$data]
: Evaluates the named template like Go's built-intemplate
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 passingnil
.groupBy $containers $fieldPath
: Groups an array ofRuntimeContainer
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.groupByWithDefault $containers $fieldPath $defaultValue
: Returns the same asgroupBy
, but containers that do not have a value for the field path are instead included in the map under the$defaultValue
key.groupByKeys $containers $fieldPath
: Returns the same asgroupBy
but only returns the keys of the map.groupByMulti $containers $fieldPath $sep
: LikegroupBy
, 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 asgroupBy
but grouping by the given label's value. Containers that do not have the$label
set are omitted.groupByLabelWithDefault $containers $label $defaultValue
: Returns the same asgroupBy
but grouping by the given label's value. Containers that do not have the$label
set are included in the map under the$defaultValue
key.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.fromYaml $string
/mustFromYaml $string
: Similar to Sprig'sfromJson
/mustFromJson
, but for YAML.toYaml $dict
/mustToYaml $dict
: Similar to Sprig'stoJson
/mustToJson
, but for YAML.keys $map
: Returns the keys from$map
. If$map
isnil
, anil
is returned. If$map
is not amap
, an error will be thrown.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
.when $condition $trueValue $falseValue
: Returns the$trueValue
when the$condition
istrue
and the$falseValue
otherwisewhere $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
: Likewhere
, but returns only items where$fieldPath
exists (is not nil).whereNotExist $items $fieldPath
: Likewhere
, but returns only items where$fieldPath
does not exist (is nil).whereAny $items $fieldPath $sep $values
: Likewhere
, 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
: LikewhereAny
, 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
.
Sprig functions that have the same name as docker-gen function (but different behaviour) are made available with the sprig
prefix:
sprigCoalesce ...
: Alias for Sprig'scoalesce
.sprigContains $string $string
: Alias for Sprig'scontains
.sprigDir $path
: Alias for Sprig'sdir
.sprigReplace $old $new $string
: Alias for Sprig'sreplace
.sprigSplit $sep $string
: Alias for Sprig'ssplit
.sprigSplitn $sep $count $string"
: Alias for Sprig'ssplitn
.
Some functions are aliases for Go's strings
package functions:
parseBool $string
: Alias forstrconv.ParseBool
. Returns the boolean value represented by$string
. It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. Any other value returns an error.replace $string $old $new $count
: Alias forstrings.Replace
. Replaces up to$count
occurences of$old
with$new
in$string
.split $string $sep
: Alias forstrings.Split
. Splits$string
into a slice of substrings delimited by$sep
.splitN $string $sep $count
: Alias forstrings.SplitN
. Splits$string
into a slice of substrings delimited by$sep
, with number of substrings returned determined by$count
.toLower $string
: Alias forstrings.ToLower
. Replace capital letters in$string
to lowercase.toUpper $string
: Alias forstrings.ToUpper
. Replace lowercase letters in$string
to uppercase.
Those have been aliased to Sprig functions with the same behaviour as the original docker-gen function:
json $value
: Alias for Sprig'smustToJson
parseJson $string
: Alias for Sprig'smustFromJson
.sha1 $string
: Alias for Sprig'ssha1sum
.
Examples
- Automated Nginx Reverse Proxy for Docker
- Docker Log Management With Fluentd
- Docker Service Discovery Using Etcd and Haproxy
NGINX Reverse Proxy Config
nginxproxy/nginx-proxy trusted build.
Start nginx-proxy:
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t nginxproxy/nginx-proxy
Then start containers with a VIRTUAL_HOST (and the VIRTUAL_PORT if more than one port is exposed) env variable:
docker run -e VIRTUAL_HOST=foo.bar.com -e VIRTUAL_PORT=80 -t ...
If you wanted to run docker-gen directly on the host, you could do it with:
docker-gen -only-published -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
Fluentd Log Management
This template generate a fluentd.conf file used by fluentd. It would then ship log files off the host.
docker-gen -watch -notify "restart fluentd" templates/fluentd.tmpl /etc/fluent/fluent.conf
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.
docker-gen -notify "/bin/bash /tmp/etcd.sh" -interval 10 templates/etcd.tmpl /tmp/etcd.sh
Development
This project uses Go Modules for managing 3rd party dependencies.
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.
git clone <your fork>
cd <your fork>
make get-deps
make
License
MIT
Top Related Projects
Automated nginx proxy for Docker containers using docker-gen
The Cloud Native Application Proxy
Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Docker container for managing Nginx proxy hosts with a simple, powerful interface
Automated ACME SSL certificate generation for nginx-proxy
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot