|
|
@@ -1852,7 +1852,7 @@ dockerClient.updateContainerCmd(containerId)
|
|
|
// 等价命令:
|
|
|
// docker run -d -w /code --user nobody --read-only --network none \
|
|
|
// --cap-drop ALL -m 64m --cpus 1 --pids-limit 64 \
|
|
|
-// --tmpfs /code --tmpfs /tmp amazoncorretto:17 sh -c "sleep 300"
|
|
|
+// --tmpfs /code --tmpfs /tmp eclipse-temurin:17-jdk-alpine sh -c "sleep 300"
|
|
|
|
|
|
HostConfig hostConfig = HostConfig.newHostConfig()
|
|
|
.withMemory(memoryBytes) // -m 64m
|
|
|
@@ -1866,7 +1866,7 @@ HostConfig hostConfig = HostConfig.newHostConfig()
|
|
|
"/code", "size=8m,mode=1777",
|
|
|
"/tmp", "size=8m,mode=1777"));
|
|
|
|
|
|
-CreateContainerResponse container = dockerClient.createContainerCmd("amazoncorretto:17")
|
|
|
+CreateContainerResponse container = dockerClient.createContainerCmd("eclipse-temurin:17-jdk-alpine")
|
|
|
.withHostConfig(hostConfig)
|
|
|
.withWorkingDir("/code")
|
|
|
.withUser("nobody") // 非 root 运行
|
|
|
@@ -1875,6 +1875,8 @@ CreateContainerResponse container = dockerClient.createContainerCmd("amazoncorre
|
|
|
.exec();
|
|
|
```
|
|
|
|
|
|
+关于镜像选择,这里用了 **JDK 而非 JRE**:因为编译与运行共用同一个容器,容器内必须同时存在 `javac` 和 `java`,而纯 JRE 镜像只含 `java` 没有 `javac`。具体选用 `eclipse-temurin:17-jdk-alpine`(Alpine 版最小 JDK),比主流的 `amazoncorretto:17` 压缩体积更小;Alpine 自带的 busybox 提供 `sh` / `printf` / `base64`,正好满足后续注入方案。镜像不一定在本地——`judge()` 入口先 `ensureJudgeImageAvailable()` 检查镜像是否存在,缺失则自动 `pullImageCmd` 拉取,避免人工准备环境。
|
|
|
+
|
|
|
要点:
|
|
|
|
|
|
- 根文件系统只读后,`/code` 与 `/tmp` 用 **tmpfs**(内存文件系统)挂载成可写目录,作为编译产物与临时文件的家;
|