Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Manage docker with docker-java, the volume mapping seems not working

Environment:
Fedora 39
openjdk-17
docker 25.01

My purpose is to run ffmpeg to merge Multiple video files into a single file, and i choose to use docker(manage by com.github.docker-java:docker-java:3.3.4) to do that.

But i encountered a problem: i declared two volume mappings and bind them to container, and then start the container immediately, the mapping directories seems not exist in container.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Here is a springboot test case below:

@Test
    public void testDockerVolumeMapping() throws Exception {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("unix:///var/run/docker.sock")
                .build();
        DockerClient dockerClient = DockerClientBuilder.getInstance(config)
                .withDockerHttpClient(new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).build())
                .build();
        String imageTag = "jrottenberg/ffmpeg:4.1-ubuntu";
        dockerClient.pullImageCmd(imageTag).exec(new PullImageResultCallback()).awaitCompletion(5, TimeUnit.MINUTES);
        Volume inputVM = new Volume("/home/rick/temp/video_demo/input:/video_input");
        Volume outputVM = new Volume("/home/rick/temp/video_demo/output:/video_output");
        String containerId = dockerClient.createContainerCmd(imageTag)
                .withVolumes(inputVM, outputVM)
                .withEntrypoint("/bin/bash")
                .withCmd("-c", "ls /video_output")
                .withAttachStdout(true)
                .withAttachStderr(true)
                .exec().getId();
        dockerClient.startContainerCmd(containerId).exec();
    }

run docker command:

docker logs ${containerId}

there is an error message:

ls: cannot access ‘/video_output’: No such file or directory

start the container again with command:

docker start ${containerId}
docker logs ${containerId}

and there is one more error message, the content is the same as last one.

But when i use docker run command:

docker run -v /home/rick/temp/video_demo/input:/video_input -v /home/rick/temp/video_demo/output:/video_output --entrypoint "/bin/bash" jrottenberg/ffmpeg:4.1-ubuntu -c "ls /video_output"

the directory content show correctly.

What is the reason?

>Solution :

I think you have to create a Bind for the volume.

Volume inputVM = new Volume("/home/rick/temp/video_demo/input");
Bind bindInput = new Bind("video_input", inputVM);

String containerId = dockerClient.createContainerCmd(imageTag)
        .withVolumes(inputVM, outputVM)
        .withBinds(bindInput)
        .withEntrypoint("/bin/bash")
        .withCmd("-c", "ls /video_output")
        .withAttachStdout(true)
        .withAttachStderr(true)
        .exec().getId();

Not sure if you have to add the volumes separatly

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading