Skip to content

Commit e078cef

Browse files
committed
Pass user ID and group ID to docker native image build in linux, by default docker container will run as root
1 parent 4a2f9c7 commit e078cef

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

core/creator/src/main/java/io/quarkus/creator/phase/nativeimage/NativeImagePhase.java

+43-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.io.BufferedReader;
2121
import java.io.File;
2222
import java.io.IOException;
23-
import java.io.PrintStream;
23+
import java.io.InputStreamReader;
2424
import java.nio.charset.StandardCharsets;
2525
import java.nio.file.Files;
2626
import java.nio.file.Path;
@@ -47,6 +47,8 @@
4747
import io.quarkus.creator.outcome.OutcomeProviderRegistration;
4848
import io.quarkus.creator.phase.augment.AugmentOutcome;
4949
import io.quarkus.creator.phase.runnerjar.RunnerJarOutcome;
50+
import io.quarkus.gizmo.MethodDescriptor;
51+
import io.quarkus.gizmo.ResultHandle;
5052
import io.smallrye.config.SmallRyeConfigProviderResolver;
5153

5254
/**
@@ -313,6 +315,46 @@ public void provideOutcome(AppCreator ctx) throws AppCreatorException {
313315
// E.g. "/usr/bin/docker run -v {{PROJECT_DIR}}:/project --rm quarkus/graalvm-native-image"
314316
nativeImage = new ArrayList<>();
315317
Collections.addAll(nativeImage, containerRuntime, "run", "-v", outputDir.toAbsolutePath() + ":/project:z", "--rm");
318+
if (IS_LINUX & "docker".equals(containerRuntime)) {
319+
try {
320+
BufferedReader reader;
321+
StringBuilder builder;
322+
String uid = null;
323+
String gid = null;
324+
325+
ProcessBuilder idPB = new ProcessBuilder().command("id", "-ur");
326+
Process process = idPB.start();
327+
328+
if (process.waitFor() == 0) {
329+
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
330+
builder = new StringBuilder();
331+
String line;
332+
while ((line = reader.readLine()) != null) {
333+
builder.append(line);
334+
}
335+
uid = builder.toString();
336+
}
337+
338+
idPB = new ProcessBuilder().command("id", "-gr");
339+
process = idPB.start();
340+
341+
if (process.waitFor() == 0) {
342+
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
343+
builder = new StringBuilder();
344+
String line = null;
345+
while ((line = reader.readLine()) != null) {
346+
builder.append(line);
347+
}
348+
gid = builder.toString();
349+
}
350+
351+
if (uid != null & gid != null & !"".equals(uid) & !"".equals(gid)) {
352+
Collections.addAll(nativeImage, "--user", uid.concat(":").concat(gid));
353+
}
354+
} catch (Exception e) {
355+
//swallow exception here, docker container will run as root by default
356+
}
357+
}
316358
nativeImage.addAll(containerRuntimeOptions);
317359
nativeImage.add(this.builderImage);
318360
} else {

0 commit comments

Comments
 (0)