From 60a64d0fb1e3c8fb7e2c5ff30b68f995eb68ee36 Mon Sep 17 00:00:00 2001 From: criyle Date: Tue, 16 Apr 2024 10:47:48 +0000 Subject: [PATCH] container: add option to run init command after container initialization --- container/container_init_linux.go | 13 ++++++++++++- container/environment_linux.go | 5 +++++ container/protocol_linux.go | 1 + pkg/mount/mount_linux.go | 6 +++--- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/container/container_init_linux.go b/container/container_init_linux.go index df958d9..dc438d3 100644 --- a/container/container_init_linux.go +++ b/container/container_init_linux.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "os" + "os/exec" "os/signal" "path/filepath" "runtime" @@ -237,7 +238,17 @@ func initContainer(c containerConfig) error { if err := syscall.Sethostname([]byte(c.HostName)); err != nil { return err } - return os.Chdir(c.WorkDir) + if err := os.Chdir(c.WorkDir); err != nil { + return err + } + if len(c.InitCommand) > 0 { + cm := exec.Command(c.InitCommand[0], c.InitCommand[1:]...) + if output, err := cm.CombinedOutput(); err != nil { + os.Stderr.Write(output) + return err + } + } + return nil } func initFileSystem(c containerConfig) error { diff --git a/container/environment_linux.go b/container/environment_linux.go index 62e61e1..76c2d57 100644 --- a/container/environment_linux.go +++ b/container/environment_linux.go @@ -59,6 +59,10 @@ type Builder struct { // DomainName set container domainname (default: go-sandbox) DomainName string + // InitCommand defines command that runs after the initialization of the container + // to do additional setups (for example, loopback network) + InitCommand []string + // ContainerUID & ContainerGID set the container uid / gid mapping ContainerUID int ContainerGID int @@ -178,6 +182,7 @@ func (b *Builder) Build() (Environment, error) { Mounts: mounts, SymbolicLinks: links, MaskPaths: maskPaths, + InitCommand: b.InitCommand, Cred: b.CredGenerator != nil, ContainerUID: b.ContainerUID, ContainerGID: b.ContainerGID, diff --git a/container/protocol_linux.go b/container/protocol_linux.go index 7d889ce..b0057bb 100644 --- a/container/protocol_linux.go +++ b/container/protocol_linux.go @@ -60,6 +60,7 @@ type containerConfig struct { Mounts []mount.Mount SymbolicLinks []SymbolicLink MaskPaths []string + InitCommand []string ContainerUID int ContainerGID int diff --git a/pkg/mount/mount_linux.go b/pkg/mount/mount_linux.go index 1598bc1..7546952 100644 --- a/pkg/mount/mount_linux.go +++ b/pkg/mount/mount_linux.go @@ -10,16 +10,16 @@ import ( // Mount calls mount syscall func (m *Mount) Mount() error { if err := ensureMountTargetExists(m.Source, m.Target); err != nil { - return err + return fmt.Errorf("mkdir: %w", err) } if err := syscall.Mount(m.Source, m.Target, m.FsType, m.Flags, m.Data); err != nil { - return err + return fmt.Errorf("mount: %w", err) } // Read-only bind mount need to be remounted const bindRo = syscall.MS_BIND | syscall.MS_RDONLY if m.Flags&bindRo == bindRo { if err := syscall.Mount("", m.Target, m.FsType, m.Flags|syscall.MS_REMOUNT, m.Data); err != nil { - return err + return fmt.Errorf("remount: %w", err) } } return nil