From 4c2d7b1c30a1fb1b30effad5e907777d9b36b512 Mon Sep 17 00:00:00 2001 From: Lucas Bremgartner Date: Mon, 26 Sep 2016 14:45:40 +0200 Subject: [PATCH 1/3] Allow template to be a whole directory --- dockerize.go | 58 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/dockerize.go b/dockerize.go index 55aa0b4..52c6915 100644 --- a/dockerize.go +++ b/dockerize.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io/ioutil" "log" "net" "net/http" @@ -41,17 +42,18 @@ var ( poll bool wg sync.WaitGroup - templatesFlag sliceVar - stdoutTailFlag sliceVar - stderrTailFlag sliceVar - headersFlag sliceVar - delimsFlag string - delims []string - headers []HttpHeader - urls []url.URL - waitFlag hostFlagsVar - waitTimeoutFlag time.Duration - dependencyChan chan struct{} + templatesFlag sliceVar + templateDirsFlag sliceVar + stdoutTailFlag sliceVar + stderrTailFlag sliceVar + headersFlag sliceVar + delimsFlag string + delims []string + headers []HttpHeader + urls []url.URL + waitFlag hostFlagsVar + waitTimeoutFlag time.Duration + dependencyChan chan struct{} ctx context.Context cancel context.CancelFunc @@ -166,7 +168,7 @@ func main() { flag.BoolVar(&version, "version", false, "show version") flag.BoolVar(&poll, "poll", false, "enable polling") - flag.Var(&templatesFlag, "template", "Template (/template:/dest). Can be passed multiple times") + flag.Var(&templatesFlag, "template", "Template (/template:/dest). Can be passed multiple times. Does also support directories") 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 "{{":"}}" `) @@ -230,7 +232,37 @@ func main() { } template, dest = parts[0], parts[1] } - generateFile(template, dest) + + fi, err := os.Stat(template) + if err != nil { + log.Fatalf("unable to stat %s, error: %s", template, err) + } + if fi.IsDir() { + if dest != "" { + fiDest, err := os.Stat(dest) + if err != nil { + log.Fatalf("unable to stat %s, error: %s", dest, err) + } + if !fiDest.IsDir() { + log.Fatalf("if template is a directory, dest must also be a directory (or stdout)") + } + } + + files, err := ioutil.ReadDir(template) + if err != nil { + log.Fatalf("bad directory: %s, error: %s", template, err) + } + + for _, file := range files { + if dest == "" { + generateFile(template+string(os.PathSeparator)+file.Name(), "") + } else { + generateFile(template+string(os.PathSeparator)+file.Name(), dest+string(os.PathSeparator)+file.Name()) + } + } + } else { + generateFile(template, dest) + } } waitForDependencies() From 68baa12bb27f99a33ad7370c62f502e3cd35ac45 Mon Sep 17 00:00:00 2001 From: Lucas Bremgartner Date: Tue, 27 Sep 2016 09:42:00 +0200 Subject: [PATCH 2/3] Update README for template directory --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 3d96de6..a43ec43 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,14 @@ $ dockerize -template template1.tmpl ``` +Template may also be a directory. In this case all files within this directory are processed as template and stored with the same name in the destination directory. +If the destination directory is omitted, the output is sent to `STDOUT`. The files in the source directory are processed in sorted order (as returned by `ioutil.ReadDir`). + +``` +$ dockerize -template src_dir:dest_dir + +``` + You can tail multiple files to `STDOUT` and `STDERR` by passing the options multiple times. From e9ccc3c69280f855433efd9d89c649c3d2a8f2e4 Mon Sep 17 00:00:00 2001 From: Lucas Bremgartner Date: Thu, 1 Dec 2016 11:37:42 +0100 Subject: [PATCH 3/3] Moved generateDir code to separate func Use filepath.Join Implement review feedback from jwilder --- dockerize.go | 24 +----------------------- template.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/dockerize.go b/dockerize.go index 52c6915..625f69a 100644 --- a/dockerize.go +++ b/dockerize.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "io/ioutil" "log" "net" "net/http" @@ -238,28 +237,7 @@ func main() { log.Fatalf("unable to stat %s, error: %s", template, err) } if fi.IsDir() { - if dest != "" { - fiDest, err := os.Stat(dest) - if err != nil { - log.Fatalf("unable to stat %s, error: %s", dest, err) - } - if !fiDest.IsDir() { - log.Fatalf("if template is a directory, dest must also be a directory (or stdout)") - } - } - - files, err := ioutil.ReadDir(template) - if err != nil { - log.Fatalf("bad directory: %s, error: %s", template, err) - } - - for _, file := range files { - if dest == "" { - generateFile(template+string(os.PathSeparator)+file.Name(), "") - } else { - generateFile(template+string(os.PathSeparator)+file.Name(), dest+string(os.PathSeparator)+file.Name()) - } - } + generateDir(template, dest) } else { generateFile(template, dest) } diff --git a/template.go b/template.go index 6640ded..01f3a92 100644 --- a/template.go +++ b/template.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "io/ioutil" "log" "net/url" "os" @@ -124,3 +125,30 @@ func generateFile(templatePath, destPath string) bool { return true } + +func generateDir(templateDir, destDir string) bool { + if destDir != "" { + fiDest, err := os.Stat(destDir) + if err != nil { + log.Fatalf("unable to stat %s, error: %s", destDir, err) + } + if !fiDest.IsDir() { + log.Fatalf("if template is a directory, dest must also be a directory (or stdout)") + } + } + + files, err := ioutil.ReadDir(templateDir) + if err != nil { + log.Fatalf("bad directory: %s, error: %s", templateDir, err) + } + + for _, file := range files { + if destDir == "" { + generateFile(filepath.Join(templateDir, file.Name()), "") + } else { + generateFile(filepath.Join(templateDir, file.Name()), filepath.Join(destDir, file.Name())) + } + } + + return true +}