forked from jwilder/dockerize
/
dockerize.go
135 lines (109 loc) · 2.79 KB
/
dockerize.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package main
import (
"flag"
"fmt"
"log"
"os"
"strings"
"sync"
"golang.org/x/net/context"
)
type sliceVar []string
type Context struct {
}
func (c *Context) Env() map[string]string {
env := make(map[string]string)
for _, i := range os.Environ() {
sep := strings.Index(i, "=")
env[i[0:sep]] = i[sep+1:]
}
return env
}
var (
buildVersion string
version bool
wg sync.WaitGroup
templatesFlag sliceVar
stdoutTailFlag sliceVar
stderrTailFlag sliceVar
delimsFlag string
delims []string
ctx context.Context
cancel context.CancelFunc
)
func (s *sliceVar) Set(value string) error {
*s = append(*s, value)
return nil
}
func (s *sliceVar) String() string {
return strings.Join(*s, ",")
}
func usage() {
println(`Usage: dockerize [options] [command]
Utility to simplify running applications in docker containers
Options:`)
flag.PrintDefaults()
println(`
Arguments:
command - command to executed
`)
println(`Examples:
`)
println(` Generate /etc/nginx/nginx.conf using nginx.tmpl as a template, tail /var/log/nginx/access.log
and /var/log/nginx/error.log and start nginx.`)
println(`
dockerize -template nginx.tmpl:/etc/nginx/nginx.conf \
-stdout /var/log/nginx/access.log \
-stderr /var/log/nginx/error.log nginx
`)
println(`For more information, see https://github.com/jwilder/dockerize`)
}
func main() {
flag.BoolVar(&version, "version", false, "show version")
flag.Var(&templatesFlag, "template", "Template (/template:/dest). Can be passed multiple times")
flag.Var(&stdoutTailFlag, "stdout", "Tails a file to stdout. Can be passed multiple times")
flag.Var(&stderrTailFlag, "stderr", "Tails a file to stderr. Can be passed multiple times")
flag.StringVar(&delimsFlag, "delims", "", `template tag delimiters. default "{{":"}}" `)
flag.Usage = usage
flag.Parse()
if version {
fmt.Println(buildVersion)
return
}
if flag.NArg() == 0 && flag.NFlag() == 0 {
usage()
os.Exit(1)
}
if delimsFlag != "" {
delims = strings.Split(delimsFlag, ":")
if len(delims) != 2 {
log.Fatalf("bad delimiters argument: %s. expected \"left:right\"", delimsFlag)
}
}
for _, t := range templatesFlag {
template, dest := t, ""
if strings.Contains(t, ":") {
parts := strings.Split(t, ":")
if len(parts) != 2 {
log.Fatalf("bad template argument: %s. expected \"/template:/dest\"", t)
}
template, dest = parts[0], parts[1]
}
generateFile(template, dest)
}
// Setup context
ctx, cancel = context.WithCancel(context.Background())
if flag.NArg() > 0 {
wg.Add(1)
go runCmd(ctx, cancel, flag.Arg(0), flag.Args()[1:]...)
}
for _, out := range stdoutTailFlag {
wg.Add(1)
go tailFile(ctx, out, os.Stdout)
}
for _, err := range stderrTailFlag {
wg.Add(1)
go tailFile(ctx, err, os.Stderr)
}
wg.Wait()
}