diff --git a/Dockerfile b/Dockerfile index 079869abf..77f713e70 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,16 @@ -# Dockerfile for DockerUI - FROM ubuntu:12.04 -MAINTAINER Michael Crosby http://crosbymichael.com - RUN apt-get update RUN apt-get upgrade -y -RUN apt-get install -y curl ;\ - curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | tar -v -C /opt -xz ;\ +RUN apt-get install -y curl +RUN curl -s https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz | tar -v -C /opt -xz ;\ cp -a /opt/go/* /usr/local/ ;\ - rm -rf /opt/go ;\ -#RUN + rm -rf /opt/go; ENV GOROOT /usr/local/ - ADD . /app/ - WORKDIR /app/ - RUN go build dockerui.go - EXPOSE 9000 -ENTRYPOINT ["./dockerui"] +ENTRYPOINT ["./dockerui"] \ No newline at end of file diff --git a/README.md b/README.md index 8b080d025..9f18d445f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -##DockerUI +## DockerUI ![Containers](/containers.png) DockerUI is a web interface to interact with the Remote API. The goal is to provide a pure client side implementation so it is effortless to connect and manage docker. This project is not complete and is still under heavy development. @@ -13,12 +13,12 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro ### Container Quickstart * Run your docker daemon with the following options: - * `docker -d -H="0.0.0.0:4243" -api-enable-cors` +* `docker -d -H="0.0.0.0:4243" -api-enable-cors` * `docker run -d -p 80:9000 crosbymichael/dockerui -e="http://:4243"` * Open your browser to `http://` -###Setup +### Setup 1. Make sure that you are running dockerd ( docker -d ) with the -H and [-api-enable-cors](http://docs.docker.io/en/latest/api/docker_remote_api_v1.2/#cors-requests) so that the UI can make requests to the Remote API. @@ -37,14 +37,21 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro 5. Everything should be good to go, if you experience any issues please report them on this repository. -###Stack +### Connect via a unix socket +If you want to connect to docker via the unix socket you can pass the socket path to the `-e` variable. If you are running dockerui in a container you can bind mount the unix socket into the container. + +```bash +docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock dockerui -e /docker.sock +``` + +### Stack * Angular.js * Flatstrap ( Flat Twitter Bootstrap ) * Spin.js * Ace editor -###Todo: +### Todo: * Multiple endpoints * Full repository support * Search @@ -53,7 +60,7 @@ DockerUI is a web interface to interact with the Remote API. The goal is to pro * Authentication and Authorization -###License - MIT +### License - MIT The DockerUI code is licensed under the MIT license. Flatstrap(bootstrap) is licensed under the Apache License v2.0 and Angular.js is licensed under MIT. diff --git a/dockerui.go b/dockerui.go index 4c48d5ced..1a68bc37b 100644 --- a/dockerui.go +++ b/dockerui.go @@ -2,10 +2,13 @@ package main import ( "flag" + "io" "log" + "net" "net/http" "net/http/httputil" "net/url" + "strings" ) var ( @@ -14,20 +17,69 @@ var ( assets = flag.String("a", ".", "Path to the assets") ) -func createHandler(dir string, dockerEndpoint string) http.Handler { - mux := http.NewServeMux() +type UnixHandler struct { + path string +} - fileHandler := http.FileServer(http.Dir(dir)) - u, err := url.Parse(dockerEndpoint) +func (h *UnixHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + conn, err := net.Dial("unix", h.path) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Println(err) + return + } + c := httputil.NewClientConn(conn, nil) + defer c.Close() + + res, err := c.Do(r) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + log.Println(err) + return + } + defer res.Body.Close() + + copyHeader(w.Header(), res.Header) + if _, err := io.Copy(w, res.Body); err != nil { + log.Println(err) + } +} + +func copyHeader(dst, src http.Header) { + for k, vv := range src { + for _, v := range vv { + dst.Add(k, v) + } + } +} + +func createTcpHandler(e string) http.Handler { + u, err := url.Parse(e) if err != nil { log.Fatal(err) - return nil } - reverseProxy := httputil.NewSingleHostReverseProxy(u) + return httputil.NewSingleHostReverseProxy(u) +} - mux.Handle("/dockerapi/", http.StripPrefix("/dockerapi", reverseProxy)) +func createUnixHandler(e string) http.Handler { + return &UnixHandler{e} +} + +func createHandler(dir string, e string) http.Handler { + var ( + mux = http.NewServeMux() + fileHandler = http.FileServer(http.Dir(dir)) + h http.Handler + ) + + if strings.Contains(e, "http") { + h = createTcpHandler(e) + } else { + h = createUnixHandler(e) + } + + mux.Handle("/dockerapi/", http.StripPrefix("/dockerapi", h)) mux.Handle("/", fileHandler) - return mux }