diff --git a/README.md b/README.md index 9440da6..85cf9d8 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,8 @@ Flags: --boot-fs string Filesystem to use for the boot partition, ext4 or fat32 --boot-size uint Size of the boot partition in MB (default 100) --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 + --dns strings DNS servers to set in the generated image + --dns-search strings DNS search domains to set in the generated image --force Override output qcow2 image -h, --help help for convert --hostname string Hostname to set in the generated image (default "localhost") @@ -328,6 +330,8 @@ Flags: --boot-fs string Filesystem to use for the boot partition, ext4 or fat32 --boot-size uint Size of the boot partition in MB (default 100) --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 + --dns strings DNS servers to set in the generated image + --dns-search strings DNS search domains to set in the generated image --build-arg stringArray Set build-time variables -f, --file string Name of the Dockerfile --force Override output qcow2 image diff --git a/builder.go b/builder.go index fe15db5..df1a64b 100644 --- a/builder.go +++ b/builder.go @@ -84,10 +84,12 @@ type builder struct { cmdLineExtra string arch string - hostname string + hostname string + dns []string + dnsSearch []string } -func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, osRelease OSRelease, format string, cmdLineExtra string, splitBoot bool, bootFS BootFS, bootSize uint64, luksPassword string, bootLoader string, platform, hostname string) (Builder, error) { +func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, osRelease OSRelease, format string, cmdLineExtra string, splitBoot bool, bootFS BootFS, bootSize uint64, luksPassword string, bootLoader string, platform, hostname string, dns, dnsSearch []string) (Builder, error) { var arch string switch platform { case "linux/amd64": @@ -184,6 +186,9 @@ func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, if hostname == "" { hostname = "localhost" } + if len(dns) == 0 { + dns = []string{"8.8.8.8"} + } b := &builder{ osRelease: osRelease, config: config, @@ -201,6 +206,8 @@ func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, luksPassword: luksPassword, arch: arch, hostname: hostname, + dns: dns, + dnsSearch: dnsSearch, } if err := b.checkDependencies(); err != nil { return nil, err @@ -415,7 +422,7 @@ func (b *builder) setupRootFS(ctx context.Context) (err error) { if err := b.chWriteFile("/etc/fstab", fstab, perm); err != nil { return err } - if err := b.chWriteFileIfNotExist("/etc/resolv.conf", "nameserver 8.8.8.8", 0644); err != nil { + if err := b.chWriteFile("/etc/resolv.conf", b.resolvConf(), 0644); err != nil { return err } if err := b.chWriteFile("/etc/hostname", b.hostname+"\n", perm); err != nil { @@ -500,6 +507,21 @@ func (b *builder) isLuksEnabled() bool { return b.luksPassword != "" } +func (b *builder) resolvConf() string { + var sb strings.Builder + for _, v := range b.dns { + sb.WriteString("nameserver ") + sb.WriteString(v) + sb.WriteString("\n") + } + if len(b.dnsSearch) > 0 { + sb.WriteString("search ") + sb.WriteString(strings.Join(b.dnsSearch, " ")) + sb.WriteString("\n") + } + return sb.String() +} + func (b *builder) Close() error { return b.img.Close() } diff --git a/cmd/d2vm/build.go b/cmd/d2vm/build.go index 59e797f..af9f6d2 100644 --- a/cmd/d2vm/build.go +++ b/cmd/d2vm/build.go @@ -111,6 +111,8 @@ var ( d2vm.WithPlatform(platform), d2vm.WithPull(false), d2vm.WithHostname(hostname), + d2vm.WithDNS(dns), + d2vm.WithDNSSearch(dnsSearch), ); err != nil { return err } diff --git a/cmd/d2vm/convert.go b/cmd/d2vm/convert.go index b986ee5..dd8b543 100644 --- a/cmd/d2vm/convert.go +++ b/cmd/d2vm/convert.go @@ -92,6 +92,8 @@ var ( d2vm.WithPlatform(platform), d2vm.WithPull(pull), d2vm.WithHostname(hostname), + d2vm.WithDNS(dns), + d2vm.WithDNSSearch(dnsSearch), ); err != nil { return err } diff --git a/cmd/d2vm/flags.go b/cmd/d2vm/flags.go index 737b185..ea7edb6 100644 --- a/cmd/d2vm/flags.go +++ b/cmd/d2vm/flags.go @@ -45,7 +45,9 @@ var ( keepCache bool platform string - hostname string + hostname string + dns []string + dnsSearch []string ) func validateFlags() error { @@ -119,5 +121,7 @@ func buildFlags() *pflag.FlagSet { flags.StringVar(&platform, "platform", d2vm.Arch, "Platform to use for the container disk image, linux/arm64 and linux/arm64 are supported") flags.BoolVar(&pull, "pull", false, "Always pull docker image") flags.StringVar(&hostname, "hostname", "localhost", "Hostname to set in the generated image") + flags.StringSliceVar(&dns, "dns", []string{}, "DNS servers to set in the generated image") + flags.StringSliceVar(&dnsSearch, "dns-search", []string{}, "DNS search domains to set in the generated image") return flags } diff --git a/convert.go b/convert.go index 945c7fd..0d03551 100644 --- a/convert.go +++ b/convert.go @@ -88,7 +88,7 @@ func Convert(ctx context.Context, img string, opts ...ConvertOption) error { if format == "" { format = "raw" } - b, err := NewBuilder(ctx, tmpPath, imgUUID, "", o.size, r, format, o.cmdLineExtra, o.splitBoot, o.bootFS, o.bootSize, o.luksPassword, o.bootLoader, o.platform, o.hostname) + b, err := NewBuilder(ctx, tmpPath, imgUUID, "", o.size, r, format, o.cmdLineExtra, o.splitBoot, o.bootFS, o.bootSize, o.luksPassword, o.bootLoader, o.platform, o.hostname, o.dns, o.dnsSearch) if err != nil { return err } diff --git a/convert_options.go b/convert_options.go index f003687..afdc9ba 100644 --- a/convert_options.go +++ b/convert_options.go @@ -35,7 +35,9 @@ type convertOptions struct { platform string pull bool - hostname string + hostname string + dns []string + dnsSearch []string } func (o *convertOptions) hasGrubBIOS() bool { @@ -135,3 +137,15 @@ func WithHostname(hostname string) ConvertOption { o.hostname = hostname } } + +func WithDNS(dns []string) ConvertOption { + return func(o *convertOptions) { + o.dns = dns + } +} + +func WithDNSSearch(dnsSearch []string) ConvertOption { + return func(o *convertOptions) { + o.dnsSearch = dnsSearch + } +} diff --git a/docs/content/reference/d2vm_build.md b/docs/content/reference/d2vm_build.md index 4114f70..007214d 100644 --- a/docs/content/reference/d2vm_build.md +++ b/docs/content/reference/d2vm_build.md @@ -14,6 +14,8 @@ d2vm build [context directory] [flags] --boot-size uint Size of the boot partition in MB (default 100) --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 --build-arg stringArray Set build-time variables + --dns strings DNS servers to set in the generated image + --dns-search strings DNS search domains to set in the generated image -f, --file string Name of the Dockerfile --force Override output qcow2 image -h, --help help for build diff --git a/docs/content/reference/d2vm_convert.md b/docs/content/reference/d2vm_convert.md index 086c209..fcd260e 100644 --- a/docs/content/reference/d2vm_convert.md +++ b/docs/content/reference/d2vm_convert.md @@ -13,6 +13,8 @@ d2vm convert [docker image] [flags] --boot-fs string Filesystem to use for the boot partition, ext4 or fat32 --boot-size uint Size of the boot partition in MB (default 100) --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 + --dns strings DNS servers to set in the generated image + --dns-search strings DNS search domains to set in the generated image --force Override output qcow2 image -h, --help help for convert --hostname string Hostname to set in the generated image (default "localhost")