Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions commands/docker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package cmd

import (
"bufio"
"errors"
"fmt"
"log"
"os"
"os/exec"
"strings"

"github.com/MyLittleParis/dvopsctl/utils"
)

const dockerfile = "Dockerfile"
const defaultRegistry = "ghcr.io/mylittleparis"
const defaultGithub = "https://github.com/MyLittleParis"
const defaultRepositoryName = "devops-docker-php"

var defaultRegistryRepo = fmt.Sprintf("%s/%s", defaultRegistry, defaultRepositoryName)
var defaultRepository = fmt.Sprintf("%s/%s", defaultGithub, defaultRepositoryName)
var defaultPath = []string {"./", ".docker/"}

func BuildParentImage(path string) (int, error) {
errCode := 0
var err error

dockerImage, tag := searchInDockerfile(path)

if dockerImage == "" {
log.Printf("No docker image found.")
return 1, errors.New("No Docker image found.")
}

err = os.Chdir("../" + defaultRepositoryName)

if err != nil {
err = os.Chdir("../")
utils.GitClone(defaultRepository)
err = os.Chdir(defaultRepositoryName)
} else {
utils.GitPull()
}
utils.GitCheckout(dockerImage)
Build(fmt.Sprintf("%s/%s:%s",defaultRegistryRepo, dockerImage, tag))

return errCode, err
}

func searchInDockerfile(path string) (dockerImage, tag string) {
paths := defaultPath
if path != "" {
paths = []string{path}
}

for _, path := range paths {
fmt.Println("Search in " + path + dockerfile)
if content, err := os.Open(path + dockerfile); err == nil {
scanner := bufio.NewScanner(content)
for scanner.Scan() {
dockerImage, tag = extractImageName(scanner.Text())
if dockerImage != "" {
fmt.Printf("Image found %s\n", dockerImage)
return dockerImage, tag
}
}
}
}

return dockerImage, tag
}

/*
Extract image name if is a ghcr.io/mylittleparis image
From:
FROM ghcr.io/mylittleparis/devops-docker-php/php7.4-fpm-alpine:latest AS prod
To:
php7.4-fpm-alpine:latest
*/
func extractImageName(line string) (dockerImage, tag string) {
if dockerImage, found := strings.CutPrefix(line, "FROM " + defaultRegistry + "/" + defaultRepositoryName + "/"); found {
if found {fmt.Printf("Parent Image found %s\n", dockerImage)}
if removeAs, _, found := strings.Cut(dockerImage, " AS "); found {
if found {fmt.Printf("Image found %s\n", removeAs)}
dockerImage, tag, _ = strings.Cut(removeAs, ":")
return dockerImage, tag
}
}
return dockerImage, tag
}

func Build(tag string) {
dockerBuild := exec.Command("docker", "build", "-t", tag, ".")
fmt.Printf("Docker build %s", tag)
pipe, _ := dockerBuild.StdoutPipe()

err := dockerBuild.Start()

if err != nil {
log.Fatal(err)
}

reader := bufio.NewReader(pipe)
line, err := reader.ReadString('\n')
for err == nil {
fmt.Println(line)
line, err = reader.ReadString('\n')
}

err = dockerBuild.Wait()

if err != nil {
log.Printf("Command finished with error: %v", err)
}
}
28 changes: 23 additions & 5 deletions commands/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,22 @@ func Run(args []string) (int, error) {
fmt.Println("")
}

dockerCmd := flag.NewFlagSet("docker", flag.ExitOnError)
// subcommands
dockerBuild := dockerCmd.Bool("build", false, "Build parent docker image in local")
// args
dockerPath := dockerCmd.String("path", "", "Path to docker file")

dockerCmd.Usage = func() {
fmt.Println("docker [options]")
dockerCmd.PrintDefaults()
fmt.Println("")
}

// Commands list to use it in usage function
commands := []*flag.FlagSet{
serverCmd,
dockerCmd,
serverCmd,
}

var usage func()
Expand All @@ -49,10 +62,15 @@ func Run(args []string) (int, error) {
if *serverOpen {
errCode, rootError = ServerOpen()
}
default:
fmt.Println("Unknown command: " + args[1])
usage()
return -1, errors.New(unknownCmd)
case "docker":
dockerCmd.Parse(args[2:])
if *dockerBuild {
BuildParentImage(*dockerPath)
}
default:
fmt.Println("Unknown command: " + args[1])
usage()
return -1, errors.New(unknownCmd)
}

return errCode, rootError
Expand Down