22
33import  static  io .quarkus .deployment .pkg .steps .LinuxIDUtil .getLinuxID ;
44
5- import  java .io .File ;
6- import  java .io .IOException ;
7- import  java .nio .file .Files ;
8- import  java .nio .file .LinkOption ;
95import  java .nio .file .Path ;
10- import  java .time .Duration ;
116import  java .util .ArrayList ;
127import  java .util .Arrays ;
138import  java .util .Collections ;
149import  java .util .List ;
15- import  java .util .Objects ;
16- import  java .util .Set ;
17- import  java .util .function .Predicate ;
18- import  java .util .stream .Collectors ;
1910
2011import  org .apache .commons .lang3 .SystemUtils ;
2112import  org .jboss .logging .Logger ;
2213
23- import  io .quarkus .deployment .OutputFilter ;
2414import  io .quarkus .deployment .pkg .NativeConfig ;
25- import  io .quarkus .deployment .util .ExecUtil ;
2615import  io .quarkus .deployment .util .FileUtil ;
2716import  io .quarkus .runtime .util .ContainerRuntimeUtil ;
2817
@@ -34,14 +23,16 @@ public NativeImageBuildLocalContainerRunner(NativeConfig nativeConfig, Path outp
3423        super (nativeConfig , outputDir );
3524        if  (SystemUtils .IS_OS_LINUX ) {
3625            ArrayList <String > containerRuntimeArgs  = new  ArrayList <>(Arrays .asList (baseContainerRuntimeArgs ));
37-             if  (isDockerRootless (containerRuntime )) {
26+             if  (containerRuntime  == ContainerRuntimeUtil .ContainerRuntime .DOCKER 
27+                     && containerRuntime .isRootless ()) {
3828                Collections .addAll (containerRuntimeArgs , "--user" , String .valueOf (0 ));
3929            } else  {
4030                String  uid  = getLinuxID ("-ur" );
4131                String  gid  = getLinuxID ("-gr" );
4232                if  (uid  != null  && gid  != null  && !uid .isEmpty () && !gid .isEmpty ()) {
4333                    Collections .addAll (containerRuntimeArgs , "--user" , uid  + ":"  + gid );
44-                     if  (containerRuntime  == ContainerRuntimeUtil .ContainerRuntime .PODMAN ) {
34+                     if  (containerRuntime  == ContainerRuntimeUtil .ContainerRuntime .PODMAN 
35+                             && containerRuntime .isRootless ()) {
4536                        // Needed to avoid AccessDeniedExceptions 
4637                        containerRuntimeArgs .add ("--userns=keep-id" );
4738                    }
@@ -51,63 +42,6 @@ public NativeImageBuildLocalContainerRunner(NativeConfig nativeConfig, Path outp
5142        }
5243    }
5344
54-     private  static  boolean  isDockerRootless (ContainerRuntimeUtil .ContainerRuntime  containerRuntime ) {
55-         if  (containerRuntime  != ContainerRuntimeUtil .ContainerRuntime .DOCKER ) {
56-             return  false ;
57-         }
58-         String  dockerEndpoint  = fetchDockerEndpoint ();
59-         // docker socket? 
60-         String  socketUriPrefix  = "unix://" ;
61-         if  (dockerEndpoint  == null  || !dockerEndpoint .startsWith (socketUriPrefix )) {
62-             return  false ;
63-         }
64-         String  dockerSocket  = dockerEndpoint .substring (socketUriPrefix .length ());
65-         String  currentUid  = getLinuxID ("-ur" );
66-         if  (currentUid  == null  || currentUid .isEmpty () || currentUid .equals (String .valueOf (0 ))) {
67-             return  false ;
68-         }
69- 
70-         int  socketOwnerUid ;
71-         try  {
72-             socketOwnerUid  = (int ) Files .getAttribute (Path .of (dockerSocket ), "unix:uid" , LinkOption .NOFOLLOW_LINKS );
73-         } catch  (IOException  e ) {
74-             LOGGER .infof ("Owner UID lookup on '%s' failed with '%s'" , dockerSocket , e .getMessage ());
75-             return  false ;
76-         }
77-         return  currentUid .equals (String .valueOf (socketOwnerUid ));
78-     }
79- 
80-     private  static  String  fetchDockerEndpoint () {
81-         // DOCKER_HOST environment variable overrides the active context 
82-         String  dockerHost  = System .getenv ("DOCKER_HOST" );
83-         if  (dockerHost  != null ) {
84-             return  dockerHost ;
85-         }
86- 
87-         OutputFilter  outputFilter  = new  OutputFilter ();
88-         if  (!ExecUtil .execWithTimeout (new  File ("." ), outputFilter , Duration .ofMillis (3000 ),
89-                 "docker" , "context" , "ls" , "--format" ,
90-                 "{{- if .Current -}} {{- .DockerEndpoint -}} {{- end -}}" )) {
91-             LOGGER .debug ("Docker context lookup didn't succeed in time" );
92-             return  null ;
93-         }
94- 
95-         Set <String > endpoints  = outputFilter .getOutput ().lines ()
96-                 .filter (Objects ::nonNull )
97-                 .filter (Predicate .not (String ::isBlank ))
98-                 .collect (Collectors .toSet ());
99-         if  (endpoints .size () == 1 ) {
100-             return  endpoints .stream ().findFirst ().orElse (null );
101-         }
102-         if  (LOGGER .isDebugEnabled ()) {
103-             LOGGER .debugf ("Found too many active Docker endpoints: [%s]" ,
104-                     endpoints .stream ()
105-                             .map (endpoint  -> String .format ("'%s'" , endpoint ))
106-                             .collect (Collectors .joining ("," )));
107-         }
108-         return  null ;
109-     }
110- 
11145    @ Override 
11246    protected  List <String > getContainerRuntimeBuildArgs () {
11347        List <String > containerRuntimeArgs  = super .getContainerRuntimeBuildArgs ();
0 commit comments