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
}