// OneShot runs a container, expecting it to successfully run to completion // and die, after which it is removed. Not goroutine safe: only one OneShot // can be running at once. // Adds the same binds as the cluster containers (certs, binary, etc). func (l *LocalCluster) OneShot( ctx context.Context, ref string, ipo types.ImagePullOptions, containerConfig container.Config, hostConfig container.HostConfig, name string, ) error { if err := pullImage(ctx, l, ref, ipo); err != nil { return err } hostConfig.VolumesFrom = []string{l.vols.id} container, err := createContainer(ctx, l, containerConfig, hostConfig, name) if err != nil { return err } l.oneshot = container defer func() { if err := l.oneshot.Remove(ctx); err != nil { log.Errorf(ctx, "ContainerRemove: %s", err) } l.oneshot = nil }() if err := l.oneshot.Start(ctx); err != nil { return err } if err := l.oneshot.Wait(ctx); err != nil { return err } return nil }
// createRoach creates the docker container for a testNode. It may be called in // parallel to start many nodes at once, and thus should remain threadsafe. func (l *LocalCluster) createRoach( ctx context.Context, node *testNode, vols *Container, env []string, cmd ...string, ) { l.panicOnStop() hostConfig := container.HostConfig{ PublishAllPorts: true, NetworkMode: container.NetworkMode(l.networkID), Privileged: l.privileged, } if vols != nil { hostConfig.VolumesFrom = append(hostConfig.VolumesFrom, vols.id) } var hostname string if node.index >= 0 { hostname = fmt.Sprintf("roach-%s-%d", l.clusterID, node.index) } log.Infof(ctx, "creating docker container with name: %s", hostname) var entrypoint []string if *cockroachImage == builderImageFull { entrypoint = append(entrypoint, CockroachBinaryInContainer) } else if *cockroachEntry != "" { entrypoint = append(entrypoint, *cockroachEntry) } var err error node.Container, err = createContainer( ctx, l, container.Config{ Hostname: hostname, Image: *cockroachImage, ExposedPorts: map[nat.Port]struct{}{ DefaultTCP: {}, defaultHTTP: {}, }, Entrypoint: entrypoint, Env: env, Cmd: cmd, Labels: map[string]string{ // Allow for `docker ps --filter label=Hostname=roach-<id>-0` or `--filter label=Roach`. "Hostname": hostname, "Roach": "", "Acceptance-cluster-id": l.clusterID, }, }, hostConfig, node.nodeStr, ) maybePanic(err) }