@@ -311,28 +311,31 @@ impl DockerClient {
311311 where
312312 S : Into < String > + std:: fmt:: Debug + Send + Clone ,
313313 {
314- let mut cmd = self . client_command ( ) ;
315- cmd. arg ( "exec" ) ;
316-
317- if let Some ( env) = env {
318- for env_var in env {
319- cmd. args ( [ "-e" , & format ! ( "{}={}" , env_var. 0 . into( ) , env_var. 1 . into( ) ) ] ) ;
320- }
321- }
314+ // Try with specified user first
315+ let result = self
316+ . exec_with_user ( name, command. clone ( ) , env. clone ( ) , as_user. clone ( ) )
317+ . await ?;
322318
323- if let Some ( user) = as_user {
324- cmd. args ( [ "-u" , user. into ( ) . as_ref ( ) ] ) ;
319+ // If command failed and we specified a user, retry without user
320+ if result. is_err ( ) && as_user. is_some ( ) {
321+ trace ! ( "Command failed with user, retrying without user specification" ) ;
322+ return self . exec_with_user ( name, command, env, None ) . await ;
325323 }
326324
327- cmd. arg ( name) ;
328-
329- cmd. args (
330- command
331- . clone ( )
332- . into_iter ( )
333- . map ( |s| <S as Into < String > >:: into ( s) ) ,
334- ) ;
325+ Ok ( result)
326+ }
335327
328+ async fn exec_with_user < S > (
329+ & self ,
330+ name : & str ,
331+ command : Vec < S > ,
332+ env : Option < Vec < ( S , S ) > > ,
333+ as_user : Option < S > ,
334+ ) -> Result < ExecutionResult >
335+ where
336+ S : Into < String > + std:: fmt:: Debug + Send + Clone ,
337+ {
338+ let mut cmd = self . build_exec_command ( name, command. clone ( ) , env, as_user) ;
336339 trace ! ( "cmd is : {:?}" , cmd) ;
337340
338341 let result = cmd. output ( ) . await . map_err ( |err| {
@@ -357,6 +360,35 @@ impl DockerClient {
357360 Ok ( Ok ( String :: from_utf8_lossy ( & result. stdout ) . to_string ( ) ) )
358361 }
359362
363+ fn build_exec_command < S > (
364+ & self ,
365+ name : & str ,
366+ command : Vec < S > ,
367+ env : Option < Vec < ( S , S ) > > ,
368+ as_user : Option < S > ,
369+ ) -> Command
370+ where
371+ S : Into < String > + std:: fmt:: Debug + Send + Clone ,
372+ {
373+ let mut cmd = self . client_command ( ) ;
374+ cmd. arg ( "exec" ) ;
375+
376+ if let Some ( env) = env {
377+ for env_var in env {
378+ cmd. args ( [ "-e" , & format ! ( "{}={}" , env_var. 0 . into( ) , env_var. 1 . into( ) ) ] ) ;
379+ }
380+ }
381+
382+ if let Some ( user) = as_user {
383+ cmd. args ( [ "-u" , user. into ( ) . as_ref ( ) ] ) ;
384+ }
385+
386+ cmd. arg ( name) ;
387+ cmd. args ( command. into_iter ( ) . map ( |s| <S as Into < String > >:: into ( s) ) ) ;
388+
389+ cmd
390+ }
391+
360392 pub async fn container_cp (
361393 & self ,
362394 name : & str ,
0 commit comments