ContainerImpl createDockerContainer()

in containers-docker-local/src/main/java/org/apache/aries/containers/docker/local/impl/LocalDockerServiceManager.java [118:177]


    ContainerImpl createDockerContainer(ServiceConfig config) throws Exception {
        List<String> command = new ArrayList<>();
        command.add("-d");
        command.add("-l");
        command.add(SERVICE_NAME_LABEL + "=" + config.getServiceName());

        String ep = config.getEntryPoint();
        if (ep != null) {
            command.add("--entrypoint");
            command.add(ep);
        }

        Map<Integer, Integer> ports = new HashMap<>();
        for (Integer p : config.getContainerPorts()) {
            command.add("-p");
            int freePort = getFreePort();
            command.add(freePort + ":" + p);
            ports.put(p, freePort);

        }

        for(Map.Entry<String, String> entry : config.getEnvVars().entrySet()) {
            command.add("-e");
            command.add(entry.getKey() + '=' + entry.getValue());
        }

        command.add("--cpus");
        command.add("" + config.getRequestedCpuUnits() + "");

        command.add("-m");
        command.add("" + ((int) config.getRequestedMemory()) + "m");

        command.add(config.getContainerImage());
        command.addAll(Arrays.asList(config.getCommandLine()));

        if (config.getHealthChecks().size() > 0) {
            // Only one healthcheck supported
            HealthCheck hc = config.getHealthChecks().get(0);
            if (hc.getType() != HealthCheck.Type.COMMAND) {
                throw new UnsupportedOperationException("Health check of type " + hc.getType() +
                        " not supported. Docker only supports health checks of type COMMAND");
            }

            command.add("--health-cmd");
            command.add(hc.getParameters());
            command.add("--health-interval");
            command.add(hc.getInterval() + "s");
            command.add("--health-retries");
            command.add("" + hc.getMaxFailures());
// TODO Add this when docker supports it in a release.
//            command.add("--health-start-period");
//            command.add(hc.getGracePeriod() + "s");
            command.add("--health-timeout");
            command.add(hc.getTimeout() + "s");
        }

        DockerContainerInfo info = docker.run(command);

        return new ContainerImpl(info.getID(), info.getIP(), ports);
    }