Fix container duplication
This commit is contained in:
21
Dockerfile
Normal file
21
Dockerfile
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
FROM golang:alpine as builder
|
||||||
|
|
||||||
|
# Application Directory
|
||||||
|
RUN mkdir /app
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# First handle dependencies as those probably are more stable than rest of codebase
|
||||||
|
COPY ./go.mod /app/
|
||||||
|
COPY ./go.sum /app/
|
||||||
|
RUN go mod download
|
||||||
|
|
||||||
|
# Copy source and build app
|
||||||
|
COPY . /app
|
||||||
|
RUN go build .
|
||||||
|
|
||||||
|
FROM alpine
|
||||||
|
|
||||||
|
# Copy over the app from the builder image
|
||||||
|
COPY --from=builder /app/lookbuilding /lookbuilding
|
||||||
|
|
||||||
|
ENTRYPOINT ["/lookbuilding"]
|
||||||
39
docker.go
39
docker.go
@ -4,10 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"errors"
|
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/container"
|
|
||||||
"github.com/docker/docker/api/types/network"
|
"github.com/docker/docker/api/types/network"
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
)
|
)
|
||||||
@ -111,12 +109,6 @@ func (lc LabeledContainer) UpdateTo(cli *client.Client, tag Tag) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(lc.Container.Names) != 1 {
|
|
||||||
return errors.New("containers with more (or fewer) than 1 name are not supported")
|
|
||||||
}
|
|
||||||
name := lc.Container.Names[0]
|
|
||||||
tmpOldName := fmt.Sprintf("%s.lb.old", name)
|
|
||||||
|
|
||||||
fmt.Printf("Stopping container %s\n", lc.Container.ID)
|
fmt.Printf("Stopping container %s\n", lc.Container.ID)
|
||||||
// TODO: hopefully this is blocking
|
// TODO: hopefully this is blocking
|
||||||
err = cli.ContainerStop(ctx, lc.Container.ID, nil)
|
err = cli.ContainerStop(ctx, lc.Container.ID, nil)
|
||||||
@ -124,6 +116,20 @@ func (lc LabeledContainer) UpdateTo(cli *client.Client, tag Tag) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oldContainer, err := cli.ContainerInspect(ctx, lc.Container.ID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
name := oldContainer.Name
|
||||||
|
tmpOldName := fmt.Sprintf("%s.lb.old", name)
|
||||||
|
|
||||||
|
config := oldContainer.Config
|
||||||
|
config.Image = image
|
||||||
|
|
||||||
|
hostConfig := oldContainer.HostConfig
|
||||||
|
hostConfig.VolumesFrom = []string{tmpOldName}
|
||||||
|
|
||||||
fmt.Printf("Renaming container %s\n", lc.Container.ID)
|
fmt.Printf("Renaming container %s\n", lc.Container.ID)
|
||||||
err = cli.ContainerRename(ctx, lc.Container.ID, tmpOldName)
|
err = cli.ContainerRename(ctx, lc.Container.ID, tmpOldName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -131,29 +137,22 @@ func (lc LabeledContainer) UpdateTo(cli *client.Client, tag Tag) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Creating new container\n")
|
fmt.Printf("Creating new container\n")
|
||||||
body, err := cli.ContainerCreate(ctx, &container.Config{
|
new, err := cli.ContainerCreate(ctx, oldContainer.Config, hostConfig, &network.NetworkingConfig{
|
||||||
Image: image,
|
EndpointsConfig: oldContainer.NetworkSettings.Networks,
|
||||||
//Cmd: []string{"echo", "hello world"},
|
|
||||||
Labels: lc.Container.Labels,
|
|
||||||
Tty: false,
|
|
||||||
}, &container.HostConfig{
|
|
||||||
VolumesFrom: []string{tmpOldName},
|
|
||||||
}, &network.NetworkingConfig{
|
|
||||||
EndpointsConfig: lc.Container.NetworkSettings.Networks,
|
|
||||||
}, name)
|
}, name)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Starting new container id: %s\n", body.ID)
|
fmt.Printf("Starting new container id: %s\n", new.ID)
|
||||||
err = cli.ContainerStart(ctx, body.ID, types.ContainerStartOptions{})
|
err = cli.ContainerStart(ctx, new.ID, types.ContainerStartOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf("Removing old container\n")
|
fmt.Printf("Removing old container\n")
|
||||||
err = cli.ContainerRemove(ctx, tmpOldName, types.ContainerRemoveOptions{
|
err = cli.ContainerRemove(ctx, oldContainer.ID, types.ContainerRemoveOptions{
|
||||||
RemoveVolumes: false,
|
RemoveVolumes: false,
|
||||||
RemoveLinks: false,
|
RemoveLinks: false,
|
||||||
Force: false,
|
Force: false,
|
||||||
|
|||||||
26
main.go
26
main.go
@ -2,12 +2,12 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
//"github.com/sirupsen/logrus" TODO
|
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func checkForUpdates() {
|
||||||
cli, err := client.NewEnvClient()
|
cli, err := client.NewEnvClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -56,6 +56,28 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Println(" no update available")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fmt.Println("all done")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
addr := "0.0.0.0:8000"
|
||||||
|
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
go checkForUpdates()
|
||||||
|
fmt.Fprintf(w, "OK")
|
||||||
|
})
|
||||||
|
|
||||||
|
fs := http.FileServer(http.Dir("static/"))
|
||||||
|
http.Handle("/static/", http.StripPrefix("/static/", fs))
|
||||||
|
|
||||||
|
fmt.Printf("Listening on %s\n", addr)
|
||||||
|
|
||||||
|
err := http.ListenAndServe(addr, nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,7 +16,7 @@ type Tag struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func anonymousClient() (*registry.Registry, error) {
|
func anonymousClient() (*registry.Registry, error) {
|
||||||
url := "https://registry-1.docker.io/"
|
url := "https://registry-1.docker.io/"
|
||||||
username := "" // anonymous
|
username := "" // anonymous
|
||||||
password := "" // anonymous
|
password := "" // anonymous
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ func getDockerRepoTags(hub *registry.Registry, maybe_owner *string, repository s
|
|||||||
|
|
||||||
svt := parseTagAsSemVer(tag)
|
svt := parseTagAsSemVer(tag)
|
||||||
|
|
||||||
out = append(out, Tag { tag, svt, digest })
|
out = append(out, Tag{tag, svt, digest})
|
||||||
}
|
}
|
||||||
|
|
||||||
return out, nil
|
return out, nil
|
||||||
|
|||||||
@ -12,7 +12,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type SemVerTag struct {
|
type SemVerTag struct {
|
||||||
prefix string
|
prefix string
|
||||||
version semver.Version
|
version semver.Version
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ func parseTagAsSemVer(tag string) *SemVerTag {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
svt := SemVerTag {
|
svt := SemVerTag{
|
||||||
prefix,
|
prefix,
|
||||||
*version,
|
*version,
|
||||||
}
|
}
|
||||||
@ -42,4 +42,3 @@ func parseTagAsSemVer(tag string) *SemVerTag {
|
|||||||
func (SemVerTag) asTag() string {
|
func (SemVerTag) asTag() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,7 +42,7 @@ func (SemVerMajor) ShouldUpdate(currentTag string, availableTags []Tag) *Tag {
|
|||||||
semverTags := make([]Tag, 0)
|
semverTags := make([]Tag, 0)
|
||||||
|
|
||||||
for _, tag := range availableTags {
|
for _, tag := range availableTags {
|
||||||
if tag.SemVer != nil {
|
if tag.SemVer != nil && currentSemVer.version.LessThan(tag.SemVer.version) {
|
||||||
semverTags = append(semverTags, tag);
|
semverTags = append(semverTags, tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user