use of com.github.dockerjava.api.command.CreateContainerCmd in project elastest-torm by elastest.
the class DockerService method startAndWaitContainer.
public void startAndWaitContainer(DockerContainer dockerContainer) throws InterruptedException {
String containerName = dockerContainer.getContainerName();
String imageId = dockerContainer.getImageId();
if (!isRunningContainer(containerName)) {
pullImageIfNecessary(imageId);
try (CreateContainerCmd createContainer = dockerClient.createContainerCmd(imageId).withName(containerName)) {
Optional<String> network = dockerContainer.getNetwork();
if (network.isPresent()) {
log.trace("Using network: {}", network.get());
createContainer.withNetworkMode(network.get());
}
Optional<List<PortBinding>> portBindings = dockerContainer.getPortBindings();
if (portBindings.isPresent()) {
log.trace("Using port binding: {}", portBindings.get());
createContainer.withPortBindings(portBindings.get());
}
Optional<List<Volume>> volumes = dockerContainer.getVolumes();
if (volumes.isPresent()) {
log.trace("Using volumes: {}", volumes.get());
createContainer.withVolumes(volumes.get());
}
Optional<List<Bind>> binds = dockerContainer.getBinds();
if (binds.isPresent()) {
log.trace("Using binds: {}", binds.get());
createContainer.withBinds(binds.get());
}
Optional<List<String>> envs = dockerContainer.getEnvs();
if (envs.isPresent()) {
log.trace("Using envs: {}", envs.get());
createContainer.withEnv(envs.get());
}
createContainer.exec();
dockerClient.startContainerCmd(containerName).exec();
waitForContainer(containerName);
}
} else {
log.warn("Container {} already running", containerName);
}
}
use of com.github.dockerjava.api.command.CreateContainerCmd in project elastest-torm by elastest.
the class DockerService2 method createContainer.
public CreateContainerResponse createContainer(DockerExecution dockerExec, String type) throws TJobStoppedException {
TJobExecution tJobExec = dockerExec.gettJobexec();
TJob tJob = tJobExec.getTjob();
SutSpecification sut = tJob.getSut();
String image = "";
String commands = null;
List<Parameter> parametersList = new ArrayList<Parameter>();
String prefix = "";
String suffix = "";
String containerName = "";
int logPort = 5000;
String sutHost = null;
String sutPath = null;
if ("sut".equals(type.toLowerCase())) {
parametersList = sut.getParameters();
commands = sut.getCommands();
image = sut.getSpecification();
prefix = "sut_";
if (sut.isSutInNewContainer()) {
suffix = sut.getSutInContainerAuxLabel();
}
containerName = getSutName(dockerExec);
sutPath = filesService.buildFilesPath(tJobExec, ElastestConstants.SUT_FOLDER);
filesService.createExecFilesFolder(sutPath);
} else if ("tjob".equals(type.toLowerCase())) {
parametersList = tJobExec.getParameters();
commands = tJob.getCommands();
image = tJob.getImageName();
prefix = "test_";
containerName = getTestName(dockerExec);
if (dockerExec.isWithSut()) {
sutHost = dockerExec.getSutExec().getIp();
}
}
// Environment variables (optional)
ArrayList<String> envList = new ArrayList<>();
String envVar;
// Get TJob Exec Env Vars
for (Map.Entry<String, String> entry : dockerExec.gettJobexec().getEnvVars().entrySet()) {
envVar = entry.getKey() + "=" + entry.getValue();
envList.add(envVar);
}
// Get Parameters and insert into Env Vars
for (Parameter parameter : parametersList) {
envVar = parameter.getName() + "=" + parameter.getValue();
envList.add(envVar);
}
if (sutHost != null) {
envList.add("ET_SUT_HOST=" + dockerExec.getSutExec().getIp());
}
// Commands (optional)
ArrayList<String> cmdList = new ArrayList<>();
ArrayList<String> entrypointList = new ArrayList<>();
if (commands != null && !commands.isEmpty()) {
cmdList.add("-c");
if (sut != null) {
if (sut.isSutInNewContainer()) {
commands = sutPath != null ? ("cd " + sutPath + ";" + commands) : commands;
}
} else {
commands = "export ET_SUT_HOST=$(" + this.getThisContainerIpCmd + ") || echo;" + commands;
}
cmdList.add(commands);
entrypointList.add("/bin/sh");
}
// Load Log Config
LogConfig logConfig = null;
if (tJob.isSelectedService("ems")) {
try {
logConfig = getEMSLogConfig(type, prefix, suffix, dockerExec);
} catch (Exception e) {
logger.error("", e);
}
} else {
logConfig = getDefaultLogConfig(logPort, prefix, suffix, dockerExec);
}
// Pull Image
this.pullETExecImage(image, type);
// Create docker sock volume
Volume dockerSockVolume = new Volume(dockerSock);
CreateContainerCmd containerCmd = dockerExec.getDockerClient().createContainerCmd(image).withEnv(envList).withLogConfig(logConfig).withName(containerName).withCmd(cmdList).withEntrypoint(entrypointList).withNetworkMode(dockerExec.getNetwork());
Volume sharedDataVolume = null;
if (dockerExec.gettJobexec().getTjob().getSut() != null && dockerExec.gettJobexec().getTjob().getSut().isSutInNewContainer()) {
sharedDataVolume = new Volume(sharedFolder);
}
if (sharedDataVolume != null) {
containerCmd = containerCmd.withVolumes(dockerSockVolume, sharedDataVolume).withBinds(new Bind(dockerSock, dockerSockVolume), new Bind(sharedFolder, sharedDataVolume));
} else {
containerCmd = containerCmd.withVolumes(dockerSockVolume).withBinds(new Bind(dockerSock, dockerSockVolume));
}
// Create Container
return containerCmd.exec();
}
use of com.github.dockerjava.api.command.CreateContainerCmd in project testcontainers-java by testcontainers.
the class GenericContainer method applyConfiguration.
private void applyConfiguration(CreateContainerCmd createCommand) {
// Set up exposed ports (where there are no host port bindings defined)
ExposedPort[] portArray = exposedPorts.stream().map(ExposedPort::new).toArray(ExposedPort[]::new);
createCommand.withExposedPorts(portArray);
// Set up exposed ports that need host port bindings
PortBinding[] portBindingArray = portBindings.stream().map(PortBinding::parse).toArray(PortBinding[]::new);
createCommand.withPortBindings(portBindingArray);
if (commandParts != null) {
createCommand.withCmd(commandParts);
}
String[] envArray = env.entrySet().stream().map(it -> it.getKey() + "=" + it.getValue()).toArray(String[]::new);
createCommand.withEnv(envArray);
Bind[] bindsArray = binds.stream().toArray(Bind[]::new);
createCommand.withBinds(bindsArray);
VolumesFrom[] volumesFromsArray = volumesFroms.stream().toArray(VolumesFrom[]::new);
createCommand.withVolumesFrom(volumesFromsArray);
Set<Link> allLinks = new HashSet<>();
Set<String> allLinkedContainerNetworks = new HashSet<>();
for (Map.Entry<String, LinkableContainer> linkEntries : linkedContainers.entrySet()) {
String alias = linkEntries.getKey();
LinkableContainer linkableContainer = linkEntries.getValue();
Set<Link> links = findLinksFromThisContainer(alias, linkableContainer);
allLinks.addAll(links);
if (allLinks.size() == 0) {
throw new ContainerLaunchException("Aborting attempt to link to container " + linkableContainer.getContainerName() + " as it is not running");
}
Set<String> linkedContainerNetworks = findAllNetworksForLinkedContainers(linkableContainer);
allLinkedContainerNetworks.addAll(linkedContainerNetworks);
}
createCommand.withLinks(allLinks.toArray(new Link[allLinks.size()]));
allLinkedContainerNetworks.remove("bridge");
if (allLinkedContainerNetworks.size() > 1) {
logger().warn("Container needs to be on more than one custom network to link to other " + "containers - this is not currently supported. Required networks are: {}", allLinkedContainerNetworks);
}
Optional<String> networkForLinks = allLinkedContainerNetworks.stream().findFirst();
if (networkForLinks.isPresent()) {
logger().debug("Associating container with network: {}", networkForLinks.get());
createCommand.withNetworkMode(networkForLinks.get());
}
createCommand.withPublishAllPorts(true);
String[] extraHostsArray = extraHosts.stream().toArray(String[]::new);
createCommand.withExtraHosts(extraHostsArray);
if (network != null) {
createCommand.withNetworkMode(network.getId());
createCommand.withAliases(this.networkAliases);
} else if (networkMode != null) {
createCommand.withNetworkMode(networkMode);
}
if (workingDirectory != null) {
createCommand.withWorkingDir(workingDirectory);
}
if (privilegedMode) {
createCommand.withPrivileged(privilegedMode);
}
createContainerCmdModifiers.forEach(hook -> hook.accept(createCommand));
Map<String, String> labels = createCommand.getLabels();
labels = new HashMap<>(labels != null ? labels : Collections.emptyMap());
labels.putAll(DockerClientFactory.DEFAULT_LABELS);
createCommand.withLabels(labels);
}
use of com.github.dockerjava.api.command.CreateContainerCmd in project beam by apache.
the class BaseClickHouseTest method setup.
@BeforeClass
public static void setup() throws IOException, InterruptedException {
// network sharing doesn't work with ClassRule
network = Network.newNetwork();
zookeeper = new GenericContainer<>(DockerImageName.parse("zookeeper").withTag(ZOOKEEPER_VERSION)).withStartupAttempts(10).withExposedPorts(2181).withNetwork(network).withNetworkAliases("zookeeper");
// so far zookeeper container always starts successfully, so no extra retries
zookeeper.start();
clickHouse = (ClickHouseContainer) new ClickHouseContainer(CLICKHOUSE_IMAGE).withStartupAttempts(10).withCreateContainerCmdModifier(// type inference for `(CreateContainerCmd) -> cmd.` doesn't work
cmd -> ((CreateContainerCmd) cmd).withMemory(256 * 1024 * 1024L).withMemorySwap(4L * 1024 * 1024 * 1024L)).withNetwork(network).withClasspathResourceMapping("config.d/zookeeper_default.xml", "/etc/clickhouse-server/config.d/zookeeper_default.xml", BindMode.READ_ONLY);
BackOff backOff = FluentBackoff.DEFAULT.withMaxRetries(3).withInitialBackoff(Duration.standardSeconds(15)).backoff();
// try to start clickhouse-server a couple of times, see BEAM-6639
while (true) {
try {
Unreliables.retryUntilSuccess(10, () -> {
DockerClientFactory.instance().checkAndPullImage(DockerClientFactory.instance().client(), CLICKHOUSE_IMAGE);
return null;
});
clickHouse.start();
break;
} catch (Exception e) {
if (!BackOffUtils.next(Sleeper.DEFAULT, backOff)) {
throw e;
} else {
List<Image> images = DockerClientFactory.instance().client().listImagesCmd().withShowAll(true).exec();
String listImagesOutput = "listImagesCmd:\n" + Joiner.on('\n').join(images) + "\n";
LOG.warn("failed to start clickhouse-server\n\n" + listImagesOutput, e);
}
}
}
}
use of com.github.dockerjava.api.command.CreateContainerCmd in project hazelcast by hazelcast.
the class MySqlCdcNetworkIntegrationTest method initMySql.
private MySQLContainer<?> initMySql(Network network, Integer fixedExposedPort) {
MySQLContainer<?> mysql = namedTestContainer(new MySQLContainer<>(AbstractMySqlCdcIntegrationTest.DOCKER_IMAGE).withUsername("mysqluser").withPassword("mysqlpw"));
if (fixedExposedPort != null) {
Consumer<CreateContainerCmd> cmd = e -> e.withPortBindings(new PortBinding(Ports.Binding.bindPort(fixedExposedPort), new ExposedPort(MYSQL_PORT)));
mysql = mysql.withCreateContainerCmdModifier(cmd);
}
if (network != null) {
mysql = mysql.withNetwork(network);
}
mysql.start();
return mysql;
}
Aggregations