diff --git a/cmd/start.go b/cmd/start.go index 526a089c7..45231b66c 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -37,6 +37,7 @@ Run 'colima template' to set the default configurations or 'colima start --edit' " colima start --cpu 4 --memory 8 --disk 100\n" + " colima start --arch aarch64\n" + " colima start --dns 1.1.1.1 --dns 8.8.8.8\n" + + " colima start --dns-host example.com=1.2.3.4\n" + " colima start --kubernetes --kubernetes-disable=coredns,servicelb,traefik,local-storage,metrics-server", Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { @@ -106,6 +107,7 @@ var startCmdArgs struct { Edit bool Editor string ActivateRuntime bool + DNSHosts []string } } @@ -168,7 +170,25 @@ func init() { startCmd.Flags().StringToStringVar(&startCmdArgs.Env, "env", nil, "environment variables for the VM") // dns - startCmd.Flags().IPSliceVarP(&startCmdArgs.Network.DNS, "dns", "n", nil, "DNS servers for the VM") + startCmd.Flags().IPSliceVarP(&startCmdArgs.Network.DNSResolvers, "dns", "n", nil, "DNSResolvers servers for the VM") + startCmd.Flags().StringSliceVarP(&startCmdArgs.Flags.DNSHosts, "dns-host", "", nil, "Custom DNS names to provide to resolver") +} + +func dnsHostsFromFlag(hosts []string) map[string]string { + mapping := make(map[string]string) + + for _, h := range hosts { + str := strings.SplitN(h, "=", 2) + if len(str) != 2 { + log.Warnf("unable to parse custom dns host: %v, skipping\n", h) + continue + } + src := str[0] + target := str[1] + + mapping[src] = target + } + return mapping } // mountsFromFlag converts mounts from cli flag format to config file format @@ -210,6 +230,7 @@ func prepareConfig(cmd *cobra.Command) { // convert cli to config file format startCmdArgs.Mounts = mountsFromFlag(startCmdArgs.Flags.Mounts) + startCmdArgs.Network.DNSHosts = dnsHostsFromFlag(startCmdArgs.Flags.DNSHosts) startCmdArgs.ActivateRuntime = &startCmdArgs.Flags.ActivateRuntime // handle macOS virtualization.framework transition @@ -280,7 +301,10 @@ func prepareConfig(cmd *cobra.Command) { startCmdArgs.SSHConfig = current.SSHConfig } if !cmd.Flag("dns").Changed { - startCmdArgs.Network.DNS = current.Network.DNS + startCmdArgs.Network.DNSResolvers = current.Network.DNSResolvers + } + if !cmd.Flag("dns-host").Changed { + startCmdArgs.Network.DNSHosts = current.Network.DNSHosts } if !cmd.Flag("env").Changed { startCmdArgs.Env = current.Env diff --git a/config/config.go b/config/config.go index 7f32604c0..612c123a2 100644 --- a/config/config.go +++ b/config/config.go @@ -115,8 +115,9 @@ type Kubernetes struct { // Network is VM network configuration type Network struct { - Address bool `yaml:"address"` - DNS []net.IP `yaml:"dns"` + Address bool `yaml:"address"` + DNSResolvers []net.IP `yaml:"dns"` + DNSHosts map[string]string `yaml:"dns_hosts"` } // Mount is volume mount diff --git a/embedded/defaults/colima.yaml b/embedded/defaults/colima.yaml index c2bf83022..5739d48dd 100644 --- a/embedded/defaults/colima.yaml +++ b/embedded/defaults/colima.yaml @@ -61,6 +61,12 @@ network: # Default: [] dns: [] + # DNS hostnames to resolve to custom targets using the internal Lima resolver. + # This setting has no effect if a custom DNS resolver list is supplied above. + # It does not configure the /etc/hosts files of any machine or container. + dns_hosts: + host.docker.internal: host.lima.internal + # ===================================================================== # # ADVANCED CONFIGURATION # ===================================================================== # @@ -168,4 +174,4 @@ mounts: [] # ANOTHER_KEY: another value # # Default: {} -env: {} +env: {} \ No newline at end of file diff --git a/environment/vm/lima/yaml.go b/environment/vm/lima/yaml.go index 68ceccc1d..db3fa4c90 100644 --- a/environment/vm/lima/yaml.go +++ b/environment/vm/lima/yaml.go @@ -67,10 +67,15 @@ func newConf(ctx context.Context, conf config.Config) (l Config, err error) { l.SSH = SSH{LocalPort: 0, LoadDotSSHPubKeys: false, ForwardAgent: conf.ForwardAgent} l.Containerd = Containerd{System: false, User: false} - l.DNS = conf.Network.DNS - l.HostResolver.Enabled = len(l.DNS) == 0 - l.HostResolver.Hosts = map[string]string{ - "host.docker.internal": "host.lima.internal", + l.DNS = conf.Network.DNSResolvers + l.HostResolver.Enabled = len(conf.Network.DNSResolvers) == 0 + l.HostResolver.Hosts = conf.Network.DNSHosts + if l.HostResolver.Hosts == nil { + l.HostResolver.Hosts = make(map[string]string) + } + + if _, ok := l.HostResolver.Hosts["host.docker.internal"]; !ok { + l.HostResolver.Hosts["host.docker.internal"] = "host.lima.internal" } l.Env = conf.Env diff --git a/util/yamlutil/yaml_test.go b/util/yamlutil/yaml_test.go index 95f5c74bb..799ad619b 100644 --- a/util/yamlutil/yaml_test.go +++ b/util/yamlutil/yaml_test.go @@ -12,7 +12,7 @@ import ( func Test_encode_Docker(t *testing.T) { conf := config.Config{ Docker: map[string]any{"insecure-registries": []any{"127.0.0.1"}}, - Network: config.Network{DNS: []net.IP{net.ParseIP("1.1.1.1")}}, + Network: config.Network{DNSResolvers: []net.IP{net.ParseIP("1.1.1.1")}}, Kubernetes: config.Kubernetes{Disable: []string{"treafik"}}, }