Print 'fake' docker run command

See: https://www.pivotaltracker.com/story/show/175202648
This commit is contained in:
Kris De Volder
2020-10-19 09:46:04 -07:00
parent 2cc42fd085
commit 52755d6ba1
5 changed files with 159 additions and 4 deletions

View File

@@ -291,7 +291,7 @@ public class DockerApp extends AbstractDisposable implements App, ChildBearing,
if (client==null) {
console.write("Cannot start container... Docker client is disconnected!", LogType.STDERROR);
} else {
Network network = target.ensureNetwork();
Network network = target.ensureNetwork(console);
console.write("Running container with '"+image+"'", LogType.STDOUT);
JmxSupport jmx = new JmxSupport();
String jmxUrl = jmx.getJmxUrl();
@@ -305,7 +305,6 @@ public class DockerApp extends AbstractDisposable implements App, ChildBearing,
.put(APP_NAME, getName())
.put(BUILD_ID, desiredBuildId)
.put(SYSTEM_PROPS, sysprops);
ImmutableSet.Builder<ExposedPort> exposedPorts = ImmutableSet.builder();
ImmutableList.Builder<PortBinding> portBindings = ImmutableList.builder();
@@ -371,6 +370,17 @@ public class DockerApp extends AbstractDisposable implements App, ChildBearing,
String networkAlias = getName();
cb.withAliases(networkAlias);
cb.withLabels(labels.build());
//See: https://www.pivotaltracker.com/story/show/175202648
FakeDockerRunCommand fakeCmd = new FakeDockerRunCommand()
.withImage(image)
.withLabels(cb.getLabels())
.withNetwork(network)
.withNetworkAliases(networkAlias)
.withPortBindings(cb.getHostConfig().getPortBindings())
.withEnv(cb.getEnv());
console.logCommand(fakeCmd.toString());
CreateContainerResponse c = cb.exec();
console.write("Container created: "+c.getId(), LogType.STDOUT);
console.write("Starting container: "+c.getId(), LogType.STDOUT);
@@ -382,6 +392,7 @@ public class DockerApp extends AbstractDisposable implements App, ChildBearing,
//appContext.showConsole(c.id());
client.startContainerCmd(c.getId()).exec();
console.write("Streaming container output ...", LogType.STDOUT);
containerLogConnection.setValue(DockerContainer.connectLog(target, c.getId(), console, true));
}
}

View File

@@ -27,9 +27,11 @@ import java.util.UUID;
import org.eclipse.core.resources.IProject;
import org.springframework.ide.eclipse.boot.core.BootPropertyTester;
import org.springframework.ide.eclipse.boot.dash.api.App;
import org.springframework.ide.eclipse.boot.dash.api.AppConsole;
import org.springframework.ide.eclipse.boot.dash.api.DebuggableTarget;
import org.springframework.ide.eclipse.boot.dash.api.ProjectDeploymentTarget;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.RemoteBootDashModel;
import org.springframework.ide.eclipse.boot.dash.console.LogType;
import org.springframework.ide.eclipse.boot.dash.devtools.DevtoolsUtil;
import org.springframework.ide.eclipse.boot.dash.di.SimpleDIContext;
import org.springframework.ide.eclipse.boot.dash.docker.ui.DefaultDockerUserInteractions;
@@ -182,14 +184,16 @@ implements RemoteRunTarget<DockerClient, DockerTargetParams>, ProjectDeploymentT
return true;
}
public synchronized Network ensureNetwork() {
public synchronized Network ensureNetwork(AppConsole console) {
DockerClient client = this.client.getValue();
if (client!=null) {
Network network = getNetwork(client, DOCKER_NETWORK_NAME);
if (network!=null) {
return network;
}
client.createNetworkCmd().withName(DOCKER_NETWORK_NAME).withDriver("bridge").exec();
console.logCommand("docker network create -d bridge "+DOCKER_NETWORK_NAME);
CreateNetworkResponse r = client.createNetworkCmd().withName(DOCKER_NETWORK_NAME).withDriver("bridge").exec();
console.logCommandResult(r.getId());
return getNetwork(client, DOCKER_NETWORK_NAME);
}
return null;

View File

@@ -0,0 +1,119 @@
package org.springframework.ide.eclipse.boot.dash.docker.runtarget;
import java.util.Map;
import java.util.Map.Entry;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.api.model.Ports.Binding;
public class FakeDockerRunCommand {
private String image;
private Map<String, String> labels;
private String[] networkAliases;
private String network;
private Ports portBindings;
private String[] env;
public FakeDockerRunCommand withImage(String image) {
this.image = image;
return this;
}
public FakeDockerRunCommand withLabels(Map<String, String> labels) {
this.labels = labels;
return this;
}
@Override
public String toString() {
StringBuilder cmd = new StringBuilder("docker run");
addOptions(cmd);
addArgs(cmd, image);
return cmd.toString();
}
private void addOptions(StringBuilder cmd) {
addLabels(cmd);
addNetwork(cmd);
addAliases(cmd);
addPortBindings(cmd);
addEnv(cmd);
}
private void addEnv(StringBuilder cmd) {
if (env!=null && env.length>0) {
for (String b : env) {
addArgs(cmd, "--env", b);
}
}
}
private void addPortBindings(StringBuilder cmd) {
if (portBindings!=null) {
Map<ExposedPort, Binding[]> bindings = portBindings.getBindings();
if (!bindings.isEmpty()) {
for (Entry<ExposedPort, Binding[]> entry : bindings.entrySet()) {
ExposedPort exposed = entry.getKey();
for (Binding bindTo : entry.getValue()) {
addArgs(cmd, "-p",
bindTo.getHostIp()+":"+bindTo.getHostPortSpec()+":"+exposed.getPort()+"/"+exposed.getProtocol()
);
}
System.out.println(entry);
}
}
}
}
private void addNetwork(StringBuilder cmd) {
if (network!=null) {
addArgs(cmd, "--network", network);
}
}
public void addAliases(StringBuilder cmd) {
if (networkAliases!=null && networkAliases.length>0) {
for (String alias : networkAliases) {
addArgs(cmd, "--network-alias", alias);
}
}
}
private void addLabels(StringBuilder cmd) {
if (labels!=null && !labels.isEmpty()) {
for (Entry<String, String> entry : labels.entrySet()) {
addArgs(cmd, "--label", entry.getKey()+"="+entry.getValue());
}
}
}
private void addArgs(StringBuilder cmd, String... arg) {
cmd.append(" \\\n ");
cmd.append(CommandUtil.escape(arg));
}
public FakeDockerRunCommand withNetworkAliases(String... networkAliases) {
this.networkAliases = networkAliases;
return this;
}
public FakeDockerRunCommand withNetwork(Network network) {
this.network = network.getName();
return this;
}
public FakeDockerRunCommand withPortBindings(Ports portBindings) {
this.portBindings = portBindings;
return this;
}
public FakeDockerRunCommand withEnv(String... env) {
this.env = env;
return this;
}
}