func NewUnstartedElasticAgentContainer()

in systemtest/containers.go [159:225]


func NewUnstartedElasticAgentContainer(opts ContainerConfig) (*ElasticAgentContainer, error) {
	// Create a testcontainer.ContainerRequest to run Elastic Agent.
	// We pull some configuration from the Kibana docker-compose service,
	// such as the Docker network to use.
	if opts.Arch == "" {
		opts.Arch = runtime.GOARCH
	}
	if opts.BaseImage == "" {
		opts.BaseImage = ElasticAgentImage
	}

	docker, err := client.NewClientWithOpts(client.FromEnv)
	if err != nil {
		return nil, err
	}
	defer docker.Close()
	docker.NegotiateAPIVersion(context.Background())

	var networks []string
	if opts.BaseImageVersion == "" {
		fleetServerContainer, err := stackContainerInfo(context.Background(), docker, "fleet-server")
		if err != nil {
			return nil, err
		}
		fleetServerContainerDetails, err := docker.ContainerInspect(context.Background(), fleetServerContainer.ID)
		if err != nil {
			return nil, err
		}

		for network := range fleetServerContainerDetails.NetworkSettings.Networks {
			networks = append(networks, network)
		}

		// Use the same elastic-agent image as used for fleet-server.
		opts.BaseImageVersion = fleetServerContainer.Image[strings.LastIndex(fleetServerContainer.Image, ":")+1:]
	}

	// Build a custom elastic-agent image with a locally built apm-server binary injected.
	agentImage := fmt.Sprintf("elastic-agent-systemtest:%s", opts.BaseImageVersion)
	if err := BuildElasticAgentImage(context.Background(),
		docker, opts.Arch,
		fmt.Sprintf("%s:%s", opts.BaseImage, opts.BaseImageVersion),
		agentImage,
	); err != nil {
		return nil, err
	}

	agentImageDetails, _, err := docker.ImageInspectWithRaw(context.Background(), agentImage)
	if err != nil {
		return nil, err
	}
	vcsRef := agentImageDetails.Config.Labels["org.label-schema.vcs-ref"]

	req := testcontainers.ContainerRequest{
		Name:       opts.Name,
		Image:      agentImage,
		AutoRemove: true,
		Networks:   networks,
		SkipReaper: true, // we use our own reaping logic
	}
	return &ElasticAgentContainer{
		vcsRef:  vcsRef,
		request: req,
		exited:  make(chan struct{}),
		Reap:    true,
	}, nil
}