From 81c6de6cb3678dbae61f50583b0896cba38dc460 Mon Sep 17 00:00:00 2001 From: Faissal Elamraoui Date: Thu, 22 Dec 2016 18:10:45 +0100 Subject: [PATCH] Ability to dockerize a Beego application This introduces a new command "dockerize" which will generate a Dockerfile to allow a Beego Web Application to run inside Docker. --- bee.go | 1 + dockerize.go | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 dockerize.go diff --git a/bee.go b/bee.go index ca1e25e..21fa1d0 100644 --- a/bee.go +++ b/bee.go @@ -126,6 +126,7 @@ var availableCommands = []*Command{ //cmdRundocs, cmdMigrate, cmdFix, + cmdDockerize, } var logger = GetBeeLogger(os.Stdout) diff --git a/dockerize.go b/dockerize.go new file mode 100644 index 0000000..6043648 --- /dev/null +++ b/dockerize.go @@ -0,0 +1,112 @@ +// Copyright 2016 bee authors +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package main + +import ( + "flag" + "os" + "path" + "path/filepath" + "strings" + "text/template" +) + +var cmdDockerize = &Command{ + CustomFlags: true, + UsageLine: "dockerize", + Short: "Generates a Dockerfile for your Beego application", + Long: `Dockerize generates a Dockerfile for your Beego Web Application. + The Dockerfile will compile, get the dependencies with {{"godep"|bold}}, and set the entrypoint. + `, + PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() }, + Run: dockerizeApp, +} + +const dockerBuildTemplate = `FROM library/golang:latest + +# Get Beego Web Framework +RUN go get github.com/astaxie/beego + +# Godep for vendoring +RUN go get github.com/tools/godep + +# Recompile the standard library without CGO +RUN CGO_ENABLED=0 go install -a std + +ENV APP_DIR $GOPATH{{.Appdir}} +RUN mkdir -p $APP_DIR + +# Set the entrypoint +ENTRYPOINT $APP_DIR/{{.Entrypoint}} +ADD . $APP_DIR + +# Compile the binary and statically link +RUN cd $APP_DIR +RUN CGO_ENABLED=0 godep go build -ldflags '-d -w -s' + +EXPOSE {{.Expose}} +` + +type Dockerfile struct { + Appdir string + Entrypoint string + Expose string +} + +var ( + expose string +) + +func init() { + fs := flag.NewFlagSet("dockerize", flag.ContinueOnError) + fs.StringVar(&expose, "expose", "8080", "Port to expose in the Docker container.") + cmdDockerize.Flag = *fs +} + +func dockerizeApp(cmd *Command, args []string) int { + cmd.Flag.Parse(args) + + logger.Info("Generating Dockerfile...") + + gopath := os.Getenv("GOPATH") + dir, err := filepath.Abs(".") + MustCheck(err) + + appdir := strings.Replace(dir, gopath, "", 1) + + _, entrypoint := path.Split(appdir) + dockerfile := Dockerfile{ + Appdir: appdir, + Entrypoint: entrypoint, + Expose: expose, + } + + generateDockerfile(dockerfile) + return 0 +} + +func generateDockerfile(df Dockerfile) { + t := template.Must(template.New("dockerBuildTemplate").Parse(dockerBuildTemplate)).Funcs(BeeFuncMap()) + + f, err := os.Create("Dockerfile") + if err != nil { + logger.Fatalf("Error writing Dockerfile: %v", err.Error()) + } + defer CloseFile(f) + + t.Execute(f, df) + + logger.Success("Dockerfile generated.") +}