mirror of https://github.com/containers/podman.git
Merge pull request #26221 from Luap99/resolv
libpod: don't force only network search domains
This commit is contained in:
commit
4030ee62c8
2
go.mod
2
go.mod
|
@ -13,7 +13,7 @@ require (
|
||||||
github.com/checkpoint-restore/go-criu/v7 v7.2.0
|
github.com/checkpoint-restore/go-criu/v7 v7.2.0
|
||||||
github.com/containernetworking/plugins v1.7.1
|
github.com/containernetworking/plugins v1.7.1
|
||||||
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1
|
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1
|
||||||
github.com/containers/common v0.63.1-0.20250528122446-1a3b5ecec62f
|
github.com/containers/common v0.63.1-0.20250602154905-5a4ca2d5d355
|
||||||
github.com/containers/conmon v2.0.20+incompatible
|
github.com/containers/conmon v2.0.20+incompatible
|
||||||
github.com/containers/gvisor-tap-vsock v0.8.6
|
github.com/containers/gvisor-tap-vsock v0.8.6
|
||||||
github.com/containers/image/v5 v5.35.1-0.20250526152843-c64593da00e4
|
github.com/containers/image/v5 v5.35.1-0.20250526152843-c64593da00e4
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -68,8 +68,8 @@ github.com/containernetworking/plugins v1.7.1 h1:CNAR0jviDj6FS5Vg85NTgKWLDzZPfi/
|
||||||
github.com/containernetworking/plugins v1.7.1/go.mod h1:xuMdjuio+a1oVQsHKjr/mgzuZ24leAsqUYRnzGoXHy0=
|
github.com/containernetworking/plugins v1.7.1/go.mod h1:xuMdjuio+a1oVQsHKjr/mgzuZ24leAsqUYRnzGoXHy0=
|
||||||
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1 h1:3bNWDmqh9tx0iAXPzBJugj/oC0nTD9yTXCyIu/Mj/LE=
|
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1 h1:3bNWDmqh9tx0iAXPzBJugj/oC0nTD9yTXCyIu/Mj/LE=
|
||||||
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1/go.mod h1:8BVLrM6nRl/dRMYxZ+TrmoWPXzkCY99rZOYvJoXpIyE=
|
github.com/containers/buildah v1.40.1-0.20250523151639-b535d02d0ee1/go.mod h1:8BVLrM6nRl/dRMYxZ+TrmoWPXzkCY99rZOYvJoXpIyE=
|
||||||
github.com/containers/common v0.63.1-0.20250528122446-1a3b5ecec62f h1:308Ex0+3+gBSpDPJrFCQIhALdD8YC7jzaXuxSFZgFiA=
|
github.com/containers/common v0.63.1-0.20250602154905-5a4ca2d5d355 h1:vK7TVpONcQzWHR4dAEnLkLeCrKNB61UhLDpwAXFIIto=
|
||||||
github.com/containers/common v0.63.1-0.20250528122446-1a3b5ecec62f/go.mod h1:efNRNweihnq5nXALnAPDXTpC7uJtnFV4pNuETTfvI8s=
|
github.com/containers/common v0.63.1-0.20250602154905-5a4ca2d5d355/go.mod h1:efNRNweihnq5nXALnAPDXTpC7uJtnFV4pNuETTfvI8s=
|
||||||
github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg=
|
github.com/containers/conmon v2.0.20+incompatible h1:YbCVSFSCqFjjVwHTPINGdMX1F6JXHGTUje2ZYobNrkg=
|
||||||
github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I=
|
github.com/containers/conmon v2.0.20+incompatible/go.mod h1:hgwZ2mtuDrppv78a/cOBNiCm6O0UMWGx1mu7P00nu5I=
|
||||||
github.com/containers/gvisor-tap-vsock v0.8.6 h1:9SeAXK+K2o36CtrgYk6zRXbU3zrayjvkrI8b7/O6u5A=
|
github.com/containers/gvisor-tap-vsock v0.8.6 h1:9SeAXK+K2o36CtrgYk6zRXbU3zrayjvkrI8b7/O6u5A=
|
||||||
|
|
|
@ -2254,13 +2254,16 @@ func (c *Container) addResolvConf() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set DNS search domains
|
// Set DNS search domains
|
||||||
search := networkSearchDomains
|
var search []string
|
||||||
|
keepHostSearches := false
|
||||||
if len(c.config.DNSSearch) > 0 || len(c.runtime.config.Containers.DNSSearches.Get()) > 0 {
|
if len(c.config.DNSSearch) > 0 || len(c.runtime.config.Containers.DNSSearches.Get()) > 0 {
|
||||||
customSearch := make([]string, 0, len(c.config.DNSSearch)+len(c.runtime.config.Containers.DNSSearches.Get()))
|
customSearch := make([]string, 0, len(c.config.DNSSearch)+len(c.runtime.config.Containers.DNSSearches.Get()))
|
||||||
customSearch = append(customSearch, c.runtime.config.Containers.DNSSearches.Get()...)
|
customSearch = append(customSearch, c.runtime.config.Containers.DNSSearches.Get()...)
|
||||||
customSearch = append(customSearch, c.config.DNSSearch...)
|
customSearch = append(customSearch, c.config.DNSSearch...)
|
||||||
search = customSearch
|
search = customSearch
|
||||||
|
} else {
|
||||||
|
search = networkSearchDomains
|
||||||
|
keepHostSearches = true
|
||||||
}
|
}
|
||||||
|
|
||||||
options := make([]string, 0, len(c.config.DNSOption)+len(c.runtime.config.Containers.DNSOptions.Get()))
|
options := make([]string, 0, len(c.config.DNSOption)+len(c.runtime.config.Containers.DNSOptions.Get()))
|
||||||
|
@ -2273,13 +2276,14 @@ func (c *Container) addResolvConf() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := resolvconf.New(&resolvconf.Params{
|
if err := resolvconf.New(&resolvconf.Params{
|
||||||
IPv6Enabled: ipv6,
|
IPv6Enabled: ipv6,
|
||||||
KeepHostServers: keepHostServers,
|
KeepHostServers: keepHostServers,
|
||||||
Nameservers: nameservers,
|
KeepHostSearches: keepHostSearches,
|
||||||
Namespaces: namespaces,
|
Nameservers: nameservers,
|
||||||
Options: options,
|
Namespaces: namespaces,
|
||||||
Path: destPath,
|
Options: options,
|
||||||
Searches: search,
|
Path: destPath,
|
||||||
|
Searches: search,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return fmt.Errorf("building resolv.conf for container %s: %w", c.ID(), err)
|
return fmt.Errorf("building resolv.conf for container %s: %w", c.ID(), err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1152,24 +1152,27 @@ EXPOSE 2004-2005/tcp`, ALPINE)
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--name", "con1", "--network", net, CITEST_IMAGE, "nslookup", "con1"})
|
// Note apline nslookup tries to resolve all search domains always and returns an error if one does not resolve.
|
||||||
|
// Because we leak all host search domain into the container we have no control over if it resolves or not.
|
||||||
|
// Thus use "NAME." to indicate the name is full and no search domain should be tried.
|
||||||
|
session = podmanTest.Podman([]string{"run", "--name", "con1", "--network", net, CITEST_IMAGE, "nslookup", "con1."})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--name", "con2", "--pod", pod, "--network", net, CITEST_IMAGE, "nslookup", "con2"})
|
session = podmanTest.Podman([]string{"run", "--name", "con2", "--pod", pod, "--network", net, CITEST_IMAGE, "nslookup", "con2."})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--name", "con3", "--pod", pod2, CITEST_IMAGE, "nslookup", "con1"})
|
session = podmanTest.Podman([]string{"run", "--name", "con3", "--pod", pod2, CITEST_IMAGE, "nslookup", "con1."})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitWithError(1, ""))
|
Expect(session).Should(ExitWithError(1, ""))
|
||||||
Expect(session.OutputToString()).To(ContainSubstring("server can't find con1.dns.podman: NXDOMAIN"))
|
Expect(session.OutputToString()).To(ContainSubstring("NXDOMAIN"))
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--name", "con4", "--network", net, CITEST_IMAGE, "nslookup", pod2 + ".dns.podman"})
|
session = podmanTest.Podman([]string{"run", "--name", "con4", "--network", net, CITEST_IMAGE, "nslookup", pod2 + ".dns.podman"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
|
|
||||||
session = podmanTest.Podman([]string{"run", "--network", net, CITEST_IMAGE, "nslookup", hostname})
|
session = podmanTest.Podman([]string{"run", "--network", net, CITEST_IMAGE, "nslookup", hostname + "."})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
Expect(session).Should(ExitCleanly())
|
Expect(session).Should(ExitCleanly())
|
||||||
})
|
})
|
||||||
|
|
|
@ -902,11 +902,21 @@ EOF
|
||||||
@test "podman network rm --dns-option " {
|
@test "podman network rm --dns-option " {
|
||||||
dns_opt=dns$(random_string)
|
dns_opt=dns$(random_string)
|
||||||
run_podman run --rm --dns-opt=${dns_opt} $IMAGE cat /etc/resolv.conf
|
run_podman run --rm --dns-opt=${dns_opt} $IMAGE cat /etc/resolv.conf
|
||||||
is "$output" ".*options ${dns_opt}" "--dns-opt was added"
|
# Note that we must fully replace all host option so make a match for line start/end as well
|
||||||
|
# https://github.com/containers/podman/issues/22399
|
||||||
|
assert "$output" =~ ".*^options ${dns_opt}\$" "--dns-opt was added"
|
||||||
|
|
||||||
dns_opt=dns$(random_string)
|
dns_opt=dns$(random_string)
|
||||||
run_podman run --rm --dns-option=${dns_opt} $IMAGE cat /etc/resolv.conf
|
run_podman run --rm --dns-option=${dns_opt} $IMAGE cat /etc/resolv.conf
|
||||||
is "$output" ".*options ${dns_opt}" "--dns-option was added"
|
assert "$output" =~ ".*^options ${dns_opt}\$" "--dns-option was added"
|
||||||
|
|
||||||
|
# now check with a custom network as well
|
||||||
|
local net=net-$(safename)
|
||||||
|
run_podman network create $net
|
||||||
|
run_podman run --rm --network $net --dns-option=${dns_opt} $IMAGE cat /etc/resolv.conf
|
||||||
|
assert "$output" =~ ".*^options ${dns_opt}\$" "--dns-option was added with custom network"
|
||||||
|
|
||||||
|
run_podman network rm -f $net
|
||||||
}
|
}
|
||||||
|
|
||||||
# bats test_tags=ci:parallel
|
# bats test_tags=ci:parallel
|
||||||
|
|
|
@ -30,17 +30,28 @@ type Params struct {
|
||||||
// IPv6Enabled will filter ipv6 nameservers when not set to true.
|
// IPv6Enabled will filter ipv6 nameservers when not set to true.
|
||||||
IPv6Enabled bool
|
IPv6Enabled bool
|
||||||
// KeepHostServers can be set when it is required to still keep the
|
// KeepHostServers can be set when it is required to still keep the
|
||||||
// original resolv.conf content even when custom Nameserver/Searches/Options
|
// original resolv.conf nameservers even when explicit Nameservers
|
||||||
// are set. In this case they will be appended to the given values.
|
// are set. In this case they will be appended to the given values.
|
||||||
KeepHostServers bool
|
KeepHostServers bool
|
||||||
|
// KeepHostSearches can be set when it is required to still keep the
|
||||||
|
// original resolv.conf search domains even when explicit search domains
|
||||||
|
// are set in Searches.
|
||||||
|
KeepHostSearches bool
|
||||||
|
// KeepHostOptions can be set when it is required to still keep the
|
||||||
|
// original resolv.conf options even when explicit options are set in
|
||||||
|
// Options.
|
||||||
|
KeepHostOptions bool
|
||||||
// Nameservers is a list of nameservers the container should use,
|
// Nameservers is a list of nameservers the container should use,
|
||||||
// instead of the default ones from the host.
|
// instead of the default ones from the host. Set KeepHostServers
|
||||||
|
// in order to also keep the hosts resolv.conf nameservers.
|
||||||
Nameservers []string
|
Nameservers []string
|
||||||
// Searches is a list of dns search domains the container should use,
|
// Searches is a list of dns search domains the container should use,
|
||||||
// instead of the default ones from the host.
|
// instead of the default ones from the host. Set KeepHostSearches
|
||||||
|
// in order to also keep the hosts resolv.conf search domains.
|
||||||
Searches []string
|
Searches []string
|
||||||
// Options is a list of dns options the container should use,
|
// Options is a list of dns options the container should use,
|
||||||
// instead of the default ones from the host.
|
// instead of the default ones from the host. Set KeepHostOptions
|
||||||
|
// in order to also keep the hosts resolv.conf options.
|
||||||
Options []string
|
Options []string
|
||||||
|
|
||||||
// resolvConfPath is the path which should be used as base to get the dns
|
// resolvConfPath is the path which should be used as base to get the dns
|
||||||
|
@ -121,7 +132,8 @@ func unsetSearchDomainsIfNeeded(searches []string) []string {
|
||||||
// New creates a new resolv.conf file with the given params.
|
// New creates a new resolv.conf file with the given params.
|
||||||
func New(params *Params) error {
|
func New(params *Params) error {
|
||||||
// short path, if everything is given there is no need to actually read the hosts /etc/resolv.conf
|
// short path, if everything is given there is no need to actually read the hosts /etc/resolv.conf
|
||||||
if len(params.Nameservers) > 0 && len(params.Options) > 0 && len(params.Searches) > 0 && !params.KeepHostServers {
|
if len(params.Nameservers) > 0 && len(params.Options) > 0 && len(params.Searches) > 0 &&
|
||||||
|
!params.KeepHostServers && !params.KeepHostOptions && !params.KeepHostSearches {
|
||||||
return build(params.Path, params.Nameservers, unsetSearchDomainsIfNeeded(params.Searches), params.Options)
|
return build(params.Path, params.Nameservers, unsetSearchDomainsIfNeeded(params.Searches), params.Options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,12 +152,12 @@ func New(params *Params) error {
|
||||||
searches := unsetSearchDomainsIfNeeded(params.Searches)
|
searches := unsetSearchDomainsIfNeeded(params.Searches)
|
||||||
// if no params.Searches then use host ones
|
// if no params.Searches then use host ones
|
||||||
// otherwise make sure that they were no explicitly unset before adding host ones
|
// otherwise make sure that they were no explicitly unset before adding host ones
|
||||||
if len(params.Searches) == 0 || (params.KeepHostServers && len(searches) > 0) {
|
if len(params.Searches) == 0 || (params.KeepHostSearches && len(searches) > 0) {
|
||||||
searches = append(searches, getSearchDomains(content)...)
|
searches = append(searches, getSearchDomains(content)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
options := params.Options
|
options := params.Options
|
||||||
if len(options) == 0 || params.KeepHostServers {
|
if len(options) == 0 || params.KeepHostOptions {
|
||||||
options = append(options, getOptions(content)...)
|
options = append(options, getOptions(content)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ github.com/containers/buildah/pkg/sshagent
|
||||||
github.com/containers/buildah/pkg/util
|
github.com/containers/buildah/pkg/util
|
||||||
github.com/containers/buildah/pkg/volumes
|
github.com/containers/buildah/pkg/volumes
|
||||||
github.com/containers/buildah/util
|
github.com/containers/buildah/util
|
||||||
# github.com/containers/common v0.63.1-0.20250528122446-1a3b5ecec62f
|
# github.com/containers/common v0.63.1-0.20250602154905-5a4ca2d5d355
|
||||||
## explicit; go 1.23.3
|
## explicit; go 1.23.3
|
||||||
github.com/containers/common/internal
|
github.com/containers/common/internal
|
||||||
github.com/containers/common/internal/attributedstring
|
github.com/containers/common/internal/attributedstring
|
||||||
|
|
Loading…
Reference in New Issue