diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java index fba83f50c..461cd5679 100644 --- a/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java @@ -13,6 +13,7 @@ import com.github.dockerjava.api.model.Link; import com.github.dockerjava.api.model.LogConfig; import com.github.dockerjava.api.model.LxcConf; +import com.github.dockerjava.api.model.NetworkingConfig; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.RestartPolicy; @@ -209,6 +210,13 @@ default CreateContainerCmd withLinks(List links) { CreateContainerCmd withIpv6Address(String ipv6Address); + NetworkingConfig getNetworkingConfig(); + + /** + * Set the networking configuration for the container. + */ + CreateContainerCmd withNetworkingConfig(NetworkingConfig networkingConfig); + @CheckForNull Map getLabels(); diff --git a/docker-java-api/src/main/java/com/github/dockerjava/api/model/NetworkingConfig.java b/docker-java-api/src/main/java/com/github/dockerjava/api/model/NetworkingConfig.java new file mode 100644 index 000000000..3af186f6f --- /dev/null +++ b/docker-java-api/src/main/java/com/github/dockerjava/api/model/NetworkingConfig.java @@ -0,0 +1,32 @@ +package com.github.dockerjava.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.annotation.CheckForNull; +import java.util.Map; + +/** + * Networking configuration for a container. + */ +public class NetworkingConfig { + + public NetworkingConfig() { + this.endpointsConfig = new HashMap<>(); + } + public NetworkingConfig(Map endpointsConfig) { + this.endpointsConfig = endpointsConfig; + } + + @JsonProperty("EndpointsConfig") + private Map endpointsConfig; + + @CheckForNull + public Map getEndpointsConfig() { + return endpointsConfig; + } + + public NetworkingConfig withEndpointsConfig(Map endpointsConfig) { + this.endpointsConfig = endpointsConfig; + return this; + } +} diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java index 9b7f8a8fe..dade58292 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java @@ -12,6 +12,7 @@ import com.github.dockerjava.api.model.ExposedPorts; import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.NetworkingConfig; import com.github.dockerjava.api.model.Volume; import com.github.dockerjava.api.model.Volumes; import org.apache.commons.lang3.builder.EqualsBuilder; @@ -127,7 +128,7 @@ public class CreateContainerCmdImpl extends AbstrDockerCmd shell; @JsonProperty("NetworkingConfig") - private NetworkingConfig networkingConfig; + private NetworkingConfig networkingConfig = new NetworkingConfig(); private String ipv4Address = null; @@ -544,6 +545,18 @@ public CreateContainerCmd withIpv6Address(String ipv6Address) { return this; } + @Override + public NetworkingConfig getNetworkingConfig() { + return networkingConfig; + } + + @Override + public CreateContainerCmd withNetworkingConfig(NetworkingConfig networkingConfig) { + Objects.requireNonNull(networkingConfig, "no networkingConfig was specified"); + this.networkingConfig = networkingConfig; + return this; + } + @CheckForNull public List getOnBuild() { return onBuild; @@ -601,8 +614,13 @@ public CreateContainerResponse exec() throws NotFoundException, ConflictExceptio } if (containerNetwork != null && hostConfig.getNetworkMode() != null) { - networkingConfig = new NetworkingConfig() - .withEndpointsConfig(singletonMap(hostConfig.getNetworkMode(), containerNetwork)); + // If the user explicitly sets networkingConfig or endpointConfig to null, its reasonable to not overwrite it + if (networkingConfig != null + && networkingConfig.getEndpointsConfig() != null + && !networkingConfig.getEndpointsConfig().containsKey(hostConfig.getNetworkMode()) + ) { + networkingConfig.getEndpointsConfig().put(hostConfig.getNetworkMode(), containerNetwork); + } } return super.exec(); @@ -623,18 +641,4 @@ public boolean equals(Object o) { public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } - - public static class NetworkingConfig { - @JsonProperty("EndpointsConfig") - public Map endpointsConfig; - - public Map getEndpointsConfig() { - return endpointsConfig; - } - - public NetworkingConfig withEndpointsConfig(Map endpointsConfig) { - this.endpointsConfig = endpointsConfig; - return this; - } - } }