@@ -19,6 +19,7 @@ import (
1919 "bufio"
2020 "bytes"
2121 "fmt"
22+ "github.com/joho/godotenv"
2223 "io"
2324 "os"
2425 "path"
@@ -41,6 +42,7 @@ type DockerDriver struct {
4142 env map [string ]string
4243 save bool
4344 runtime string
45+ runOpts unversioned.ContainerRunOptions
4446}
4547
4648func NewDockerDriver (args DriverConfig ) (Driver , error ) {
@@ -55,10 +57,26 @@ func NewDockerDriver(args DriverConfig) (Driver, error) {
5557 env : nil ,
5658 save : args .Save ,
5759 runtime : args .Runtime ,
60+ runOpts : args .RunOpts ,
5861 }, nil
5962}
6063
6164func (d * DockerDriver ) hostConfig () * docker.HostConfig {
65+ if d .runOpts .IsSet () && d .runtime != "" {
66+ return & docker.HostConfig {
67+ Capabilities : d .runOpts .Capabilities ,
68+ Binds : d .runOpts .BindMounts ,
69+ Privileged : d .runOpts .Privileged ,
70+ Runtime : d .runtime ,
71+ }
72+ }
73+ if d .runOpts .IsSet () {
74+ return & docker.HostConfig {
75+ Capabilities : d .runOpts .Capabilities ,
76+ Binds : d .runOpts .BindMounts ,
77+ Privileged : d .runOpts .Privileged ,
78+ }
79+ }
6280 if d .runtime != "" {
6381 return & docker.HostConfig {
6482 Runtime : d .runtime ,
@@ -297,7 +315,7 @@ func (d *DockerDriver) ReadDir(target string) ([]os.FileInfo, error) {
297315// 3) commits the container with its changes to a new image,
298316// and sets that image as the new "current image"
299317func (d * DockerDriver ) runAndCommit (env []string , command []string ) (string , error ) {
300- container , err := d . cli . CreateContainer ( docker.CreateContainerOptions {
318+ createOpts := docker.CreateContainerOptions {
301319 Config : & docker.Config {
302320 Image : d .currentImage ,
303321 Env : env ,
@@ -308,7 +326,11 @@ func (d *DockerDriver) runAndCommit(env []string, command []string) (string, err
308326 },
309327 HostConfig : d .hostConfig (),
310328 NetworkingConfig : nil ,
311- })
329+ }
330+ if d .runOpts .IsSet () && len (d .runOpts .User ) > 0 {
331+ createOpts .Config .User = d .runOpts .User
332+ }
333+ container , err := d .cli .CreateContainer (createOpts )
312334 if err != nil {
313335 return "" , errors .Wrap (err , "Error creating container" )
314336 }
@@ -342,8 +364,7 @@ func (d *DockerDriver) runAndCommit(env []string, command []string) (string, err
342364}
343365
344366func (d * DockerDriver ) exec (env []string , command []string ) (string , string , int , error ) {
345- // first, start container from the current image
346- container , err := d .cli .CreateContainer (docker.CreateContainerOptions {
367+ createOpts := docker.CreateContainerOptions {
347368 Config : & docker.Config {
348369 Image : d .currentImage ,
349370 Env : env ,
@@ -354,7 +375,41 @@ func (d *DockerDriver) exec(env []string, command []string) (string, string, int
354375 },
355376 HostConfig : d .hostConfig (),
356377 NetworkingConfig : nil ,
357- })
378+ }
379+ if d .runOpts .IsSet () {
380+ createOpts .Config .Tty = d .runOpts .TTY
381+ if len (d .runOpts .User ) > 0 {
382+ createOpts .Config .User = d .runOpts .User
383+ }
384+ var envVars []string
385+ if d .runOpts .EnvFile != "" {
386+ varMap , err := godotenv .Read (d .runOpts .EnvFile )
387+ if err != nil {
388+ logrus .Warnf ("Unable to load envFile %s: %s" , d .runOpts .EnvFile , err .Error ())
389+ } else {
390+ var varsFromFile []string
391+ for k , v := range varMap {
392+ if k != "" && v != "" {
393+ varsFromFile = append (varsFromFile , fmt .Sprintf ("%s=%s" , k , v ))
394+ }
395+ }
396+ envVars = append (envVars , varsFromFile ... )
397+ }
398+ }
399+ if d .runOpts .EnvVars != nil && len (d .runOpts .EnvVars ) > 0 {
400+ varsFromEnv := make ([]string , len (d .runOpts .EnvVars ))
401+ for i , e := range d .runOpts .EnvVars {
402+ v := os .Getenv (e )
403+ if v != "" {
404+ varsFromEnv [i ] = fmt .Sprintf ("%s=%s" , e , v )
405+ }
406+ }
407+ envVars = append (envVars , varsFromEnv ... )
408+ }
409+ createOpts .Config .Env = envVars
410+ }
411+ // first, start container from the current image
412+ container , err := d .cli .CreateContainer (createOpts )
358413 if err != nil {
359414 return "" , "" , - 1 , errors .Wrap (err , "Error creating container" )
360415 }
0 commit comments