in executors/docker/executor_docker.go [1151:1195]
func (s *executor) runServiceHealthCheckContainer(service *types.Container, timeout time.Duration) error {
waitImage, err := s.getPrebuiltImage()
if err != nil {
return err
}
containerName := service.Names[0] + "-wait-for-service"
config := &container.Config{
Cmd: []string{"gitlab-runner-service"},
Image: waitImage.ID,
Labels: s.getLabels("wait", "wait="+service.ID),
}
hostConfig := &container.HostConfig{
RestartPolicy: neverRestartPolicy,
Links: []string{service.Names[0] + ":" + service.Names[0]},
NetworkMode: container.NetworkMode(s.Config.Docker.NetworkMode),
LogConfig: container.LogConfig{
Type: "json-file",
},
}
s.Debugln("Waiting for service container", containerName, "to be up and running...")
resp, err := s.client.ContainerCreate(s.Context, config, hostConfig, nil, containerName)
if err != nil {
return err
}
defer s.removeContainer(s.Context, resp.ID)
err = s.client.ContainerStart(s.Context, resp.ID, types.ContainerStartOptions{})
if err != nil {
return err
}
waitResult := make(chan error, 1)
go func() {
waitResult <- s.waitForContainer(resp.ID)
}()
// these are warnings and they don't make the build fail
select {
case err := <-waitResult:
return err
case <-time.After(timeout):
return fmt.Errorf("service %v did timeout", containerName)
}
}