mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Windows [TP4] Fix docker cp when volumes
Signed-off-by: John Howard <jhoward@microsoft.com>
This commit is contained in:
parent
d575d1e094
commit
3a852d8442
3 changed files with 87 additions and 74 deletions
|
@ -20,14 +20,12 @@ import (
|
|||
"github.com/docker/docker/daemon/network"
|
||||
derr "github.com/docker/docker/errors"
|
||||
"github.com/docker/docker/pkg/broadcaster"
|
||||
"github.com/docker/docker/pkg/fileutils"
|
||||
"github.com/docker/docker/pkg/ioutils"
|
||||
"github.com/docker/docker/pkg/mount"
|
||||
"github.com/docker/docker/pkg/nat"
|
||||
"github.com/docker/docker/pkg/promise"
|
||||
"github.com/docker/docker/pkg/signal"
|
||||
"github.com/docker/docker/pkg/symlink"
|
||||
"github.com/docker/docker/pkg/system"
|
||||
|
||||
"github.com/docker/docker/runconfig"
|
||||
"github.com/docker/docker/volume"
|
||||
)
|
||||
|
@ -514,77 +512,6 @@ func (container *Container) shouldRestart() bool {
|
|||
(container.hostConfig.RestartPolicy.Name == "on-failure" && container.ExitCode != 0)
|
||||
}
|
||||
|
||||
func (daemon *Daemon) mountVolumes(container *Container) error {
|
||||
mounts, err := daemon.setupMounts(container)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, m := range mounts {
|
||||
dest, err := container.GetResourcePath(m.Destination)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var stat os.FileInfo
|
||||
stat, err = os.Stat(m.Source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = fileutils.CreateIfNotExists(dest, stat.IsDir()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
opts := "rbind,ro"
|
||||
if m.Writable {
|
||||
opts = "rbind,rw"
|
||||
}
|
||||
|
||||
if err := mount.Mount(m.Source, dest, "bind", opts); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (container *Container) unmountVolumes(forceSyscall bool) error {
|
||||
var (
|
||||
volumeMounts []volume.MountPoint
|
||||
err error
|
||||
)
|
||||
|
||||
for _, mntPoint := range container.MountPoints {
|
||||
dest, err := container.GetResourcePath(mntPoint.Destination)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
volumeMounts = append(volumeMounts, volume.MountPoint{Destination: dest, Volume: mntPoint.Volume})
|
||||
}
|
||||
|
||||
// Append any network mounts to the list (this is a no-op on Windows)
|
||||
if volumeMounts, err = appendNetworkMounts(container, volumeMounts); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, volumeMount := range volumeMounts {
|
||||
if forceSyscall {
|
||||
if err := system.Unmount(volumeMount.Destination); err != nil {
|
||||
logrus.Warnf("%s unmountVolumes: Failed to force umount %v", container.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
if volumeMount.Volume != nil {
|
||||
if err := volumeMount.Volume.Unmount(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (container *Container) addBindMountPoint(name, source, destination string, rw bool) {
|
||||
container.MountPoints[destination] = &volume.MountPoint{
|
||||
Name: name,
|
||||
|
|
|
@ -20,7 +20,9 @@ import (
|
|||
"github.com/docker/docker/daemon/network"
|
||||
derr "github.com/docker/docker/errors"
|
||||
"github.com/docker/docker/pkg/directory"
|
||||
"github.com/docker/docker/pkg/fileutils"
|
||||
"github.com/docker/docker/pkg/idtools"
|
||||
"github.com/docker/docker/pkg/mount"
|
||||
"github.com/docker/docker/pkg/nat"
|
||||
"github.com/docker/docker/pkg/stringid"
|
||||
"github.com/docker/docker/pkg/symlink"
|
||||
|
@ -1435,3 +1437,74 @@ func (container *Container) ipcMounts() []execdriver.Mount {
|
|||
func detachMounted(path string) error {
|
||||
return syscall.Unmount(path, syscall.MNT_DETACH)
|
||||
}
|
||||
|
||||
func (daemon *Daemon) mountVolumes(container *Container) error {
|
||||
mounts, err := daemon.setupMounts(container)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, m := range mounts {
|
||||
dest, err := container.GetResourcePath(m.Destination)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var stat os.FileInfo
|
||||
stat, err = os.Stat(m.Source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = fileutils.CreateIfNotExists(dest, stat.IsDir()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
opts := "rbind,ro"
|
||||
if m.Writable {
|
||||
opts = "rbind,rw"
|
||||
}
|
||||
|
||||
if err := mount.Mount(m.Source, dest, "bind", opts); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (container *Container) unmountVolumes(forceSyscall bool) error {
|
||||
var (
|
||||
volumeMounts []volume.MountPoint
|
||||
err error
|
||||
)
|
||||
|
||||
for _, mntPoint := range container.MountPoints {
|
||||
dest, err := container.GetResourcePath(mntPoint.Destination)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
volumeMounts = append(volumeMounts, volume.MountPoint{Destination: dest, Volume: mntPoint.Volume})
|
||||
}
|
||||
|
||||
// Append any network mounts to the list (this is a no-op on Windows)
|
||||
if volumeMounts, err = appendNetworkMounts(container, volumeMounts); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, volumeMount := range volumeMounts {
|
||||
if forceSyscall {
|
||||
if err := system.Unmount(volumeMount.Destination); err != nil {
|
||||
logrus.Warnf("%s unmountVolumes: Failed to force umount %v", container.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
if volumeMount.Volume != nil {
|
||||
if err := volumeMount.Volume.Unmount(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -190,3 +190,16 @@ func (container *Container) ipcMounts() []execdriver.Mount {
|
|||
func getDefaultRouteMtu() (int, error) {
|
||||
return -1, errSystemNotSupported
|
||||
}
|
||||
|
||||
// TODO Windows: Fix Post-TP4. This is a hack to allow docker cp to work
|
||||
// against containers which have volumes. You will still be able to cp
|
||||
// to somewhere on the container drive, but not to any mounted volumes
|
||||
// inside the container. Without this fix, docker cp is broken to any
|
||||
// container which has a volume, regardless of where the file is inside the
|
||||
// container.
|
||||
func (daemon *Daemon) mountVolumes(container *Container) error {
|
||||
return nil
|
||||
}
|
||||
func (container *Container) unmountVolumes(forceSyscall bool) error {
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue