Клиент Spotify Docker не может запустить контейнер и выполнить команду за одну операцию? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть следующий фрагмент кода, который позволяет мне запустить контейнер Docker и затем запустить команду с подключенными Stdout и Stderr.Проблема здесь в том, что он запускает контейнер, но, конечно, выходит из контейнера, прежде чем я смог выполнить команду внутри контейнера.Как я могу запустить контейнер и выполнить команду внутри контейнера (в данном случае ls) и оставить подключенными stdout и stderr без сообщения об ошибке «не удается выполнить в остановленном состоянии»?

final String IMAGE = "centos";

final DockerClient docker = new 
DefaultDockerClient("unix:///var/run/docker.sock");

docker.pull(IMAGE);

final ContainerConfig containerConfig = ContainerConfig.builder()
    .image(IMAGE)
    .build();


final ContainerCreation creation = docker.createContainer(containerConfig);
final String id = creation.id();

docker.startContainer(id);

final String[] command = {"sh", "-c", "ls"};
final ExecCreation execCreation = docker.execCreate(
    id, command, DockerClient.ExecCreateParam.attachStdout(),
    DockerClient.ExecCreateParam.attachStderr());
final LogStream output = docker.execStart(execCreation.id());
final String execOutput = output.readFully();

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы можете запустить контейнер с бесконечной sleep петлей

final ContainerConfig containerConfig = ContainerConfig.builder()
    .image(IMAGE)
    .cmd("sh", "-c", "while :; do sleep 1; done")
    .build();

(это пример из Spotify документации )

0 голосов
/ 24 ноября 2018

Вы можете изменить команду RUN в контейнере Dockerfile, чтобы запустить скрипт bash, который в конце вызывает sleep 5000.Тогда ваш контейнер не остановится сразу.

...