@@ -3,6 +3,8 @@ package container
33import (
44 "bytes"
55 "fmt"
6+ "io"
7+ "math/rand"
68 "os/exec"
79 "strings"
810 "syscall"
@@ -280,3 +282,57 @@ func TestProcessTermination(t *testing.T) {
280282 ExitCode : 0 ,
281283 })
282284}
285+
286+ // Adapted from https://github.com/docker/for-mac/issues/7632#issue-2932169772
287+ // Thanks [@almet](https://github.com/almet)!
288+ func TestRunReadAfterContainerExit (t * testing.T ) {
289+ skip .If (t , environment .RemoteDaemon ())
290+
291+ r := rand .New (rand .NewSource (0x123456 ))
292+
293+ const size = 18933764
294+ cmd := exec .Command ("docker" , "run" ,
295+ "--rm" , "-i" ,
296+ "alpine" ,
297+ "sh" , "-c" , "cat -" ,
298+ )
299+
300+ cmd .Stdin = io .LimitReader (r , size )
301+
302+ var stderr bytes.Buffer
303+ cmd .Stderr = & stderr
304+
305+ stdout , err := cmd .StdoutPipe ()
306+ assert .NilError (t , err )
307+
308+ err = cmd .Start ()
309+ assert .NilError (t , err )
310+
311+ buffer := make ([]byte , 1000 )
312+ counter := 0
313+ totalRead := 0
314+
315+ for {
316+ n , err := stdout .Read (buffer )
317+ if n > 0 {
318+ totalRead += n
319+ }
320+
321+ // Wait 0.1s every megabyte (approx.)
322+ if counter % 1000 == 0 {
323+ time .Sleep (100 * time .Millisecond )
324+ }
325+
326+ if err != nil || n == 0 {
327+ break
328+ }
329+
330+ counter ++
331+ }
332+
333+ err = cmd .Wait ()
334+ t .Logf ("Error: %v" , err )
335+ t .Logf ("Stderr: %s" , stderr .String ())
336+ assert .Check (t , err == nil )
337+ assert .Check (t , is .Equal (totalRead , size ))
338+ }
0 commit comments