package main import ( "fmt" "io/ioutil" "os" "os/exec" "path/filepath" "sync" ) var ensureHTTPServerOnce sync.Once func ensureHTTPServerImage() error { var doIt bool ensureHTTPServerOnce.Do(func() { doIt = true }) if !doIt { return nil } protectedImages["httpserver:latest"] = struct{}{} tmp, err := ioutil.TempDir("", "docker-http-server-test") if err != nil { return fmt.Errorf("could not build http server: %v", err) } defer os.RemoveAll(tmp) goos := daemonPlatform if goos == "" { goos = "linux" } goarch := os.Getenv("DOCKER_ENGINE_GOARCH") if goarch == "" { goarch = "amd64" } goCmd, lookErr := exec.LookPath("go") if lookErr != nil { return fmt.Errorf("could not build http server: %v", lookErr) } cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), "github.com/docker/docker/contrib/httpserver") cmd.Env = append(os.Environ(), []string{ "CGO_ENABLED=0", "GOOS=" + goos, "GOARCH=" + goarch, }...) var out []byte if out, err = cmd.CombinedOutput(); err != nil { return fmt.Errorf("could not build http server: %s", string(out)) } cpCmd, lookErr := exec.LookPath("cp") if lookErr != nil { return fmt.Errorf("could not build http server: %v", lookErr) } if out, err = exec.Command(cpCmd, "../contrib/httpserver/Dockerfile", filepath.Join(tmp, "Dockerfile")).CombinedOutput(); err != nil { return fmt.Errorf("could not build http server: %v", string(out)) } if out, err = exec.Command(dockerBinary, "build", "-q", "-t", "httpserver", tmp).CombinedOutput(); err != nil { return fmt.Errorf("could not build http server: %v", string(out)) } return nil }