11package util
22
33import (
4- "bytes"
54 "encoding/json"
65 "errors"
76 "fmt"
7+ "io/ioutil"
88 "os"
99 "os/exec"
1010 "path/filepath"
1111 "time"
1212
13+ "github.com/google/uuid"
1314 rspecs "github.com/opencontainers/runtime-spec/specs-go"
1415 "github.com/opencontainers/runtime-tools/generate"
1516 "github.com/opencontainers/runtime-tools/specerror"
@@ -21,8 +22,8 @@ type Runtime struct {
2122 BundleDir string
2223 PidFile string
2324 ID string
24- stdout bytes. Buffer
25- stderr bytes. Buffer
25+ stdout * os. File
26+ stderr * os. File
2627}
2728
2829// DefaultSignal represents the default signal sends to a container
@@ -78,18 +79,25 @@ func (r *Runtime) Create() (err error) {
7879 args = append (args , r .ID )
7980 }
8081 cmd := exec .Command (r .RuntimeCommand , args ... )
81- r .stdout .Reset ()
82- cmd .Stdout = & r .stdout
83- r .stderr .Reset ()
84- cmd .Stderr = & r .stderr
82+ id := uuid .NewString ()
83+ r .stdout , err = os .OpenFile (filepath .Join (r .bundleDir (), fmt .Sprintf ("stdout-%s" , id )), os .O_CREATE | os .O_EXCL | os .O_RDWR , 0600 )
84+ if err != nil {
85+ return err
86+ }
87+ cmd .Stdout = r .stdout
88+ r .stderr , err = os .OpenFile (filepath .Join (r .bundleDir (), fmt .Sprintf ("stderr-%s" , id )), os .O_CREATE | os .O_EXCL | os .O_RDWR , 0600 )
89+ if err != nil {
90+ return err
91+ }
92+ cmd .Stderr = r .stderr
8593
8694 err = cmd .Run ()
8795 if err == nil {
8896 return err
8997 }
9098
9199 if e , ok := err .(* exec.ExitError ); ok {
92- stdout , stderr := r .StandardStreams ()
100+ stdout , stderr , _ := r .ReadStandardStreams ()
93101 if len (stderr ) == 0 {
94102 stderr = stdout
95103 }
@@ -99,9 +107,14 @@ func (r *Runtime) Create() (err error) {
99107 return err
100108}
101109
102- // StandardStreams returns content from the stdout and stderr buffers.
103- func (r * Runtime ) StandardStreams () (stdout , stderr []byte ) {
104- return r .stdout .Bytes (), r .stderr .Bytes ()
110+ // ReadStandardStreams collects content from the stdout and stderr buffers.
111+ func (r * Runtime ) ReadStandardStreams () (stdout []byte , stderr []byte , err error ) {
112+ stdout , err = ioutil .ReadFile (r .stdout .Name ())
113+ stderr , err2 := ioutil .ReadFile (r .stderr .Name ())
114+ if err == nil && err2 != nil {
115+ err = err2
116+ }
117+ return
105118}
106119
107120// Start a container
0 commit comments