From f799dc4891b172991ea43382cad241120c740901 Mon Sep 17 00:00:00 2001 From: Adphi Date: Wed, 21 Jan 2026 17:11:38 +0100 Subject: [PATCH] feat: add `--hostname` flag to customize the vm hostname Signed-off-by: Adphi --- README.md | 2 ++ builder.go | 10 ++++++++-- cmd/d2vm/build.go | 1 + cmd/d2vm/convert.go | 1 + cmd/d2vm/flags.go | 3 +++ convert.go | 2 +- convert_options.go | 8 ++++++++ docs/content/reference/d2vm_build.md | 1 + docs/content/reference/d2vm_convert.md | 1 + 9 files changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 703c284..9440da6 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,7 @@ Flags: --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 --force Override output qcow2 image -h, --help help for convert + --hostname string Hostname to set in the generated image (default "localhost") --keep-cache Keep the images after the build --luks-password string Password to use for the LUKS encrypted root partition. If not set, the root partition will not be encrypted --network-manager string Network manager to use for the image: none, netplan, ifupdown @@ -331,6 +332,7 @@ Flags: -f, --file string Name of the Dockerfile --force Override output qcow2 image -h, --help help for build + --hostname string Hostname to set in the generated image (default "localhost") --keep-cache Keep the images after the build --luks-password string Password to use for the LUKS encrypted root partition. If not set, the root partition will not be encrypted --network-manager string Network manager to use for the image: none, netplan, ifupdown diff --git a/builder.go b/builder.go index 04d89aa..fe15db5 100644 --- a/builder.go +++ b/builder.go @@ -83,9 +83,11 @@ type builder struct { cmdLineExtra string arch string + + hostname 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 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) (Builder, error) { var arch string switch platform { case "linux/amd64": @@ -179,6 +181,9 @@ func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, // logrus.Warnf("%s is smaller than rootfs size, using %s", datasize.ByteSize(size), s) // size = int64(s) // } + if hostname == "" { + hostname = "localhost" + } b := &builder{ osRelease: osRelease, config: config, @@ -195,6 +200,7 @@ func NewBuilder(ctx context.Context, workdir, imgTag, disk string, size uint64, bootFS: bootFS, luksPassword: luksPassword, arch: arch, + hostname: hostname, } if err := b.checkDependencies(); err != nil { return nil, err @@ -412,7 +418,7 @@ func (b *builder) setupRootFS(ctx context.Context) (err error) { if err := b.chWriteFileIfNotExist("/etc/resolv.conf", "nameserver 8.8.8.8", 0644); err != nil { return err } - if err := b.chWriteFileIfNotExist("/etc/hostname", "localhost", perm); err != nil { + if err := b.chWriteFile("/etc/hostname", b.hostname+"\n", perm); err != nil { return err } if err := b.chWriteFileIfNotExist("/etc/hosts", hosts, perm); err != nil { diff --git a/cmd/d2vm/build.go b/cmd/d2vm/build.go index 3d9f97e..59e797f 100644 --- a/cmd/d2vm/build.go +++ b/cmd/d2vm/build.go @@ -110,6 +110,7 @@ var ( d2vm.WithKeepCache(keepCache), d2vm.WithPlatform(platform), d2vm.WithPull(false), + d2vm.WithHostname(hostname), ); err != nil { return err } diff --git a/cmd/d2vm/convert.go b/cmd/d2vm/convert.go index 6aea732..b986ee5 100644 --- a/cmd/d2vm/convert.go +++ b/cmd/d2vm/convert.go @@ -91,6 +91,7 @@ var ( d2vm.WithKeepCache(keepCache), d2vm.WithPlatform(platform), d2vm.WithPull(pull), + d2vm.WithHostname(hostname), ); err != nil { return err } diff --git a/cmd/d2vm/flags.go b/cmd/d2vm/flags.go index b97abbd..737b185 100644 --- a/cmd/d2vm/flags.go +++ b/cmd/d2vm/flags.go @@ -44,6 +44,8 @@ var ( keepCache bool platform string + + hostname string ) func validateFlags() error { @@ -116,5 +118,6 @@ func buildFlags() *pflag.FlagSet { flags.BoolVar(&keepCache, "keep-cache", false, "Keep the images after the build") 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") return flags } diff --git a/convert.go b/convert.go index 769de35..945c7fd 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) + 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) if err != nil { return err } diff --git a/convert_options.go b/convert_options.go index 47efd13..f003687 100644 --- a/convert_options.go +++ b/convert_options.go @@ -34,6 +34,8 @@ type convertOptions struct { keepCache bool platform string pull bool + + hostname string } func (o *convertOptions) hasGrubBIOS() bool { @@ -127,3 +129,9 @@ func WithPull(b bool) ConvertOption { o.pull = b } } + +func WithHostname(hostname string) ConvertOption { + return func(o *convertOptions) { + o.hostname = hostname + } +} diff --git a/docs/content/reference/d2vm_build.md b/docs/content/reference/d2vm_build.md index 110eab7..4114f70 100644 --- a/docs/content/reference/d2vm_build.md +++ b/docs/content/reference/d2vm_build.md @@ -17,6 +17,7 @@ d2vm build [context directory] [flags] -f, --file string Name of the Dockerfile --force Override output qcow2 image -h, --help help for build + --hostname string Hostname to set in the generated image (default "localhost") --keep-cache Keep the images after the build --luks-password string Password to use for the LUKS encrypted root partition. If not set, the root partition will not be encrypted --network-manager string Network manager to use for the image: none, netplan, ifupdown diff --git a/docs/content/reference/d2vm_convert.md b/docs/content/reference/d2vm_convert.md index e143acb..086c209 100644 --- a/docs/content/reference/d2vm_convert.md +++ b/docs/content/reference/d2vm_convert.md @@ -15,6 +15,7 @@ d2vm convert [docker image] [flags] --bootloader string Bootloader to use: syslinux, grub, grub-bios, grub-efi, defaults to syslinux on amd64 and grub-efi on arm64 --force Override output qcow2 image -h, --help help for convert + --hostname string Hostname to set in the generated image (default "localhost") --keep-cache Keep the images after the build --luks-password string Password to use for the LUKS encrypted root partition. If not set, the root partition will not be encrypted --network-manager string Network manager to use for the image: none, netplan, ifupdown