Docker-Java操作Windows Docker踩坑记录 二

延续上文:Docker-Java操作Windows Docker踩坑记录

踩坑1 openjdk:17-apline容器无法启动

使用 openjdk:17-apline 创建的容器 无法启动,这我真不知道为什么,启动一两秒后,自动就挂了,要么就是启动报错,复制了几次鱼皮哥给的代码还是不行 一气之下选择更换镜像 使用 openjdk:17-slim 比 openjdk:17-apline 要大一点,但是有些功能更完整。切换完镜像后,用鱼皮的代码就正常启动也不会自动挂和报错。

不理解 为什么openjdk:17-apline不行 没有深入研究,我觉得没必要

踩坑2 使用Scanner标准输入的代码

不同于鱼皮哥使用 args 进行用例的注入,而是选择使用标准输入输出的方式,因为感觉这个更符合ACM。那么问题就来了,如何向运行的容器中输入对应的用例?? 很简单,在execStartCmd(execCmd.getId()).withStdIn(inputStream)这样设置就可以,然后添加监听回答

java
复制代码
// 创建命令 ExecCreateCmdResponse execCmd = dockerClient.execCreateCmd(containerId) .withCmd(RUN_CMD) .withAttachStdin(true) .withAttachStdout(true) .withAttachStderr(true) .exec(); // 存储输出 StringBuilder output = new StringBuilder(); StringBuilder error = new StringBuilder(); StopWatch stopWatch = new StopWatch(); // 执行命令 try (ByteArrayInputStream inputStream = new ByteArrayInputStream(formattedInput.getBytes())) { stopWatch.start(); dockerClient.execStartCmd(execCmd.getId()) .withStdIn(inputStream) .exec(new DockerExecuteCallback(output, error)) .awaitCompletion(CommonConstant.EXECUTE_TIMEOUT_SECONDS, TimeUnit.SECONDS); stopWatch.stop(); }

哎?你以为就结束了吗?其实并没有,如果使用这个启动你就会发现,你根本无法输入值,甚至会出现报错 提示管道已关闭,讲真的,这个问题不问AI,真不懂怎么解决。问了一大堆,最后需要配置这两个配置 1: 在HostConfig配置withCapAdd()成允许调试

java
复制代码
HostConfig hostConfig = new HostConfig(); // 其他保持不变 hostConfig.withCapAdd(Capability.SYS_PTRACE);

2: 修改容器的终端变量TERM=xterm

java
复制代码
CreateContainerResponse container = dockerClient.createContainerCmd(image) // 其他保持不变 .withEnv("TERM=xterm") // 添加终端类型环境变量 .exec();

至于为什么需要配置这两个,我也不太理解,效果实现后,就没有再深究。如果有伙伴有更好的建议,欢迎留言

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP