7a9cb29fb9
This enables image lookup when creating a container to fail when the reference exists but it is for the wrong platform. This prevents trying to run an image for the wrong platform, as can be the case with, for example binfmt_misc+qemu. Signed-off-by: Brian Goff <cpuguy83@gmail.com>
77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
// +build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"math/rand"
|
|
"strings"
|
|
"testing"
|
|
|
|
winio "github.com/Microsoft/go-winio"
|
|
"github.com/Microsoft/hcsshim/osversion"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/container"
|
|
"github.com/docker/docker/api/types/mount"
|
|
"gotest.tools/v3/assert"
|
|
is "gotest.tools/v3/assert/cmp"
|
|
)
|
|
|
|
func (s *DockerSuite) TestContainersAPICreateMountsBindNamedPipe(c *testing.T) {
|
|
testRequires(c, testEnv.IsLocalDaemon, DaemonIsWindowsAtLeastBuild(osversion.RS3)) // Named pipe support was added in RS3
|
|
|
|
// Create a host pipe to map into the container
|
|
hostPipeName := fmt.Sprintf(`\\.\pipe\docker-cli-test-pipe-%x`, rand.Uint64())
|
|
pc := &winio.PipeConfig{
|
|
SecurityDescriptor: "D:P(A;;GA;;;AU)", // Allow all users access to the pipe
|
|
}
|
|
l, err := winio.ListenPipe(hostPipeName, pc)
|
|
if err != nil {
|
|
c.Fatal(err)
|
|
}
|
|
defer l.Close()
|
|
|
|
// Asynchronously read data that the container writes to the mapped pipe.
|
|
var b []byte
|
|
ch := make(chan error)
|
|
go func() {
|
|
conn, err := l.Accept()
|
|
if err == nil {
|
|
b, err = ioutil.ReadAll(conn)
|
|
conn.Close()
|
|
}
|
|
ch <- err
|
|
}()
|
|
|
|
containerPipeName := `\\.\pipe\docker-cli-test-pipe`
|
|
text := "hello from a pipe"
|
|
cmd := fmt.Sprintf("echo %s > %s", text, containerPipeName)
|
|
name := "test-bind-npipe"
|
|
|
|
ctx := context.Background()
|
|
client := testEnv.APIClient()
|
|
_, err = client.ContainerCreate(ctx,
|
|
&container.Config{
|
|
Image: testEnv.PlatformDefaults.BaseImage,
|
|
Cmd: []string{"cmd", "/c", cmd},
|
|
}, &container.HostConfig{
|
|
Mounts: []mount.Mount{
|
|
{
|
|
Type: "npipe",
|
|
Source: hostPipeName,
|
|
Target: containerPipeName,
|
|
},
|
|
},
|
|
},
|
|
nil, nil, name)
|
|
assert.NilError(c, err)
|
|
|
|
err = client.ContainerStart(ctx, name, types.ContainerStartOptions{})
|
|
assert.NilError(c, err)
|
|
|
|
err = <-ch
|
|
assert.NilError(c, err)
|
|
assert.Check(c, is.Equal(text, strings.TrimSpace(string(b))))
|
|
}
|