最近在尝试做一个代码沙箱的服务,简单实现后,想要放在linux上交由docker管理,使用docker管理后就出现了问题,一直报编译错误
错误定位
最后通过日志,将错误定位到了执行编译命令的一行代码
String compileCmd = String.format("javac -encoding utf-8 %s", userCodeFile.getAbsoluteFile());
这个命令是我通过代码拼接的,就是编译用户项目的目录下的
class文件,由于Linux与windos的获取的user.dir不一样,导致找不到我们项目前期生成的代码文件,造成了编译错误(也就是文件位置错误)
成功后就没有具体去看是那个位置了,可以在下图沙箱编译部分中打印执行文件的路径,f分别在Windows和Linux下执行进行查看就可以知道,Windows和linux中获取到的路径了
解决
将项目的docker镜像放在登录用户的目录下
我就是直接放在了root目录下,然后重新运行,成功……
弄了很久,为了早点解决问题,在可能出现问题的地方都打上了日志
沙箱源码和Docker文件
沙箱源码
dockerfile:
# 基础镜像
FROM openjdk:8-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY code-sandbox-0.0.1-SNAPSHOT.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]