コード例 #1
0
func newContainerProxy(name string, client docker.Docker) (*containerProxy, error) {
	container, err := client.FetchContainer(name)
	if container == nil || err != nil || !container.State.Running {
		return nil, fmt.Errorf("Container %s does not exist or is not running, skipping for now", name)
	}
	ip := container.NetworkSettings.IpAddress
	ports := container.NetworkSettings.Ports
	if len(ports) == 0 {
		return nil, fmt.Errorf("No ports to proxy for %s", name)
	}
	var proxies []proxy.Proxy
	for key, _ := range ports {
		port, proto := utils.SplitPort(key)
		p, err := newProxy(proto, ip, port)
		if err != nil {
			log.Info("Error creating proxy for %s %s:%s - %v", name, ip, port, err)
			continue
		}
		proxies = append(proxies, p)
	}
	if len(proxies) == 0 {
		return nil, fmt.Errorf("Error creating proxies for container %s", name)
	}
	return &containerProxy{id: container.Id, name: name, s: proxies}, nil
}
コード例 #2
0
func proxyContainer(container *docker.Container, proxyChan chan net.Listener) error {
	ip := container.NetworkSettings.IpAddress
	ports := container.NetworkSettings.Ports
	if len(ports) != 0 {
		for key, _ := range ports {
			port, proto := utils.SplitPort(key)
			local := fmt.Sprintf("%v://0.0.0.0:%v", proto, port)
			remote := fmt.Sprintf("%v://%v:%v", proto, ip, port)
			out := fmt.Sprintf("Proxying %s:%s/%s", ip, port, proto)
			log.Printf(out)
			srv, err := gocat.NewProxy(local, remote)
			if err != nil {
				return err
			}
			proxyChan <- srv
		}
	}
	close(proxyChan)
	return nil
}