diff --git a/libnetwork/etchosts/hosts.go b/libnetwork/etchosts/hosts.go index 408922c5e..2d4b73a9b 100644 --- a/libnetwork/etchosts/hosts.go +++ b/libnetwork/etchosts/hosts.go @@ -14,6 +14,7 @@ import ( const ( HostContainersInternal = "host.containers.internal" + HostGateway = "host-gateway" localhost = "localhost" ) @@ -98,7 +99,7 @@ func Remove(file string, entries HostEntries) error { // new see comment on New() func newHost(params *Params) error { - entries, err := parseExtraHosts(params.ExtraHosts) + entries, err := parseExtraHosts(params.ExtraHosts, params.HostContainersInternalIP) if err != nil { return err } @@ -230,7 +231,7 @@ func checkIfEntryExists(current HostEntry, entries HostEntries) bool { // parseExtraHosts converts a slice of "name:ip" string to entries. // Because podman and buildah both store the extra hosts in this format // we convert it here instead of having to this on the caller side. -func parseExtraHosts(extraHosts []string) (HostEntries, error) { +func parseExtraHosts(extraHosts []string, hostContainersInternalIP string) (HostEntries, error) { entries := make(HostEntries, 0, len(extraHosts)) for _, entry := range extraHosts { values := strings.SplitN(entry, ":", 2) @@ -243,7 +244,14 @@ func parseExtraHosts(extraHosts []string) (HostEntries, error) { if values[1] == "" { return nil, fmt.Errorf("IP address in host entry %q is empty", entry) } - e := HostEntry{IP: values[1], Names: []string{values[0]}} + ip := values[1] + if values[1] == HostGateway { + if hostContainersInternalIP == "" { + return nil, fmt.Errorf("unable to replace %q of host entry %q: host containers internal IP address is empty", HostGateway, entry) + } + ip = hostContainersInternalIP + } + e := HostEntry{IP: ip, Names: []string{values[0]}} entries = append(entries, e) } return entries, nil diff --git a/libnetwork/etchosts/hosts_test.go b/libnetwork/etchosts/hosts_test.go index 5a95bb6bd..69e83b5c7 100644 --- a/libnetwork/etchosts/hosts_test.go +++ b/libnetwork/etchosts/hosts_test.go @@ -218,6 +218,13 @@ func TestNew(t *testing.T) { hostContainersInternal: "10.0.0.1", expectedTargetFileContent: targetFileContent1 + "10.0.0.1\thost.containers.internal\n", }, + { + name: "with host.containers.internal ip and host-gateway", + baseFileContent: baseFileContent1Spaces, + extraHosts: []string{"gatewayname:host-gateway"}, + hostContainersInternal: "10.0.0.1", + expectedTargetFileContent: "10.0.0.1\tgatewayname\n" + targetFileContent1 + "10.0.0.1\thost.containers.internal\n", + }, { name: "host.containers.internal not added when already present in extra hosts", baseFileContent: baseFileContent1Spaces, @@ -267,6 +274,12 @@ func TestNew(t *testing.T) { extraHosts: []string{"name"}, wantErrString: "unable to parse host entry \"name\": incorrect format", }, + { + name: "invalid host-gateway", + baseFileContent: baseFileContent1Spaces, + extraHosts: []string{"gatewayname:host-gateway"}, + wantErrString: "host containers internal IP address is empty", + }, } for _, tt := range tests {