how to execute docker commands through Java program

10,966

Solution 1

To overcome the error you're facing, you should use "-i" instead of "-it". The -t arg tells docker to allocate a pseudo tty.

Having said that, I agree with Florian, you should use the docker remote api. https://docs.docker.com/engine/reference/api/docker_remote_api/

Solution 2

You can use docker client for java (e.g. https://github.com/spotify/docker-client). Here is example of usage:

public void startContainer(String containerId) throws Exception {
    final DockerClient docker = DefaultDockerClient.builder()
            .uri(URI.create("https://192.168.64.3:2376"))
            .dockerCertificates(new DockerCertificates(Paths.get("/Users/d.romashov/.docker/machine/machines/dinghy")))
            .build();

    docker.startContainer(containerId);
}
Share:
10,966
Chris Tien
Author by

Chris Tien

PhD candidate in National University of Singapore.

Updated on August 09, 2022

Comments

  • Chris Tien
    Chris Tien almost 2 years

    Instead of calling Docker remote APIs, I need develop a program which just talks to Docker Linux Client (not Docker daemon). Here is my code

        try {
            String[] command = {"docker", "run", "-it", "tomcat:9", "bash"};
            ProcessBuilder pb = new ProcessBuilder(command);
            pb.inheritIO();
            Process proc = pb.start();
    
            InputStream is = proc.getInputStream();
            OutputStream os = proc.getOutputStream();
    
            BufferedReader reader
                    = new BufferedReader(new InputStreamReader(is));
    
            BufferedWriter writer
                    = new BufferedWriter(new OutputStreamWriter(os));
            writer.write("pwd");
            writer.flush();
            String line = "";
            while ((line = reader.readLine()) != null) {
                System.out.print(line + "\n");
            }
    
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    

    I always get errors. If I use "-it", it will says "cannot enable tty mode on non tty input", if I use "-i", I will get a Stream Closed Exception.

    Is there any way to solve this problem?