diff --git a/api/exec/compose_stack.go b/api/exec/compose_stack.go index 954a7aa43..3c153df83 100644 --- a/api/exec/compose_stack.go +++ b/api/exec/compose_stack.go @@ -10,6 +10,7 @@ import ( portainer "github.com/portainer/portainer/api" "github.com/portainer/portainer/api/http/proxy" + "github.com/portainer/portainer/api/http/proxy/factory" ) // ComposeStackManager is a wrapper for docker-compose binary @@ -43,11 +44,15 @@ func (w *ComposeStackManager) ComposeSyntaxMaxVersion() string { // Up builds, (re)creates and starts containers in the background. Wraps `docker-compose up -d` command func (w *ComposeStackManager) Up(stack *portainer.Stack, endpoint *portainer.Endpoint) error { - url, err := w.fetchEndpointURL(endpoint) + url, proxy, err := w.fetchEndpointProxy(endpoint) if err != nil { return err } + if proxy != nil { + defer proxy.Close() + } + envFilePath, err := createEnvFile(stack) if err != nil { return err @@ -61,10 +66,13 @@ func (w *ComposeStackManager) Up(stack *portainer.Stack, endpoint *portainer.End // Down stops and removes containers, networks, images, and volumes. Wraps `docker-compose down --remove-orphans` command func (w *ComposeStackManager) Down(stack *portainer.Stack, endpoint *portainer.Endpoint) error { - url, err := w.fetchEndpointURL(endpoint) + url, proxy, err := w.fetchEndpointProxy(endpoint) if err != nil { return err } + if proxy != nil { + defer proxy.Close() + } filePath := stackFilePath(stack) @@ -76,19 +84,17 @@ func stackFilePath(stack *portainer.Stack) string { return path.Join(stack.ProjectPath, stack.EntryPoint) } -func (w *ComposeStackManager) fetchEndpointURL(endpoint *portainer.Endpoint) (string, error) { +func (w *ComposeStackManager) fetchEndpointProxy(endpoint *portainer.Endpoint) (string, *factory.ProxyServer, error) { if strings.HasPrefix(endpoint.URL, "unix://") || strings.HasPrefix(endpoint.URL, "npipe://") { - return "", nil + return "", nil, nil } proxy, err := w.proxyManager.CreateComposeProxyServer(endpoint) if err != nil { - return "", err + return "", nil, err } - defer proxy.Close() - - return fmt.Sprintf("http://127.0.0.1:%d", proxy.Port), nil + return fmt.Sprintf("http://127.0.0.1:%d", proxy.Port), proxy, nil } func createEnvFile(stack *portainer.Stack) (string, error) { diff --git a/api/http/proxy/factory/docker_compose.go b/api/http/proxy/factory/docker_compose.go index 7da8d898f..9438117e8 100644 --- a/api/http/proxy/factory/docker_compose.go +++ b/api/http/proxy/factory/docker_compose.go @@ -49,13 +49,18 @@ func (factory *ProxyFactory) NewDockerComposeAgentProxy(endpoint *portainer.Endp proxy.Transport = dockercompose.NewAgentTransport(factory.signatureService, httpTransport) proxyServer := &ProxyServer{ - &http.Server{ + server: &http.Server{ Handler: proxy, }, - 0, + Port: 0, } - return proxyServer, proxyServer.start() + err = proxyServer.start() + if err != nil { + return nil, err + } + + return proxyServer, err } func (proxy *ProxyServer) start() error { @@ -72,7 +77,7 @@ func (proxy *ProxyServer) start() error { err := proxy.server.Serve(listener) log.Printf("Exiting Proxy server %s\n", proxyHost) - if err != http.ErrServerClosed { + if err != nil && err != http.ErrServerClosed { log.Printf("Proxy server %s exited with an error: %s\n", proxyHost, err) } }()