mirror of
				https://github.com/beego/bee.git
				synced 2025-11-04 14:33:24 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							
								
								
									
										1
									
								
								bee.go
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								bee.go
									
									
									
									
									
								
							@@ -126,6 +126,7 @@ var availableCommands = []*Command{
 | 
				
			|||||||
	//cmdRundocs,
 | 
						//cmdRundocs,
 | 
				
			||||||
	cmdMigrate,
 | 
						cmdMigrate,
 | 
				
			||||||
	cmdFix,
 | 
						cmdFix,
 | 
				
			||||||
 | 
						cmdDockerize,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var logger = GetBeeLogger(os.Stdout)
 | 
					var logger = GetBeeLogger(os.Stdout)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										112
									
								
								dockerize.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								dockerize.go
									
									
									
									
									
										Normal file
									
								
							@@ -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.")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user