1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #1470 from runcom/proxy-path

bridge,portmapper: custom docker-proxy path
This commit is contained in:
Madhu Venugopal 2016-09-29 14:43:40 -07:00 committed by GitHub
commit 59832beb31
6 changed files with 28 additions and 21 deletions

View file

@ -50,6 +50,7 @@ type configuration struct {
EnableIPForwarding bool EnableIPForwarding bool
EnableIPTables bool EnableIPTables bool
EnableUserlandProxy bool EnableUserlandProxy bool
UserlandProxyPath string
} }
// networkConfiguration for network specific configuration // networkConfiguration for network specific configuration
@ -638,7 +639,7 @@ func (d *driver) createNetwork(config *networkConfiguration) error {
id: config.ID, id: config.ID,
endpoints: make(map[string]*bridgeEndpoint), endpoints: make(map[string]*bridgeEndpoint),
config: config, config: config,
portMapper: portmapper.New(), portMapper: portmapper.New(d.config.UserlandProxyPath),
driver: d, driver: d,
} }

View file

@ -124,7 +124,7 @@ func assertChainConfig(d *driver, t *testing.T) {
// Assert function which pushes chains based on bridge config parameters. // Assert function which pushes chains based on bridge config parameters.
func assertBridgeConfig(config *networkConfiguration, br *bridgeInterface, d *driver, t *testing.T) { func assertBridgeConfig(config *networkConfiguration, br *bridgeInterface, d *driver, t *testing.T) {
nw := bridgeNetwork{portMapper: portmapper.New(), nw := bridgeNetwork{portMapper: portmapper.New(""),
config: config} config: config}
nw.driver = d nw.driver = d

View file

@ -38,19 +38,22 @@ type PortMapper struct {
currentMappings map[string]*mapping currentMappings map[string]*mapping
lock sync.Mutex lock sync.Mutex
proxyPath string
Allocator *portallocator.PortAllocator Allocator *portallocator.PortAllocator
} }
// New returns a new instance of PortMapper // New returns a new instance of PortMapper
func New() *PortMapper { func New(proxyPath string) *PortMapper {
return NewWithPortAllocator(portallocator.Get()) return NewWithPortAllocator(portallocator.Get(), proxyPath)
} }
// NewWithPortAllocator returns a new instance of PortMapper which will use the specified PortAllocator // NewWithPortAllocator returns a new instance of PortMapper which will use the specified PortAllocator
func NewWithPortAllocator(allocator *portallocator.PortAllocator) *PortMapper { func NewWithPortAllocator(allocator *portallocator.PortAllocator, proxyPath string) *PortMapper {
return &PortMapper{ return &PortMapper{
currentMappings: make(map[string]*mapping), currentMappings: make(map[string]*mapping),
Allocator: allocator, Allocator: allocator,
proxyPath: proxyPath,
} }
} }
@ -90,7 +93,7 @@ func (pm *PortMapper) MapRange(container net.Addr, hostIP net.IP, hostPortStart,
} }
if useProxy { if useProxy {
m.userlandProxy, err = newProxy(proto, hostIP, allocatedHostPort, container.(*net.TCPAddr).IP, container.(*net.TCPAddr).Port) m.userlandProxy, err = newProxy(proto, hostIP, allocatedHostPort, container.(*net.TCPAddr).IP, container.(*net.TCPAddr).Port, pm.proxyPath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -110,7 +113,7 @@ func (pm *PortMapper) MapRange(container net.Addr, hostIP net.IP, hostPortStart,
} }
if useProxy { if useProxy {
m.userlandProxy, err = newProxy(proto, hostIP, allocatedHostPort, container.(*net.UDPAddr).IP, container.(*net.UDPAddr).Port) m.userlandProxy, err = newProxy(proto, hostIP, allocatedHostPort, container.(*net.UDPAddr).IP, container.(*net.UDPAddr).Port, pm.proxyPath)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -15,7 +15,7 @@ func init() {
} }
func TestSetIptablesChain(t *testing.T) { func TestSetIptablesChain(t *testing.T) {
pm := New() pm := New("")
c := &iptables.ChainInfo{ c := &iptables.ChainInfo{
Name: "TEST", Name: "TEST",
@ -32,7 +32,7 @@ func TestSetIptablesChain(t *testing.T) {
} }
func TestMapTCPPorts(t *testing.T) { func TestMapTCPPorts(t *testing.T) {
pm := New() pm := New("")
dstIP1 := net.ParseIP("192.168.0.1") dstIP1 := net.ParseIP("192.168.0.1")
dstIP2 := net.ParseIP("192.168.0.2") dstIP2 := net.ParseIP("192.168.0.2")
dstAddr1 := &net.TCPAddr{IP: dstIP1, Port: 80} dstAddr1 := &net.TCPAddr{IP: dstIP1, Port: 80}
@ -111,7 +111,7 @@ func TestGetUDPIPAndPort(t *testing.T) {
} }
func TestMapUDPPorts(t *testing.T) { func TestMapUDPPorts(t *testing.T) {
pm := New() pm := New("")
dstIP1 := net.ParseIP("192.168.0.1") dstIP1 := net.ParseIP("192.168.0.1")
dstIP2 := net.ParseIP("192.168.0.2") dstIP2 := net.ParseIP("192.168.0.2")
dstAddr1 := &net.UDPAddr{IP: dstIP1, Port: 80} dstAddr1 := &net.UDPAddr{IP: dstIP1, Port: 80}
@ -157,7 +157,7 @@ func TestMapUDPPorts(t *testing.T) {
} }
func TestMapAllPortsSingleInterface(t *testing.T) { func TestMapAllPortsSingleInterface(t *testing.T) {
pm := New() pm := New("")
dstIP1 := net.ParseIP("0.0.0.0") dstIP1 := net.ParseIP("0.0.0.0")
srcAddr1 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.1")} srcAddr1 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.1")}
@ -196,7 +196,7 @@ func TestMapAllPortsSingleInterface(t *testing.T) {
} }
func TestMapTCPDummyListen(t *testing.T) { func TestMapTCPDummyListen(t *testing.T) {
pm := New() pm := New("")
dstIP := net.ParseIP("0.0.0.0") dstIP := net.ParseIP("0.0.0.0")
dstAddr := &net.TCPAddr{IP: dstIP, Port: 80} dstAddr := &net.TCPAddr{IP: dstIP, Port: 80}
@ -233,7 +233,7 @@ func TestMapTCPDummyListen(t *testing.T) {
} }
func TestMapUDPDummyListen(t *testing.T) { func TestMapUDPDummyListen(t *testing.T) {
pm := New() pm := New("")
dstIP := net.ParseIP("0.0.0.0") dstIP := net.ParseIP("0.0.0.0")
dstAddr := &net.UDPAddr{IP: dstIP, Port: 80} dstAddr := &net.UDPAddr{IP: dstIP, Port: 80}

View file

@ -2,7 +2,7 @@ package portmapper
import "net" import "net"
func newMockProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int) (userlandProxy, error) { func newMockProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int, userlandProxyPath string) (userlandProxy, error) {
return &mockProxyCommand{}, nil return &mockProxyCommand{}, nil
} }

View file

@ -25,15 +25,18 @@ type proxyCommand struct {
cmd *exec.Cmd cmd *exec.Cmd
} }
func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int) (userlandProxy, error) { func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.IP, containerPort int, proxyPath string) (userlandProxy, error) {
path := proxyPath
if proxyPath == "" {
cmd, err := exec.LookPath(userlandProxyCommandName) cmd, err := exec.LookPath(userlandProxyCommandName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
path = cmd
}
args := []string{ args := []string{
cmd, path,
"-proto", proto, "-proto", proto,
"-host-ip", hostIP.String(), "-host-ip", hostIP.String(),
"-host-port", strconv.Itoa(hostPort), "-host-port", strconv.Itoa(hostPort),
@ -43,7 +46,7 @@ func newProxyCommand(proto string, hostIP net.IP, hostPort int, containerIP net.
return &proxyCommand{ return &proxyCommand{
cmd: &exec.Cmd{ cmd: &exec.Cmd{
Path: cmd, Path: path,
Args: args, Args: args,
SysProcAttr: &syscall.SysProcAttr{ SysProcAttr: &syscall.SysProcAttr{
Pdeathsig: syscall.SIGTERM, // send a sigterm to the proxy if the daemon process dies Pdeathsig: syscall.SIGTERM, // send a sigterm to the proxy if the daemon process dies