Java Spotify docker客户端无法在一次操作中启动容器并执行命令?

Java Spotify docker客户端无法在一次操作中启动容器并执行命令?,java,docker,spotify-docker-client,Java,Docker,Spotify Docker Client,我有下面的代码,它使我能够启动Docker容器,然后运行一个附加了Stdout和Stderr的命令。这里的问题是它会启动容器,但在我能够在容器内执行命令之前,它当然会退出容器。如何启动容器并在容器内执行命令(在本例中为ls),并保持stdout和stderr连接,而不获取“无法在停止状态下执行”错误消息 final String IMAGE = "centos"; final DockerClient docker = new DefaultDockerClient("unix:///var

我有下面的代码,它使我能够启动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();

您可以在容器的
Dockerfile
中更改RUN命令,以运行bash脚本,该脚本最后调用
sleep 5000
。然后您的容器将不会立即停止。

您可以在容器的
Dockerfile
中更改RUN命令,以运行bash脚本,该脚本在最后调用
sleep 5000
。然后您的容器将不会立即停止。

您可以使用无限
休眠
循环启动容器

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

(这是中的示例)

您可以使用无限
休眠
循环启动容器

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

(这是来自的示例)

而不是ls命令?但我甚至无法调用该命令,因为容器已在几毫秒前退出。另外,睡觉似乎有点脏。对不起,不,我的意思是代替
Dockerfile
中的
RUN
命令。我编辑了我的答案来澄清。啊,我明白你的意思,所以我可以从Dockerfile调用我想要的命令,而不是从脚本中调用它,但问题仍然是我对输出没有太多的控制权,这是我通过execCreate等获得的。不,我只是建议您添加一个
sleep
,使容器保持一段时间的活动状态。然后可以从
execCreate
运行所需的命令,而不是ls命令?但我甚至无法调用该命令,因为容器已在几毫秒前退出。另外,睡觉似乎有点脏。对不起,不,我的意思是代替
Dockerfile
中的
RUN
命令。我编辑了我的答案来澄清。啊,我明白你的意思,所以我可以从Dockerfile调用我想要的命令,而不是从脚本中调用它,但问题仍然是我对输出没有太多的控制权,这是我通过execCreate等获得的。不,我只是建议您添加一个
sleep
,使容器保持一段时间的活动状态。然后,您可以从
execCreate
运行所需的命令。刚刚尝试使用睡眠循环,但仍然在停止状态下运行
cannot exec:unknown
刚刚尝试使用睡眠循环,但仍然在停止状态下运行
cannot exec:unknown