diff --git a/builder/dispatchers.go b/builder/dispatchers.go index b00268ed67..959042e5ee 100644 --- a/builder/dispatchers.go +++ b/builder/dispatchers.go @@ -339,11 +339,19 @@ func expose(b *Builder, args []string, attributes map[string]bool, original stri b.Config.ExposedPorts = make(nat.PortSet) } - ports, _, err := nat.ParsePortSpecs(append(portsTab, b.Config.PortSpecs...)) + ports, bindingMap, err := nat.ParsePortSpecs(append(portsTab, b.Config.PortSpecs...)) if err != nil { return err } + for _, bindings := range bindingMap { + if bindings[0].HostIp != "" || bindings[0].HostPort != "" { + fmt.Fprintf(b.ErrStream, " ---> Using Dockerfile's EXPOSE instruction"+ + " to map host ports to container ports (ip:hostPort:containerPort) is deprecated.\n"+ + " Please use -p to publish the ports.\n") + } + } + // instead of using ports directly, we build a list of ports and sort it so // the order is consistent. This prevents cache burst where map ordering // changes between builds diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index ac1ac14775..b718d347a6 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -2343,6 +2343,33 @@ func TestBuildExposeUpperCaseProto(t *testing.T) { logDone("build - expose port with upper case proto") } +func TestBuildExposeHostPort(t *testing.T) { + // start building docker file with ip:hostPort:containerPort + name := "testbuildexpose" + expected := "map[5678/tcp:map[]]" + defer deleteImages(name) + _, out, err := buildImageWithOut(name, + `FROM scratch + EXPOSE 192.168.1.2:2375:5678`, + true) + if err != nil { + t.Fatal(err) + } + + if !strings.Contains(out, "to map host ports to container ports (ip:hostPort:containerPort) is deprecated.") { + t.Fatal("Missing warning message") + } + + res, err := inspectField(name, "Config.ExposedPorts") + if err != nil { + t.Fatal(err) + } + if res != expected { + t.Fatalf("Exposed ports %s, expected %s", res, expected) + } + logDone("build - ignore exposing host's port") +} + func TestBuildEmptyEntrypointInheritance(t *testing.T) { name := "testbuildentrypointinheritance" name2 := "testbuildentrypointinheritance2"