Skip to content

Commit

Permalink
Merge pull request #5458 from microsoft/fix-eclipse-docker
Browse files Browse the repository at this point in the history
Fix expose port for tomcat app service during docker run
  • Loading branch information
Flanker32 authored Jul 1, 2021
2 parents cc8b98e + ab31692 commit ed18358
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,16 @@
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
Expand All @@ -56,6 +61,7 @@
import org.eclipse.swt.widgets.Text;

import com.microsoft.azuretools.azurecommons.exceptions.InvalidFormDataException;
import com.microsoft.azuretools.azurecommons.helpers.NotNull;
import com.microsoft.azuretools.azurecommons.helpers.Nullable;
import com.microsoft.azuretools.azurecommons.util.Utils;
import com.microsoft.azuretools.container.ConsoleLogger;
Expand Down Expand Up @@ -104,6 +110,11 @@ public class DockerRunDialog extends AzureTitleAreaDialogWrapper {
private static final String IMAGE_NAME_PREFIX = "localimage";
private static final String DEFAULT_TAG_NAME = "latest";
private static final String SELECT_DOCKER_FILE = "Browse...";
private static final String WAR = "war";
private static final String DEFAULT_TOMCAT_SERVICE_PORT = "80";
private static final String DEFAULT_SPRING_BOOT_SERVICE_PORT = "8080";

private static final Pattern PORT_PATTERN = Pattern.compile("EXPOSE\\s+(\\d+).*");

private DockerHostRunSetting dataModel;
private Text txtDockerHost;
Expand Down Expand Up @@ -350,9 +361,10 @@ private void execute() {
targetDockerfile.getFileName().toString(), new DockerProgressHandler());

// create a container
final String containerServerPort = StringUtils.firstNonEmpty(getPortFromDockerfile(content), getPortByArtifact(targetFilePath));
ConsoleLogger.info(Constant.MESSAGE_CREATING_CONTAINER);
String containerId = DockerUtil.createContainer(docker,
String.format("%s:%s", dataModel.getImageName(), dataModel.getTagName()));
String.format("%s:%s", dataModel.getImageName(), dataModel.getTagName()), containerServerPort);
ConsoleLogger.info(String.format(Constant.MESSAGE_CONTAINER_INFO, containerId));

// start container
Expand All @@ -366,7 +378,7 @@ private void execute() {
String publicPort = null;
if (ports != null) {
for (Container.PortMapping portMapping : ports) {
if (Constant.TOMCAT_SERVICE_PORT.equals(String.valueOf(portMapping.privatePort()))) {
if (StringUtils.equalsIgnoreCase(containerServerPort, String.valueOf(portMapping.privatePort()))) {
publicPort = String.valueOf(portMapping.publicPort());
}
}
Expand Down Expand Up @@ -409,4 +421,17 @@ private void sendTelemetry(boolean success, @Nullable String errorMsg) {
private void showErrorMessage(String title, String message) {
MessageDialog.openError(this.getShell(), title, message);
}

private String getPortFromDockerfile(@NotNull String dockerFileContent) {
final Matcher result = Arrays.stream(dockerFileContent.split("\\R+"))
.map(value -> PORT_PATTERN.matcher(value))
.filter(Matcher::matches)
.findFirst().orElse(null);
return Optional.ofNullable(result).map(matcher -> matcher.group(1)).orElse(null);
}

private String getPortByArtifact(@NotNull String targetFilePath) {
final String fileExtension = FilenameUtils.getExtension(targetFilePath);
return StringUtils.equalsIgnoreCase(fileExtension, WAR) ? DEFAULT_TOMCAT_SERVICE_PORT : DEFAULT_SPRING_BOOT_SERVICE_PORT;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -131,18 +131,18 @@ public static void pullImage(DockerClient dockerClient, String registryUrl, Stri
* create container with specified ImageName:TagName.
*/
@NotNull
public static String createContainer(@NotNull DockerClient docker, @NotNull String imageNameWithTag)
public static String createContainer(@NotNull DockerClient docker, @NotNull String imageNameWithTag, @NotNull String containerServerPort)
throws DockerException, InterruptedException {
final Map<String, List<PortBinding>> portBindings = new HashMap<>();
List<PortBinding> randomPort = new ArrayList<>();
PortBinding randomBinding = PortBinding.randomPort("0.0.0.0");
randomPort.add(randomBinding);
portBindings.put(Constant.TOMCAT_SERVICE_PORT, randomPort);
portBindings.put(containerServerPort, randomPort);

final HostConfig hostConfig = HostConfig.builder().portBindings(portBindings).build();

final ContainerConfig config = ContainerConfig.builder().hostConfig(hostConfig).image(imageNameWithTag)
.exposedPorts(Constant.TOMCAT_SERVICE_PORT).build();
.exposedPorts(containerServerPort).build();
final ContainerCreation container = docker.createContainer(config);
return container.id();
}
Expand Down

0 comments on commit ed18358

Please sign in to comment.