Merge pull request #37400 from olljanat/34795-allow-npipe

Allow mount type npipe on service/stack
This commit is contained in:
Yong Tang 2018-09-26 09:54:42 -07:00 committed by GitHub
commit 7bfec8cd80
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 1 deletions

View file

@ -238,11 +238,13 @@ definitions:
- `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.
- `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.
- `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.
- `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container.
type: "string"
enum:
- "bind"
- "volume"
- "tmpfs"
- "npipe"
ReadOnly:
description: "Whether the mount should be read-only."
type: "boolean"

View file

@ -285,6 +285,8 @@ func convertMount(m api.Mount) enginemount.Mount {
mount.Type = enginemount.TypeVolume
case api.MountTypeTmpfs:
mount.Type = enginemount.TypeTmpfs
case api.MountTypeNamedPipe:
mount.Type = enginemount.TypeNamedPipe
}
if m.BindOptions != nil {

View file

@ -11,7 +11,8 @@ import (
func validateMounts(mounts []api.Mount) error {
for _, mount := range mounts {
// Target must always be absolute
if !filepath.IsAbs(mount.Target) {
// except if target is Windows named pipe
if !filepath.IsAbs(mount.Target) && mount.Type != api.MountTypeNamedPipe {
return fmt.Errorf("invalid mount target, must be an absolute path: %s", mount.Target)
}
@ -32,6 +33,10 @@ func validateMounts(mounts []api.Mount) error {
if mount.Source != "" {
return errors.New("invalid tmpfs source, source must be empty")
}
case api.MountTypeNamedPipe:
if mount.Source == "" {
return errors.New("invalid npipe source, source must not be empty")
}
default:
return fmt.Errorf("invalid mount type: %s", mount.Type)
}

View file

@ -1,8 +1,24 @@
// +build windows
package container // import "github.com/docker/docker/daemon/cluster/executor/container"
import (
"strings"
"testing"
"github.com/docker/swarmkit/api"
)
const (
testAbsPath = `c:\foo`
testAbsNonExistent = `c:\some-non-existing-host-path\`
)
func TestControllerValidateMountNamedPipe(t *testing.T) {
if _, err := newTestControllerWithMount(api.Mount{
Type: api.MountTypeNamedPipe,
Source: "",
Target: `\\.\pipe\foo`,
}); err == nil || !strings.Contains(err.Error(), "invalid npipe source, source must not be empty") {
t.Fatalf("expected error, got: %v", err)
}
}