func()

in systemtest/containers.go [270:331]


func (c *ElasticAgentContainer) Start() error {
	ctx, cancel := context.WithTimeout(context.Background(), startContainersTimeout)
	defer cancel()

	// Update request from user-definable fields.
	if c.FleetEnrollmentToken != "" {
		c.request.Env["FLEET_ENROLL"] = "1"
		c.request.Env["FLEET_ENROLLMENT_TOKEN"] = c.FleetEnrollmentToken
	}
	c.request.ExposedPorts = c.ExposedPorts
	c.request.WaitingFor = c.WaitingFor
	c.request.SkipReaper = !c.Reap

	container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
		ContainerRequest: c.request,
	})
	if err != nil {
		return err
	}
	c.container = container

	// Start a goroutine to read logs, and signal when the container process has exited.
	if c.Stdout != nil || c.Stderr != nil {
		go func() {
			defer close(c.exited)
			defer cancel()
			stdout, stderr := c.Stdout, c.Stderr
			if stdout == nil {
				stdout = io.Discard
			}
			if stderr == nil {
				stderr = io.Discard
			}
			_ = c.copyLogs(stdout, stderr)
		}()
	}

	if err := container.Start(ctx); err != nil {
		if err != context.Canceled {
			return fmt.Errorf("failed to start container: %w", err)
		}
		return errors.New("failed to start container")
	}

	if len(c.request.ExposedPorts) > 0 {
		hostIP, err := container.Host(ctx)
		if err != nil {
			return err
		}
		c.Addrs = make(map[string]string)
		for _, exposedPort := range c.request.ExposedPorts {
			mappedPort, err := container.MappedPort(ctx, nat.Port(exposedPort))
			if err != nil {
				return err
			}
			c.Addrs[exposedPort] = net.JoinHostPort(hostIP, mappedPort.Port())
		}
	}

	c.container = container
	return nil
}