package main import ( "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "time" ) const ( VPNNetworkName = "circus-vpnnet" ) type ChallengeContainer struct { Challenge *Challenge ContainerID string IP string } // Starts the container and returns its address and containerID if successful func (cc ChallengeContainer) startContainer() (address string, containerID string, err error) { // Set up our context and Docker CLI connection setupContext() setupDockerCLI() // Set up network err = setupNetwork() if err != nil { return "", "", err } // Create container resp, err := dockerCli.ContainerCreate(dockerCtx, &container.Config{ Image: cc.Challenge.Container, Env: []string{fmt.Sprintf("FLAG=%s", cc.Challenge.Flag)}, Tty: false, }, nil, &network.NetworkingConfig{ EndpointsConfig: map[string]*network.EndpointSettings{ VPNNetworkName: { NetworkID: vpnNetworkID, }, }, }, "") if err != nil { return "", "", err } // Start container err = dockerCli.ContainerStart(dockerCtx, resp.ID, types.ContainerStartOptions{}) if err != nil { return "", "", err } // Get IP Address of that container inspectJSON, err := dockerCli.ContainerInspect(dockerCtx, resp.ID) if err != nil { return "", "", err } // Return IP, Container ID and error return inspectJSON.NetworkSettings.Networks[VPNNetworkName].IPAddress, resp.ID,nil } // Stops the container with a timeout of one second func (cc ChallengeContainer) stopContainer() { timeout := time.Second dockerCli.ContainerStop(dockerCtx, cc.ContainerID, &timeout) }