Java Spotify docker客户端无法在一次操作中启动容器并执行命令?
我有下面的代码,它使我能够启动Docker容器,然后运行一个附加了Stdout和Stderr的命令。这里的问题是它会启动容器,但在我能够在容器内执行命令之前,它当然会退出容器。如何启动容器并在容器内执行命令(在本例中为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
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