2016-12-22 17:10:45 +00:00
|
|
|
// 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.
|
|
|
|
|
2017-03-06 23:58:53 +00:00
|
|
|
package dockerize
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
2016-12-22 21:53:45 +00:00
|
|
|
|
2020-12-16 05:20:41 +00:00
|
|
|
"github.com/beego/bee/v2/cmd/commands"
|
|
|
|
"github.com/beego/bee/v2/cmd/commands/version"
|
|
|
|
beeLogger "github.com/beego/bee/v2/logger"
|
|
|
|
"github.com/beego/bee/v2/utils"
|
2017-03-06 23:58:53 +00:00
|
|
|
)
|
2016-12-22 17:10:45 +00:00
|
|
|
|
2016-12-22 17:29:13 +00:00
|
|
|
const dockerBuildTemplate = `FROM {{.BaseImage}}
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
# 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
|
2017-03-20 13:57:09 +00:00
|
|
|
ENTRYPOINT (cd $APP_DIR && ./{{.Entrypoint}})
|
2016-12-22 17:10:45 +00:00
|
|
|
ADD . $APP_DIR
|
|
|
|
|
|
|
|
# Compile the binary and statically link
|
2017-03-19 12:45:59 +00:00
|
|
|
RUN cd $APP_DIR && CGO_ENABLED=0 godep go build -ldflags '-d -w -s'
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
EXPOSE {{.Expose}}
|
|
|
|
`
|
|
|
|
|
2016-12-22 21:53:45 +00:00
|
|
|
// Dockerfile holds the information about the Docker container.
|
2016-12-22 17:10:45 +00:00
|
|
|
type Dockerfile struct {
|
2016-12-22 17:29:13 +00:00
|
|
|
BaseImage string
|
2016-12-22 17:10:45 +00:00
|
|
|
Appdir string
|
|
|
|
Entrypoint string
|
|
|
|
Expose string
|
|
|
|
}
|
|
|
|
|
2017-03-06 23:58:53 +00:00
|
|
|
var CmdDockerize = &commands.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.
|
|
|
|
|
|
|
|
{{"Example:"|bold}}
|
|
|
|
$ bee dockerize -expose="3000,80,25"
|
|
|
|
`,
|
|
|
|
PreRun: func(cmd *commands.Command, args []string) { version.ShowShortVersionBanner() },
|
|
|
|
Run: dockerizeApp,
|
|
|
|
}
|
|
|
|
|
2016-12-22 17:10:45 +00:00
|
|
|
var (
|
2016-12-22 17:29:13 +00:00
|
|
|
expose string
|
|
|
|
baseImage string
|
2016-12-22 17:10:45 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
fs := flag.NewFlagSet("dockerize", flag.ContinueOnError)
|
2016-12-23 10:53:02 +00:00
|
|
|
fs.StringVar(&baseImage, "image", "library/golang", "Set the base image of the Docker container.")
|
2016-12-22 21:53:45 +00:00
|
|
|
fs.StringVar(&expose, "expose", "8080", "Port(s) to expose in the Docker container.")
|
2017-03-06 23:58:53 +00:00
|
|
|
CmdDockerize.Flag = *fs
|
|
|
|
commands.AvailableCommands = append(commands.AvailableCommands, CmdDockerize)
|
2016-12-22 17:10:45 +00:00
|
|
|
}
|
|
|
|
|
2017-03-06 23:58:53 +00:00
|
|
|
func dockerizeApp(cmd *commands.Command, args []string) int {
|
2016-12-22 21:53:45 +00:00
|
|
|
if err := cmd.Flag.Parse(args); err != nil {
|
2017-03-06 23:58:53 +00:00
|
|
|
beeLogger.Log.Fatalf("Error parsing flags: %v", err.Error())
|
2016-12-22 21:53:45 +00:00
|
|
|
}
|
2016-12-22 17:10:45 +00:00
|
|
|
|
2017-03-06 23:58:53 +00:00
|
|
|
beeLogger.Log.Info("Generating Dockerfile...")
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
gopath := os.Getenv("GOPATH")
|
|
|
|
dir, err := filepath.Abs(".")
|
2017-03-06 23:58:53 +00:00
|
|
|
if err != nil {
|
|
|
|
beeLogger.Log.Error(err.Error())
|
|
|
|
}
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
appdir := strings.Replace(dir, gopath, "", 1)
|
|
|
|
|
2016-12-22 21:53:45 +00:00
|
|
|
// In case of multiple ports to expose inside the container,
|
|
|
|
// replace all the commas with whitespaces.
|
|
|
|
// See the verb EXPOSE in the Docker documentation.
|
2021-06-17 15:02:31 +00:00
|
|
|
expose = strings.Replace(expose, ",", " ", -1)
|
2016-12-22 21:53:45 +00:00
|
|
|
|
2016-12-22 17:10:45 +00:00
|
|
|
_, entrypoint := path.Split(appdir)
|
|
|
|
dockerfile := Dockerfile{
|
2016-12-22 17:29:13 +00:00
|
|
|
BaseImage: baseImage,
|
2016-12-22 17:10:45 +00:00
|
|
|
Appdir: appdir,
|
|
|
|
Entrypoint: entrypoint,
|
|
|
|
Expose: expose,
|
|
|
|
}
|
|
|
|
|
|
|
|
generateDockerfile(dockerfile)
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateDockerfile(df Dockerfile) {
|
2017-03-06 23:58:53 +00:00
|
|
|
t := template.Must(template.New("dockerBuildTemplate").Parse(dockerBuildTemplate)).Funcs(utils.BeeFuncMap())
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
f, err := os.Create("Dockerfile")
|
|
|
|
if err != nil {
|
2017-03-06 23:58:53 +00:00
|
|
|
beeLogger.Log.Fatalf("Error writing Dockerfile: %v", err.Error())
|
2016-12-22 17:10:45 +00:00
|
|
|
}
|
2017-03-06 23:58:53 +00:00
|
|
|
defer utils.CloseFile(f)
|
2016-12-22 17:10:45 +00:00
|
|
|
|
|
|
|
t.Execute(f, df)
|
|
|
|
|
2017-03-06 23:58:53 +00:00
|
|
|
beeLogger.Log.Success("Dockerfile generated.")
|
2016-12-22 17:10:45 +00:00
|
|
|
}
|