| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | //go:build freebsd
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package buildah | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | 	"unsafe" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/containers/buildah/bind" | 
					
						
							|  |  |  | 	"github.com/containers/buildah/chroot" | 
					
						
							|  |  |  | 	"github.com/containers/buildah/copier" | 
					
						
							|  |  |  | 	"github.com/containers/buildah/define" | 
					
						
							|  |  |  | 	"github.com/containers/buildah/internal" | 
					
						
							| 
									
										
										
										
											2023-10-11 14:44:20 +08:00
										 |  |  | 	"github.com/containers/buildah/internal/tmpdir" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"github.com/containers/buildah/pkg/jail" | 
					
						
							| 
									
										
										
										
											2023-06-28 17:36:33 +08:00
										 |  |  | 	"github.com/containers/buildah/pkg/overlay" | 
					
						
							| 
									
										
										
										
											2023-02-21 03:30:28 +08:00
										 |  |  | 	"github.com/containers/buildah/pkg/parse" | 
					
						
							| 
									
										
										
										
											2023-08-26 03:00:19 +08:00
										 |  |  | 	butil "github.com/containers/buildah/pkg/util" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"github.com/containers/buildah/util" | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 	"github.com/containers/common/libnetwork/etchosts" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"github.com/containers/common/libnetwork/resolvconf" | 
					
						
							|  |  |  | 	nettypes "github.com/containers/common/libnetwork/types" | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 	netUtil "github.com/containers/common/libnetwork/util" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"github.com/containers/common/pkg/config" | 
					
						
							|  |  |  | 	"github.com/containers/storage/pkg/idtools" | 
					
						
							| 
									
										
										
										
											2022-10-19 08:13:05 +08:00
										 |  |  | 	"github.com/containers/storage/pkg/lockfile" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"github.com/containers/storage/pkg/stringid" | 
					
						
							|  |  |  | 	"github.com/docker/go-units" | 
					
						
							|  |  |  | 	"github.com/opencontainers/runtime-spec/specs-go" | 
					
						
							|  |  |  | 	spec "github.com/opencontainers/runtime-spec/specs-go" | 
					
						
							|  |  |  | 	"github.com/opencontainers/runtime-tools/generate" | 
					
						
							|  |  |  | 	"github.com/sirupsen/logrus" | 
					
						
							| 
									
										
										
										
											2024-01-31 23:03:20 +08:00
										 |  |  | 	"golang.org/x/exp/slices" | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	"golang.org/x/sys/unix" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	P_PID             = 0 | 
					
						
							|  |  |  | 	P_PGID            = 2 | 
					
						
							|  |  |  | 	PROC_REAP_ACQUIRE = 2 | 
					
						
							|  |  |  | 	PROC_REAP_RELEASE = 3 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-16 00:50:07 +08:00
										 |  |  | // We dont want to remove destinations with /etc, /dev as
 | 
					
						
							|  |  |  | // rootfs already contains these files and unionfs will create
 | 
					
						
							|  |  |  | // a `whiteout` i.e `.wh` files on removal of overlapping
 | 
					
						
							|  |  |  | // files from these directories.  everything other than these
 | 
					
						
							|  |  |  | // will be cleaned up
 | 
					
						
							|  |  |  | var nonCleanablePrefixes = []string{ | 
					
						
							|  |  |  | 	"/etc", "/dev", | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-06-18 20:04:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | func procctl(idtype int, id int, cmd int, arg *byte) error { | 
					
						
							|  |  |  | 	_, _, e1 := unix.Syscall6( | 
					
						
							|  |  |  | 		unix.SYS_PROCCTL, uintptr(idtype), uintptr(id), | 
					
						
							|  |  |  | 		uintptr(cmd), uintptr(unsafe.Pointer(arg)), 0, 0) | 
					
						
							|  |  |  | 	if e1 != 0 { | 
					
						
							|  |  |  | 		return unix.Errno(e1) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func setChildProcess() error { | 
					
						
							|  |  |  | 	if err := procctl(P_PID, unix.Getpid(), PROC_REAP_ACQUIRE, nil); err != nil { | 
					
						
							|  |  |  | 		fmt.Fprintf(os.Stderr, "procctl(PROC_REAP_ACQUIRE): %v\n", err) | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (b *Builder) Run(command []string, options RunOptions) error { | 
					
						
							| 
									
										
										
										
											2023-10-11 14:44:20 +08:00
										 |  |  | 	p, err := os.MkdirTemp(tmpdir.GetTempDir(), define.Package) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// On some hosts like AH, /tmp is a symlink and we need an
 | 
					
						
							|  |  |  | 	// absolute path.
 | 
					
						
							|  |  |  | 	path, err := filepath.EvalSymlinks(p) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	logrus.Debugf("using %q to hold bundle data", path) | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if err2 := os.RemoveAll(path); err2 != nil { | 
					
						
							|  |  |  | 			logrus.Errorf("error removing %q: %v", path, err2) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	gp, err := generate.New("freebsd") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-09-18 18:36:08 +08:00
										 |  |  | 		return fmt.Errorf("generating new 'freebsd' runtime spec: %w", err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	g := &gp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isolation := options.Isolation | 
					
						
							|  |  |  | 	if isolation == IsolationDefault { | 
					
						
							|  |  |  | 		isolation = b.Isolation | 
					
						
							|  |  |  | 		if isolation == IsolationDefault { | 
					
						
							| 
									
										
										
										
											2023-02-21 03:30:28 +08:00
										 |  |  | 			isolation, err = parse.IsolationOption("") | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				logrus.Debugf("got %v while trying to determine default isolation, guessing OCI", err) | 
					
						
							|  |  |  | 				isolation = IsolationOCI | 
					
						
							|  |  |  | 			} else if isolation == IsolationDefault { | 
					
						
							|  |  |  | 				isolation = IsolationOCI | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := checkAndOverrideIsolationOptions(isolation, &options); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// hardwire the environment to match docker build to avoid subtle and hard-to-debug differences due to containers.conf
 | 
					
						
							|  |  |  | 	b.configureEnvironment(g, options, []string{"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if b.CommonBuildOpts == nil { | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 		return fmt.Errorf("invalid format on container you must recreate the container") | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := addCommonOptsToSpec(b.CommonBuildOpts, g); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-25 03:35:45 +08:00
										 |  |  | 	workDir := b.WorkDir() | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if options.WorkingDir != "" { | 
					
						
							|  |  |  | 		g.SetProcessCwd(options.WorkingDir) | 
					
						
							| 
									
										
										
										
											2024-10-25 03:35:45 +08:00
										 |  |  | 		workDir = options.WorkingDir | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} else if b.WorkDir() != "" { | 
					
						
							|  |  |  | 		g.SetProcessCwd(b.WorkDir()) | 
					
						
							| 
									
										
										
										
											2024-10-25 03:35:45 +08:00
										 |  |  | 		workDir = b.WorkDir() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if workDir == "" { | 
					
						
							|  |  |  | 		workDir = string(os.PathSeparator) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	mountPoint, err := b.Mount(b.MountLabel) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-09-18 18:36:08 +08:00
										 |  |  | 		return fmt.Errorf("mounting container %q: %w", b.ContainerID, err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if err := b.Unmount(); err != nil { | 
					
						
							|  |  |  | 			logrus.Errorf("error unmounting container: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 	g.SetRootPath(mountPoint) | 
					
						
							|  |  |  | 	if len(command) > 0 { | 
					
						
							|  |  |  | 		command = runLookupPath(g, command) | 
					
						
							|  |  |  | 		g.SetProcessArgs(command) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		g.SetProcessArgs(nil) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setupTerminal(g, options.Terminal, options.TerminalSize) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 	configureNetwork, networkString, err := b.configureNamespaces(g, &options) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	containerName := Package + "-" + filepath.Base(path) | 
					
						
							|  |  |  | 	if configureNetwork { | 
					
						
							| 
									
										
										
										
											2023-11-17 16:25:59 +08:00
										 |  |  | 		if jail.NeedVnetJail() { | 
					
						
							|  |  |  | 			g.AddAnnotation("org.freebsd.parentJail", containerName+"-vnet") | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			g.AddAnnotation("org.freebsd.jail.vnet", "new") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	homeDir, err := b.configureUIDGID(g, mountPoint, options) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Now grab the spec from the generator.  Set the generator to nil so that future contributors
 | 
					
						
							|  |  |  | 	// will quickly be able to tell that they're supposed to be modifying the spec directly from here.
 | 
					
						
							|  |  |  | 	spec := g.Config | 
					
						
							|  |  |  | 	g = nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Set the seccomp configuration using the specified profile name.  Some syscalls are
 | 
					
						
							|  |  |  | 	// allowed if certain capabilities are to be granted (example: CAP_SYS_CHROOT and chroot),
 | 
					
						
							|  |  |  | 	// so we sorted out the capabilities lists first.
 | 
					
						
							|  |  |  | 	if err = setupSeccomp(spec, b.CommonBuildOpts.SeccompProfilePath); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uid, gid := spec.Process.User.UID, spec.Process.User.GID | 
					
						
							|  |  |  | 	idPair := &idtools.IDPair{UID: int(uid), GID: int(gid)} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-16 00:50:07 +08:00
										 |  |  | 	mode := os.FileMode(0o755) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	coptions := copier.MkdirOptions{ | 
					
						
							|  |  |  | 		ChownNew: idPair, | 
					
						
							|  |  |  | 		ChmodNew: &mode, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := copier.Mkdir(mountPoint, filepath.Join(mountPoint, spec.Process.Cwd), coptions); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bindFiles := make(map[string]string) | 
					
						
							|  |  |  | 	volumes := b.Volumes() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Figure out who owns files that will appear to be owned by UID/GID 0 in the container.
 | 
					
						
							|  |  |  | 	rootUID, rootGID, err := util.GetHostRootIDs(spec) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	rootIDPair := &idtools.IDPair{UID: int(rootUID), GID: int(rootGID)} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-15 22:53:39 +08:00
										 |  |  | 	hostsFile := "" | 
					
						
							| 
									
										
										
										
											2024-01-31 23:03:20 +08:00
										 |  |  | 	if !options.NoHosts && !slices.Contains(volumes, config.DefaultHostsFile) && options.ConfigureNetwork != define.NetworkDisabled { | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 		hostsFile, err = b.createHostsFile(path, rootIDPair) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-03-15 22:53:39 +08:00
										 |  |  | 		bindFiles[config.DefaultHostsFile] = hostsFile | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Only add entries here if we do not have to setup network,
 | 
					
						
							|  |  |  | 		// if we do we have to do it much later after the network setup.
 | 
					
						
							|  |  |  | 		if !configureNetwork { | 
					
						
							|  |  |  | 			var entries etchosts.HostEntries | 
					
						
							|  |  |  | 			// add host entry for local ip when running in host network
 | 
					
						
							|  |  |  | 			if spec.Hostname != "" { | 
					
						
							|  |  |  | 				ip := netUtil.GetLocalIP() | 
					
						
							|  |  |  | 				if ip != "" { | 
					
						
							|  |  |  | 					entries = append(entries, etchosts.HostEntry{ | 
					
						
							|  |  |  | 						Names: []string{spec.Hostname}, | 
					
						
							|  |  |  | 						IP:    ip, | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-09-06 21:10:19 +08:00
										 |  |  | 			err = b.addHostsEntries(hostsFile, mountPoint, entries, nil, "") | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 	resolvFile := "" | 
					
						
							| 
									
										
										
										
											2024-01-31 23:03:20 +08:00
										 |  |  | 	if !slices.Contains(volumes, resolvconf.DefaultResolvConf) && options.ConfigureNetwork != define.NetworkDisabled && !(len(b.CommonBuildOpts.DNSServers) == 1 && strings.ToLower(b.CommonBuildOpts.DNSServers[0]) == "none") { | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 		resolvFile, err = b.createResolvConf(path, rootIDPair) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		bindFiles[resolvconf.DefaultResolvConf] = resolvFile | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Only add entries here if we do not have to do setup network,
 | 
					
						
							|  |  |  | 		// if we do we have to do it much later after the network setup.
 | 
					
						
							|  |  |  | 		if !configureNetwork { | 
					
						
							| 
									
										
										
										
											2024-08-20 15:19:42 +08:00
										 |  |  | 			err = b.addResolvConfEntries(resolvFile, nil, spec, false, true) | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	runMountInfo := runMountInfo{ | 
					
						
							| 
									
										
										
										
											2024-10-25 03:35:45 +08:00
										 |  |  | 		WorkDir:          workDir, | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		ContextDir:       options.ContextDir, | 
					
						
							|  |  |  | 		Secrets:          options.Secrets, | 
					
						
							|  |  |  | 		SSHSources:       options.SSHSources, | 
					
						
							|  |  |  | 		StageMountPoints: options.StageMountPoints, | 
					
						
							|  |  |  | 		SystemContext:    options.SystemContext, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-07 04:32:13 +08:00
										 |  |  | 	runArtifacts, err := b.setupMounts(mountPoint, spec, path, options.Mounts, bindFiles, volumes, options.CompatBuiltinVolumes, b.CommonBuildOpts.Volumes, options.RunMounts, runMountInfo) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-09-18 18:36:08 +08:00
										 |  |  | 		return fmt.Errorf("resolving mountpoints for container %q: %w", b.ContainerID, err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if runArtifacts.SSHAuthSock != "" { | 
					
						
							|  |  |  | 		sshenv := "SSH_AUTH_SOCK=" + runArtifacts.SSHAuthSock | 
					
						
							|  |  |  | 		spec.Process.Env = append(spec.Process.Env, sshenv) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// following run was called from `buildah run`
 | 
					
						
							|  |  |  | 	// and some images were mounted for this run
 | 
					
						
							|  |  |  | 	// add them to cleanup artifacts
 | 
					
						
							|  |  |  | 	if len(options.ExternalImageMounts) > 0 { | 
					
						
							|  |  |  | 		runArtifacts.MountedImages = append(runArtifacts.MountedImages, options.ExternalImageMounts...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							| 
									
										
										
										
											2024-11-07 06:22:49 +08:00
										 |  |  | 		if err := b.cleanupRunMounts(mountPoint, runArtifacts); err != nil { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 			options.Logger.Errorf("unable to cleanup run mounts %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	defer b.cleanupTempVolumes() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-17 16:25:59 +08:00
										 |  |  | 	// If we are creating a network, make the vnet here so that we can
 | 
					
						
							|  |  |  | 	// execute the OCI runtime inside it. For FreeBSD-13.3 and later, we can
 | 
					
						
							|  |  |  | 	// configure the container network settings from outside the jail, which
 | 
					
						
							|  |  |  | 	// removes the need for a separate jail to manage the vnet.
 | 
					
						
							|  |  |  | 	if configureNetwork && jail.NeedVnetJail() { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		mynetns := containerName + "-vnet" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		jconf := jail.NewConfig() | 
					
						
							|  |  |  | 		jconf.Set("name", mynetns) | 
					
						
							|  |  |  | 		jconf.Set("vnet", jail.NEW) | 
					
						
							|  |  |  | 		jconf.Set("children.max", 1) | 
					
						
							|  |  |  | 		jconf.Set("persist", true) | 
					
						
							|  |  |  | 		jconf.Set("enforce_statfs", 0) | 
					
						
							|  |  |  | 		jconf.Set("devfs_ruleset", 4) | 
					
						
							|  |  |  | 		jconf.Set("allow.raw_sockets", true) | 
					
						
							| 
									
										
										
										
											2022-08-05 15:03:44 +08:00
										 |  |  | 		jconf.Set("allow.chflags", true) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		jconf.Set("securelevel", -1) | 
					
						
							|  |  |  | 		netjail, err := jail.Create(jconf) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		defer func() { | 
					
						
							|  |  |  | 			jconf := jail.NewConfig() | 
					
						
							|  |  |  | 			jconf.Set("persist", false) | 
					
						
							|  |  |  | 			err2 := netjail.Set(jconf) | 
					
						
							|  |  |  | 			if err2 != nil { | 
					
						
							|  |  |  | 				logrus.Errorf("error releasing vnet jail %q: %v", mynetns, err2) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch isolation { | 
					
						
							|  |  |  | 	case IsolationOCI: | 
					
						
							|  |  |  | 		var moreCreateArgs []string | 
					
						
							|  |  |  | 		if options.NoPivot { | 
					
						
							|  |  |  | 			moreCreateArgs = []string{"--no-pivot"} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			moreCreateArgs = nil | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-03-16 01:04:08 +08:00
										 |  |  | 		err = b.runUsingRuntimeSubproc(isolation, options, configureNetwork, networkString, moreCreateArgs, spec, mountPoint, path, containerName, b.Container, hostsFile, resolvFile) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	case IsolationChroot: | 
					
						
							| 
									
										
										
										
											2024-12-11 03:58:58 +08:00
										 |  |  | 		err = chroot.RunUsingChroot(spec, path, homeDir, options.Stdin, options.Stdout, options.Stderr, options.NoPivot) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 		err = errors.New("don't know how to run this command") | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func addCommonOptsToSpec(commonOpts *define.CommonBuildOptions, g *generate.Generator) error { | 
					
						
							|  |  |  | 	defaultContainerConfig, err := config.Default() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 		return fmt.Errorf("failed to get container config: %w", err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// Other process resource limits
 | 
					
						
							| 
									
										
										
										
											2023-10-25 20:55:41 +08:00
										 |  |  | 	if err := addRlimits(commonOpts.Ulimit, g, defaultContainerConfig.Containers.DefaultUlimits.Get()); err != nil { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	logrus.Debugf("Resources: %#v", commonOpts) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 18:34:29 +08:00
										 |  |  | // setupSpecialMountSpecChanges creates special mounts for depending
 | 
					
						
							|  |  |  | // on the namespaces - nothing yet for freebsd
 | 
					
						
							|  |  |  | func setupSpecialMountSpecChanges(spec *spec.Spec, shmSize string) ([]specs.Mount, error) { | 
					
						
							|  |  |  | 	return spec.Mounts, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 05:55:59 +08:00
										 |  |  | // If this succeeded, the caller would be expected to, after the command which
 | 
					
						
							|  |  |  | // uses the mount exits, unmount the mounted filesystem and remove its
 | 
					
						
							|  |  |  | // mountpoint (if we provided the path to its mountpoint), and release the lock
 | 
					
						
							|  |  |  | // (if we took one).
 | 
					
						
							|  |  |  | func (b *Builder) getCacheMount(tokens []string, stageMountPoints map[string]internal.StageMountDetails, idMaps IDMaps, workDir, tmpDir string) (*specs.Mount, string, *lockfile.LockFile, error) { | 
					
						
							|  |  |  | 	return nil, "", nil, errors.New("cache mounts not supported on freebsd") | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 18:34:29 +08:00
										 |  |  | func (b *Builder) runSetupVolumeMounts(mountLabel string, volumeMounts []string, optionMounts []specs.Mount, idMaps IDMaps) (mounts []specs.Mount, Err error) { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	// Make sure the overlay directory is clean before running
 | 
					
						
							|  |  |  | 	_, err := b.store.ContainerDirectory(b.ContainerID) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-09-18 18:36:08 +08:00
										 |  |  | 		return nil, fmt.Errorf("looking up container directory for %s: %w", b.ContainerID, err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	parseMount := func(mountType, host, container string, options []string) (specs.Mount, error) { | 
					
						
							| 
									
										
										
										
											2023-06-28 17:36:33 +08:00
										 |  |  | 		var foundrw, foundro, foundO bool | 
					
						
							|  |  |  | 		var upperDir string | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		for _, opt := range options { | 
					
						
							|  |  |  | 			switch opt { | 
					
						
							|  |  |  | 			case "rw": | 
					
						
							|  |  |  | 				foundrw = true | 
					
						
							|  |  |  | 			case "ro": | 
					
						
							|  |  |  | 				foundro = true | 
					
						
							| 
									
										
										
										
											2023-06-28 17:36:33 +08:00
										 |  |  | 			case "O": | 
					
						
							|  |  |  | 				foundO = true | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if strings.HasPrefix(opt, "upperdir") { | 
					
						
							|  |  |  | 				splitOpt := strings.SplitN(opt, "=", 2) | 
					
						
							|  |  |  | 				if len(splitOpt) > 1 { | 
					
						
							|  |  |  | 					upperDir = splitOpt[1] | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if !foundrw && !foundro { | 
					
						
							|  |  |  | 			options = append(options, "rw") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if mountType == "bind" || mountType == "rbind" { | 
					
						
							|  |  |  | 			mountType = "nullfs" | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-06-28 17:36:33 +08:00
										 |  |  | 		if foundO { | 
					
						
							|  |  |  | 			containerDir, err := b.store.ContainerDirectory(b.ContainerID) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return specs.Mount{}, err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			contentDir, err := overlay.TempDir(containerDir, idMaps.rootUID, idMaps.rootGID) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return specs.Mount{}, fmt.Errorf("failed to create TempDir in the %s directory: %w", containerDir, err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			overlayOpts := overlay.Options{ | 
					
						
							|  |  |  | 				RootUID:                idMaps.rootUID, | 
					
						
							|  |  |  | 				RootGID:                idMaps.rootGID, | 
					
						
							|  |  |  | 				UpperDirOptionFragment: upperDir, | 
					
						
							|  |  |  | 				GraphOpts:              b.store.GraphOptions(), | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			overlayMount, err := overlay.MountWithOptions(contentDir, host, container, &overlayOpts) | 
					
						
							|  |  |  | 			if err == nil { | 
					
						
							|  |  |  | 				b.TempVolumes[contentDir] = true | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return overlayMount, err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		return specs.Mount{ | 
					
						
							|  |  |  | 			Destination: container, | 
					
						
							|  |  |  | 			Type:        mountType, | 
					
						
							|  |  |  | 			Source:      host, | 
					
						
							|  |  |  | 			Options:     options, | 
					
						
							|  |  |  | 		}, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Bind mount volumes specified for this particular Run() invocation
 | 
					
						
							|  |  |  | 	for _, i := range optionMounts { | 
					
						
							|  |  |  | 		logrus.Debugf("setting up mounted volume at %q", i.Destination) | 
					
						
							|  |  |  | 		mount, err := parseMount(i.Type, i.Source, i.Destination, i.Options) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		mounts = append(mounts, mount) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Bind mount volumes given by the user when the container was created
 | 
					
						
							|  |  |  | 	for _, i := range volumeMounts { | 
					
						
							|  |  |  | 		var options []string | 
					
						
							|  |  |  | 		spliti := strings.Split(i, ":") | 
					
						
							|  |  |  | 		if len(spliti) > 2 { | 
					
						
							|  |  |  | 			options = strings.Split(spliti[2], ",") | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-11-06 23:10:40 +08:00
										 |  |  | 		mount, err := parseMount("nullfs", spliti[0], spliti[1], options) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		mounts = append(mounts, mount) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return mounts, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func setupCapabilities(g *generate.Generator, defaultCapabilities, adds, drops []string) error { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 18:22:31 +08:00
										 |  |  | func (b *Builder) runConfigureNetwork(pid int, isolation define.Isolation, options RunOptions, networkString string, containerName string, hostnames []string) (func(), *netResult, error) { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	//if isolation == IsolationOCIRootless {
 | 
					
						
							|  |  |  | 	//return setupRootlessNetwork(pid)
 | 
					
						
							|  |  |  | 	//}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 	var configureNetworks []string | 
					
						
							|  |  |  | 	if len(networkString) > 0 { | 
					
						
							|  |  |  | 		configureNetworks = strings.Split(networkString, ",") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if len(configureNetworks) == 0 { | 
					
						
							|  |  |  | 		configureNetworks = []string{b.NetworkInterface.DefaultNetworkName()} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	logrus.Debugf("configureNetworks: %v", configureNetworks) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-17 16:25:59 +08:00
										 |  |  | 	var mynetns string | 
					
						
							|  |  |  | 	if jail.NeedVnetJail() { | 
					
						
							|  |  |  | 		mynetns = containerName + "-vnet" | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		mynetns = containerName | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	networks := make(map[string]nettypes.PerNetworkOptions, len(configureNetworks)) | 
					
						
							|  |  |  | 	for i, network := range configureNetworks { | 
					
						
							|  |  |  | 		networks[network] = nettypes.PerNetworkOptions{ | 
					
						
							|  |  |  | 			InterfaceName: fmt.Sprintf("eth%d", i), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	opts := nettypes.NetworkOptions{ | 
					
						
							|  |  |  | 		ContainerID:   containerName, | 
					
						
							|  |  |  | 		ContainerName: containerName, | 
					
						
							|  |  |  | 		Networks:      networks, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-03-18 18:22:31 +08:00
										 |  |  | 	netStatus, err := b.NetworkInterface.Setup(mynetns, nettypes.SetupOptions{NetworkOptions: opts}) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2022-06-15 20:18:28 +08:00
										 |  |  | 		return nil, nil, err | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 18:22:31 +08:00
										 |  |  | 	teardown := func() { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		err := b.NetworkInterface.Teardown(mynetns, nettypes.TeardownOptions{NetworkOptions: opts}) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			logrus.Errorf("failed to cleanup network: %v", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 18:22:31 +08:00
										 |  |  | 	return teardown, netStatusToNetResult(netStatus, hostnames), nil | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | func setupNamespaces(logger *logrus.Logger, g *generate.Generator, namespaceOptions define.NamespaceOptions, idmapOptions define.IDMappingOptions, policy define.NetworkConfigurationPolicy) (configureNetwork bool, networkString string, configureUTS bool, err error) { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	// Set namespace options in the container configuration.
 | 
					
						
							|  |  |  | 	for _, namespaceOption := range namespaceOptions { | 
					
						
							|  |  |  | 		switch namespaceOption.Name { | 
					
						
							|  |  |  | 		case string(specs.NetworkNamespace): | 
					
						
							|  |  |  | 			configureNetwork = false | 
					
						
							|  |  |  | 			if !namespaceOption.Host && (namespaceOption.Path == "" || !filepath.IsAbs(namespaceOption.Path)) { | 
					
						
							|  |  |  | 				if namespaceOption.Path != "" && !filepath.IsAbs(namespaceOption.Path) { | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 					networkString = namespaceOption.Path | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 					namespaceOption.Path = "" | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				configureNetwork = (policy != define.NetworkDisabled) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case string(specs.UTSNamespace): | 
					
						
							|  |  |  | 			configureUTS = false | 
					
						
							|  |  |  | 			if !namespaceOption.Host && namespaceOption.Path == "" { | 
					
						
							|  |  |  | 				configureUTS = true | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// TODO: re-visit this when there is consensus on a
 | 
					
						
							|  |  |  | 		// FreeBSD runtime-spec. FreeBSD jails have rough
 | 
					
						
							|  |  |  | 		// equivalents for UTS and and network namespaces.
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 	return configureNetwork, networkString, configureUTS, nil | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | func (b *Builder) configureNamespaces(g *generate.Generator, options *RunOptions) (bool, string, error) { | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	defaultNamespaceOptions, err := DefaultNamespaceOptions() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 		return false, "", err | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	namespaceOptions := defaultNamespaceOptions | 
					
						
							|  |  |  | 	namespaceOptions.AddOrReplace(b.NamespaceOptions...) | 
					
						
							|  |  |  | 	namespaceOptions.AddOrReplace(options.NamespaceOptions...) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	networkPolicy := options.ConfigureNetwork | 
					
						
							| 
									
										
										
										
											2024-08-16 00:50:07 +08:00
										 |  |  | 	// Nothing was specified explicitly so network policy should be inherited from builder
 | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if networkPolicy == NetworkDefault { | 
					
						
							|  |  |  | 		networkPolicy = b.ConfigureNetwork | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// If builder policy was NetworkDisabled and
 | 
					
						
							|  |  |  | 		// we want to disable network for this run.
 | 
					
						
							|  |  |  | 		// reset options.ConfigureNetwork to NetworkDisabled
 | 
					
						
							|  |  |  | 		// since it will be treated as source of truth later.
 | 
					
						
							|  |  |  | 		if networkPolicy == NetworkDisabled { | 
					
						
							|  |  |  | 			options.ConfigureNetwork = networkPolicy | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 	configureNetwork, networkString, configureUTS, err := setupNamespaces(options.Logger, g, namespaceOptions, b.IDMappingOptions, networkPolicy) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 		return false, "", err | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if configureUTS { | 
					
						
							|  |  |  | 		if options.Hostname != "" { | 
					
						
							|  |  |  | 			g.SetHostname(options.Hostname) | 
					
						
							|  |  |  | 		} else if b.Hostname() != "" { | 
					
						
							|  |  |  | 			g.SetHostname(b.Hostname()) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			g.SetHostname(stringid.TruncateID(b.ContainerID)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		g.SetHostname("") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	found := false | 
					
						
							|  |  |  | 	spec := g.Config | 
					
						
							|  |  |  | 	for i := range spec.Process.Env { | 
					
						
							|  |  |  | 		if strings.HasPrefix(spec.Process.Env[i], "HOSTNAME=") { | 
					
						
							|  |  |  | 			found = true | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !found { | 
					
						
							|  |  |  | 		spec.Process.Env = append(spec.Process.Env, fmt.Sprintf("HOSTNAME=%s", spec.Hostname)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-22 21:31:32 +08:00
										 |  |  | 	return configureNetwork, networkString, nil | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func runSetupBoundFiles(bundlePath string, bindFiles map[string]string) (mounts []specs.Mount) { | 
					
						
							|  |  |  | 	for dest, src := range bindFiles { | 
					
						
							|  |  |  | 		options := []string{} | 
					
						
							|  |  |  | 		if strings.HasPrefix(src, bundlePath) { | 
					
						
							|  |  |  | 			options = append(options, bind.NoBindOption) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		mounts = append(mounts, specs.Mount{ | 
					
						
							|  |  |  | 			Source:      src, | 
					
						
							|  |  |  | 			Destination: dest, | 
					
						
							|  |  |  | 			Type:        "nullfs", | 
					
						
							|  |  |  | 			Options:     options, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return mounts | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func addRlimits(ulimit []string, g *generate.Generator, defaultUlimits []string) error { | 
					
						
							|  |  |  | 	var ( | 
					
						
							|  |  |  | 		ul  *units.Ulimit | 
					
						
							|  |  |  | 		err error | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ulimit = append(defaultUlimits, ulimit...) | 
					
						
							|  |  |  | 	for _, u := range ulimit { | 
					
						
							| 
									
										
										
										
											2023-08-26 03:00:19 +08:00
										 |  |  | 		if ul, err = butil.ParseUlimit(u); err != nil { | 
					
						
							| 
									
										
										
										
											2022-07-08 22:25:31 +08:00
										 |  |  | 			return fmt.Errorf("ulimit option %q requires name=SOFT:HARD, failed to be parsed: %w", u, err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		g.AddProcessRlimits("RLIMIT_"+strings.ToUpper(ul.Name), uint64(ul.Hard), uint64(ul.Soft)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create pipes to use for relaying stdio.
 | 
					
						
							|  |  |  | func runMakeStdioPipe(uid, gid int) ([][]int, error) { | 
					
						
							|  |  |  | 	stdioPipe := make([][]int, 3) | 
					
						
							|  |  |  | 	for i := range stdioPipe { | 
					
						
							|  |  |  | 		stdioPipe[i] = make([]int, 2) | 
					
						
							|  |  |  | 		if err := unix.Pipe(stdioPipe[i]); err != nil { | 
					
						
							| 
									
										
										
										
											2022-09-18 18:36:08 +08:00
										 |  |  | 			return nil, fmt.Errorf("creating pipe for container FD %d: %w", i, err) | 
					
						
							| 
									
										
										
										
											2022-04-21 22:15:40 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return stdioPipe, nil | 
					
						
							|  |  |  | } |