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
}