mirror of https://github.com/docker/docs.git
Allow hyper-v driver to be used from non admin accounts and clean up the fixed disk after convertion.
Signed-off-by: James Nord <jnord@cloudbees.com>
This commit is contained in:
parent
b800a93f5e
commit
a5da41de6e
|
@ -428,8 +428,19 @@ func (d *Driver) generateDiskImage() (string, error) {
|
|||
diskImage := d.ResolveStorePath("disk.vhd")
|
||||
fixed := d.ResolveStorePath("fixed.vhd")
|
||||
|
||||
// Resizing vhds requires administrator priviledges
|
||||
// incase the user is only a hyper-v admin then create the disk at the target size to avoid resizing.
|
||||
isWindowsAdmin, err := isWindowsAdministrator()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
fixedDiskSize := "10MB"
|
||||
if !isWindowsAdmin {
|
||||
fixedDiskSize = toMb(d.DiskSize)
|
||||
}
|
||||
|
||||
log.Infof("Creating VHD")
|
||||
if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", "10MB", "-Fixed"); err != nil {
|
||||
if err := cmd("New-VHD", "-Path", quote(fixed), "-SizeBytes", fixedDiskSize, "-Fixed"); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
@ -451,12 +462,14 @@ func (d *Driver) generateDiskImage() (string, error) {
|
|||
}
|
||||
file.Close()
|
||||
|
||||
if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic"); err != nil {
|
||||
if err := cmd("Convert-VHD", "-Path", quote(fixed), "-DestinationPath", quote(diskImage), "-VHDType", "Dynamic", "-DeleteSource"); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
|
||||
return "", err
|
||||
if isWindowsAdmin {
|
||||
if err := cmd("Resize-VHD", "-Path", quote(diskImage), "-SizeBytes", toMb(d.DiskSize)); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
return diskImage, nil
|
||||
|
|
|
@ -69,20 +69,16 @@ func hypervAvailable() error {
|
|||
}
|
||||
|
||||
func isAdministrator() (bool, error) {
|
||||
var hypervAdmin bool
|
||||
var windowsAdmin bool
|
||||
var windowsErr error
|
||||
hypervAdmin := isHypervAdministrator()
|
||||
|
||||
hypervAdmin = isHypervAdministrator()
|
||||
|
||||
if hypervAdmin == true {
|
||||
if hypervAdmin {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
windowsAdmin, windowsErr = isWindowsAdministrator()
|
||||
windowsAdmin, err := isWindowsAdministrator()
|
||||
|
||||
if windowsErr != nil {
|
||||
return false, windowsErr
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return windowsAdmin, nil
|
||||
|
@ -91,6 +87,7 @@ func isAdministrator() (bool, error) {
|
|||
func isHypervAdministrator() bool {
|
||||
stdout, err := cmdOut(`@([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Hyper-V Administrators")`)
|
||||
if err != nil {
|
||||
log.Debug(err)
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue