Skip to content
This repository was archived by the owner on Mar 30, 2020. It is now read-only.

Commit 7bb1d90

Browse files
committed
core: ports by enviroment
1 parent 140c196 commit 7bb1d90

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

core/docker.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919

2020
type Docker struct {
2121
endPoint string
22+
env *Environment
2223
client *docker.Client
2324
}
2425

@@ -42,7 +43,7 @@ func NewDocker(endPoint string, env *Environment) (*Docker, error) {
4243
return nil, err
4344
}
4445

45-
return &Docker{client: c, endPoint: endPoint}, nil
46+
return &Docker{client: c, endPoint: endPoint, env: env}, nil
4647
}
4748

4849
func (d *Docker) Deploy(p *Project, rev Revision, dockerfile *Dockerfile, output io.Writer, force bool) error {
@@ -345,18 +346,23 @@ func (d *Docker) formatPorts(ports []string) (map[docker.Port][]docker.PortBindi
345346

346347
// <host_interface>:<host_port>:<container_port>/<proto>
347348
func (d *Docker) formatPort(port string) (guest docker.Port, host docker.PortBinding, err error) {
348-
p1 := strings.SplitN(port, "/", 2)
349-
p2 := strings.SplitN(p1[0], ":", 3)
349+
p1 := strings.SplitN(port, "@", 2)
350+
if len(p1) == 2 && d.env != nil && d.env.Name != p1[1] {
351+
return
352+
}
353+
354+
p2 := strings.SplitN(p1[0], "/", 2)
355+
p3 := strings.SplitN(p2[0], ":", 3)
350356

351-
if len(p1) != 2 || len(p2) != 3 {
357+
if len(p2) != 2 || len(p3) != 3 {
352358
err = errors.New(fmt.Sprintf("Malformed port %q", port))
353359
return
354360
}
355361

356-
guest = docker.Port(fmt.Sprintf("%s/%s", p2[2], p1[1]))
362+
guest = docker.Port(fmt.Sprintf("%s/%s", p3[2], p2[1]))
357363
host = docker.PortBinding{
358-
HostIP: p2[0],
359-
HostPort: p2[1],
364+
HostIP: p3[0],
365+
HostPort: p3[1],
360366
}
361367

362368
return

core/docker_test.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -233,15 +233,18 @@ func (s *CoreSuite) TestDocker_formatPorts(c *C) {
233233
"0.0.0.0:8080:80/tcp",
234234
"0.0.0.0:8080:80/udp",
235235
"0.0.0.0:42:42/tcp",
236-
"1.1.1.1:42:80/tcp",
236+
"1.1.1.1:42:80/tcp@bar",
237+
"2.2.2.2:42:80/tcp@foo",
237238
}
238239

239-
d, _ := NewDocker("", nil)
240+
d, _ := NewDocker("tcp://foo", &Environment{Name: "foo"})
240241
r, _ := d.formatPorts(p)
241-
c.Assert(r, HasLen, 3)
242+
c.Assert(r, HasLen, 4)
242243
c.Assert(r["80/tcp"], HasLen, 2)
243244
c.Assert(r["80/tcp"][0].HostIP, Equals, "0.0.0.0")
244245
c.Assert(r["80/tcp"][0].HostPort, Equals, "8080")
246+
c.Assert(r["80/tcp"][1].HostIP, Equals, "2.2.2.2")
247+
c.Assert(r["80/tcp"][1].HostPort, Equals, "42")
245248
c.Assert(r["80/udp"], HasLen, 1)
246249
c.Assert(r["42/tcp"], HasLen, 1)
247250
}

documentation/configuration.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ An environment is a logical group of any number of Docker servers. Dockership su
6969
* `RelatedRepositories` (optional, multiple): SSH clone URL to dependent repositories. (Link to more explanatory document)
7070
* `History` (default: 3): Number to old images you want to keep in each Docker server.
7171
* `NoCache` (optional): Avoid to use the Docker cache (like --no-cache at `docker build`)
72-
* `Port` (multiple, optional): container port to expose, format: `<host-addr>:<host-port>:<container-port>/<proto>` (like -p at `docker run`)
72+
* `Port` (multiple, optional): container port to expose, format: `<host-addr>:<host-port>:<container-port>/<proto>` (like -p at `docker run`), additionaly the port can be configured just for one enviroment adding it to end of the port preceded by a `@` (eg: `2.2.2.2:80:80/tcp@live`)
7373
* `Restart` (optional, default: no): restart policy to apply when a container exits (no, on-failure[:max-retry], always) (like --restart at `docker run`)
7474
* `Link` (multiple, optional): creates a Link to other project, when this project is deployed the linked projects are restarted (like -P at `docker run`)
7575
* `GithubToken` (default: Global.GithubToken): the token needed to access this repository, if it is different from the global one.

0 commit comments

Comments
 (0)