Create a disk image

Create a disk image from a source disk and store it in a Cloud Storage location.

Explore further

For detailed documentation that includes this code sample, see the following:

Code sample

Go

Before trying this sample, follow the Go setup instructions in the Compute Engine quickstart using client libraries . For more information, see the Compute Engine Go API reference documentation .

To authenticate to Compute Engine, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 ( 
  
 "context" 
  
 "fmt" 
  
 "io" 
  
 compute 
  
 "cloud.google.com/go/compute/apiv1" 
  
 computepb 
  
 "cloud.google.com/go/compute/apiv1/computepb" 
 ) 
 // Creates a disk image from an existing disk 
 func 
  
 createImageFromDisk 
 ( 
  
 w 
  
 io 
 . 
 Writer 
 , 
  
 projectID 
 , 
  
 zone 
 , 
  
 sourceDiskName 
 , 
  
 imageName 
  
 string 
 , 
  
 storageLocations 
  
 [] 
 string 
 , 
  
 forceCreate 
  
 bool 
 , 
 ) 
  
 error 
  
 { 
  
 // projectID := "your_project_id" 
  
 // zone := "us-central1-a" 
  
 // sourceDiskName := "your_disk_name" 
  
 // imageName := "my_image" 
  
 // // If storageLocations empty, automatically selects the closest one to the source 
  
 // storageLocations = []string{} 
  
 // // If forceCreate is set to `true`, proceeds even if the disk is attached to 
  
 // // a running instance. This may compromise integrity of the image! 
  
 // forceCreate = false 
  
 ctx 
  
 := 
  
 context 
 . 
 Background 
 () 
  
 disksClient 
 , 
  
 err 
  
 := 
  
 compute 
 . 
  NewDisksRESTClient 
 
 ( 
 ctx 
 ) 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "NewDisksRESTClient: %w" 
 , 
  
 err 
 ) 
  
 } 
  
 defer 
  
 disksClient 
 . 
 Close 
 () 
  
 imagesClient 
 , 
  
 err 
  
 := 
  
 compute 
 . 
  NewImagesRESTClient 
 
 ( 
 ctx 
 ) 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "NewImagesRESTClient: %w" 
 , 
  
 err 
 ) 
  
 } 
  
 defer 
  
 imagesClient 
 . 
 Close 
 () 
  
 // Get the source disk 
  
 source_req 
  
 := 
  
& computepb 
 . 
 GetDiskRequest 
 { 
  
 Disk 
 : 
  
 sourceDiskName 
 , 
  
 Project 
 : 
  
 projectID 
 , 
  
 Zone 
 : 
  
 zone 
 , 
  
 } 
  
 disk 
 , 
  
 err 
  
 := 
  
 disksClient 
 . 
 Get 
 ( 
 ctx 
 , 
  
 source_req 
 ) 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "unable to get source disk: %w" 
 , 
  
 err 
 ) 
  
 } 
  
 // Create the image 
  
 req 
  
 := 
  
 computepb 
 . 
 InsertImageRequest 
 { 
  
 ForceCreate 
 : 
  
& forceCreate 
 , 
  
 ImageResource 
 : 
  
& computepb 
 . 
 Image 
 { 
  
 Name 
 : 
  
& imageName 
 , 
  
 SourceDisk 
 : 
  
 disk 
 . 
 SelfLink 
 , 
  
 StorageLocations 
 : 
  
 storageLocations 
 , 
  
 }, 
  
 Project 
 : 
  
 projectID 
 , 
  
 } 
  
 op 
 , 
  
 err 
  
 := 
  
 imagesClient 
 . 
 Insert 
 ( 
 ctx 
 , 
  
& req 
 ) 
  
 if 
  
 err 
  
 = 
  
 op 
 . 
 Wait 
 ( 
 ctx 
 ); 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "unable to wait for the operation: %w" 
 , 
  
 err 
 ) 
  
 } 
  
 fmt 
 . 
 Fprintf 
 ( 
 w 
 , 
  
 "Disk image %s created\n" 
 , 
  
 imageName 
 ) 
  
 return 
  
 nil 
 } 
 

Java

Before trying this sample, follow the Java setup instructions in the Compute Engine quickstart using client libraries . For more information, see the Compute Engine Java API reference documentation .

To authenticate to Compute Engine, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.cloud.compute.v1. Disk 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. DisksClient 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. Image 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. ImagesClient 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. InsertImageRequest 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. Instance 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. InstancesClient 
 
 ; 
 import 
  
 com.google.cloud.compute.v1. Operation 
 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.util.Arrays 
 ; 
 import 
  
 java.util.HashMap 
 ; 
 import 
  
 java.util.Map 
 ; 
 import 
  
 java.util.concurrent.ExecutionException 
 ; 
 import 
  
 java.util.concurrent.TimeUnit 
 ; 
 import 
  
 java.util.concurrent.TimeoutException 
 ; 
 public 
  
 class 
 CreateImage 
  
 { 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
 ExecutionException 
 , 
  
 InterruptedException 
 , 
  
 TimeoutException 
  
 { 
  
 // TODO(developer): Replace these variables before running the sample. 
  
 // Project ID or project number of the Cloud project you use. 
  
 String 
  
 project 
  
 = 
  
 "your-project-id" 
 ; 
  
 // Zone of the disk you copy from. 
  
 String 
  
 zone 
  
 = 
  
 "europe-central2-b" 
 ; 
  
 // Name of the source disk you copy from. 
  
 String 
  
 sourceDiskName 
  
 = 
  
 "source-disk-name" 
 ; 
  
 // Name of the image you want to create. 
  
 String 
  
 imageName 
  
 = 
  
 "your-image-name" 
 ; 
  
 // Storage location for the image. If the value is undefined, 
  
 // function will store the image in the multi-region closest to your image's source location. 
  
 String 
  
 storageLocation 
  
 = 
  
 "eu" 
 ; 
  
 // Create the image even if the source disk is attached to a running instance. 
  
 boolean 
  
 forceCreate 
  
 = 
  
 false 
 ; 
  
 createImage 
 ( 
 project 
 , 
  
 zone 
 , 
  
 sourceDiskName 
 , 
  
 imageName 
 , 
  
 storageLocation 
 , 
  
 forceCreate 
 ); 
  
 } 
  
 // Creates a new disk image from the specified source disk. 
  
 public 
  
 static 
  
 void 
  
 createImage 
 ( 
 String 
  
 project 
 , 
  
 String 
  
 zone 
 , 
  
 String 
  
 sourceDiskName 
 , 
  
 String 
  
 imageName 
 , 
  
 String 
  
 storageLocation 
 , 
  
 boolean 
  
 forceCreate 
 ) 
  
 throws 
  
 IOException 
 , 
  
 ExecutionException 
 , 
  
 InterruptedException 
 , 
  
 TimeoutException 
  
 { 
  
 // Initialize client that will be used to send requests. This client only needs to be created 
  
 // once, and can be reused for multiple requests. After completing all of your requests, call 
  
 // the `client.close()` method on the client to safely 
  
 // clean up any remaining background resources. 
  
 try 
  
 ( 
  ImagesClient 
 
  
 imagesClient 
  
 = 
  
  ImagesClient 
 
 . 
 create 
 (); 
  
  InstancesClient 
 
  
 instancesClient 
  
 = 
  
  InstancesClient 
 
 . 
 create 
 (); 
  
  DisksClient 
 
  
 disksClient 
  
 = 
  
  DisksClient 
 
 . 
 create 
 ()) 
  
 { 
  
  Disk 
 
  
 disk 
  
 = 
  
 disksClient 
 . 
 get 
 ( 
 project 
 , 
  
 zone 
 , 
  
 sourceDiskName 
 ); 
  
 // Getting instances where source disk is attached. 
  
 for 
  
 ( 
 String 
  
 fullInstanceName 
  
 : 
  
 disk 
 . 
  getUsersList 
 
 ()) 
  
 { 
  
 Map<String 
 , 
  
 String 
>  
 instanceInfo 
  
 = 
  
 parseInstanceName 
 ( 
 fullInstanceName 
 ); 
  
  Instance 
 
  
 instance 
  
 = 
  
 instancesClient 
 . 
 get 
 ( 
 instanceInfo 
 . 
 get 
 ( 
 "instanceProjectId" 
 ), 
  
 instanceInfo 
 . 
 get 
 ( 
 "instanceZone" 
 ), 
  
 instanceInfo 
 . 
 get 
 ( 
 "instanceName" 
 )); 
  
 // Сheck whether the instances are stopped. 
  
 if 
  
 ( 
 ! 
 Arrays 
 . 
 asList 
 ( 
 "TERMINATED" 
 , 
  
 "STOPPED" 
 ). 
 contains 
 ( 
 instance 
 . 
 getStatus 
 ()) 
 && 
 ! 
 forceCreate 
 ) 
  
 { 
  
 throw 
  
 new 
  
 IllegalStateException 
 ( 
  
 String 
 . 
 format 
 ( 
  
 "Instance %s should be stopped. For Windows instances please stop the instance " 
  
 + 
  
 "using GCESysprep command. For Linux instances just shut it down normally." 
  
 + 
  
 " You can suppress this error and create an image of the disk by setting " 
  
 + 
  
 "'forceCreate' parameter to true (not recommended). " 
  
 + 
  
 "More information here: " 
  
 + 
  
 "* https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image#api" 
  
 + 
  
 "* https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#prepare_instance_for_image" 
 , 
  
 instanceInfo 
 . 
 get 
 ( 
 "instanceName" 
 ))); 
  
 } 
  
 } 
  
 if 
  
 ( 
 forceCreate 
 ) 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
  
 "Warning: forceCreate option compromise the integrity of your image. " 
  
 + 
  
 "Stop the instance before you create the image if possible." 
 ); 
  
 } 
  
 // Create Image. 
  
 I Image 
image 
  
 = 
  
 I Image 
newBuilder 
 () 
  
 . 
 setName 
 ( 
 imageName 
 ) 
  
 . 
 setSourceDisk 
 ( 
 String 
 . 
 format 
 ( 
 "/zones/%s/disks/%s" 
 , 
  
 zone 
 , 
  
 sourceDiskName 
 )) 
  
 . 
 addStorageLocations 
 ( 
 storageLocation 
 . 
 isEmpty 
 () 
  
 ? 
  
 "" 
  
 : 
  
 storageLocation 
 ) 
  
 . 
 build 
 (); 
  
 I InsertImageRequest 
insertImageRequest 
  
 = 
  
 I InsertImageRequest 
newBuilder 
 () 
  
 . 
 setProject 
 ( 
 project 
 ) 
  
 . 
 s setForceCreate 
forceCreate 
 ) 
  
 . 
 setImageResource 
 ( 
 image 
 ) 
  
 . 
 build 
 (); 
  
 O Operation 
response 
  
 = 
  
 imagesClient 
 . 
 insertAsync 
 ( 
 insertImageRequest 
 ). 
 get 
 ( 
 5 
 , 
  
 TimeUnit 
 . 
 MINUTES 
 ); 
  
 if 
  
 ( 
 rresponse 
 . 
  hasError 
 
 () 
  
 { 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Image creation failed ! ! " 
  
 + 
  
 response 
 ); 
  
 return 
 ; 
  
 } 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Image created." 
 ); 
  
 } 
  
 } 
  
 public 
  
 static 
  
 Map<String 
 , 
  
 String 
>  
 parseInstanceName 
 ( 
 String 
  
 name 
 ) 
  
 { 
  
 String 
 [] 
  
 parsedName 
  
 = 
  
 name 
 . 
 split 
 ( 
 "/" 
 ); 
  
 int 
  
 splitLength 
  
 = 
  
 parsedName 
 . 
 length 
 ; 
  
 if 
  
 ( 
 splitLength 
 < 
 5 
 ) 
  
 { 
  
 throw 
  
 new 
  
 IllegalArgumentException 
 ( 
  
 "Provide correct instance name in the following format: " 
  
 + 
  
 "https://www.googleapis.com/compute/v1/projects/PROJECT/zones/ZONE/instances/INSTANCE_NAME" 
 ); 
  
 } 
  
 return 
  
 new 
  
 HashMap 
<> () 
  
 { 
  
 { 
  
 put 
 ( 
 "instanceName" 
 , 
  
 parsedName 
 [ 
 splitLength 
  
 - 
  
 1 
 ] 
 ); 
  
 put 
 ( 
 "instanceZone" 
 , 
  
 parsedName 
 [ 
 splitLength 
  
 - 
  
 3 
 ] 
 ); 
  
 put 
 ( 
 "instanceProjectId" 
 , 
  
 parsedName 
 [ 
 splitLength 
  
 - 
  
 5 
 ] 
 ); 
  
 } 
  
 }; 
  
 } 
 } 
 

Python

Before trying this sample, follow the Python setup instructions in the Compute Engine quickstart using client libraries . For more information, see the Compute Engine Python API reference documentation .

To authenticate to Compute Engine, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  from 
  
 __future__ 
  
 import 
 annotations 
 import 
  
 sys 
 from 
  
 typing 
  
 import 
 Any 
 import 
  
 warnings 
 from 
  
 google.api_core.extended_operation 
  
 import 
 ExtendedOperation 
 from 
  
 google.cloud 
  
 import 
  compute_v1 
 
 def 
  
 wait_for_extended_operation 
 ( 
 operation 
 : 
 ExtendedOperation 
 , 
 verbose_name 
 : 
 str 
 = 
 "operation" 
 , 
 timeout 
 : 
 int 
 = 
 300 
 ) 
 - 
> Any 
 : 
  
 """ 
 Waits for the extended (long-running) operation to complete. 
 If the operation is successful, it will return its result. 
 If the operation ends with an error, an exception will be raised. 
 If there were any warnings during the execution of the operation 
 they will be printed to sys.stderr. 
 Args: 
 operation: a long-running operation you want to wait on. 
 verbose_name: (optional) a more verbose name of the operation, 
 used only during error and warning reporting. 
 timeout: how long (in seconds) to wait for operation to finish. 
 If None, wait indefinitely. 
 Returns: 
 Whatever the operation.result() returns. 
 Raises: 
 This method will raise the exception received from `operation.exception()` 
 or RuntimeError if there is no exception set, but there is an `error_code` 
 set for the `operation`. 
 In case of an operation taking longer than `timeout` seconds to complete, 
 a `concurrent.futures.TimeoutError` will be raised. 
 """ 
 result 
 = 
 operation 
 . 
 result 
 ( 
 timeout 
 = 
 timeout 
 ) 
 if 
 operation 
 . 
 error_code 
 : 
 print 
 ( 
 f 
 "Error during 
 { 
 verbose_name 
 } 
 : [Code: 
 { 
 operation 
 . 
 error_code 
 } 
 ]: 
 { 
 operation 
 . 
 error_message 
 } 
 " 
 , 
 file 
 = 
 sys 
 . 
 stderr 
 , 
 flush 
 = 
 True 
 , 
 ) 
 print 
 ( 
 f 
 "Operation ID: 
 { 
 operation 
 . 
 name 
 } 
 " 
 , 
 file 
 = 
 sys 
 . 
 stderr 
 , 
 flush 
 = 
 True 
 ) 
 raise 
 operation 
 . 
 exception 
 () 
 or 
 RuntimeError 
 ( 
 operation 
 . 
 error_message 
 ) 
 if 
 operation 
 . 
 warnings 
 : 
 print 
 ( 
 f 
 "Warnings during 
 { 
 verbose_name 
 } 
 : 
 \n 
 " 
 , 
 file 
 = 
 sys 
 . 
 stderr 
 , 
 flush 
 = 
 True 
 ) 
 for 
 warning 
 in 
 operation 
 . 
 warnings 
 : 
 print 
 ( 
 f 
 " - 
 { 
 warning 
 . 
 code 
 } 
 : 
 { 
 warning 
 . 
 message 
 } 
 " 
 , 
 file 
 = 
 sys 
 . 
 stderr 
 , 
 flush 
 = 
 True 
 ) 
 return 
 result 
 STOPPED_MACHINE_STATUS 
 = 
 ( 
  compute_v1 
 
 . 
  Instance 
 
 . 
 Status 
 . 
 TERMINATED 
 . 
 name 
 , 
  compute_v1 
 
 . 
  Instance 
 
 . 
 Status 
 . 
 STOPPED 
 . 
 name 
 , 
 ) 
 def 
  
 create_image_from_disk 
 ( 
 project_id 
 : 
 str 
 , 
 zone 
 : 
 str 
 , 
 source_disk_name 
 : 
 str 
 , 
 image_name 
 : 
 str 
 , 
 storage_location 
 : 
 str 
 | 
 None 
 = 
 None 
 , 
 force_create 
 : 
 bool 
 = 
 False 
 , 
 ) 
 - 
> compute_v1 
 . 
 Image 
 : 
  
 """ 
 Creates a new disk image. 
 Args: 
 project_id: project ID or project number of the Cloud project you use. 
 zone: zone of the disk you copy from. 
 source_disk_name: name of the source disk you copy from. 
 image_name: name of the image you want to create. 
 storage_location: storage location for the image. If the value is undefined, 
 function will store the image in the multi-region closest to your image's 
 source location. 
 force_create: create the image even if the source disk is attached to a 
 running instance. 
 Returns: 
 An Image object. 
 """ 
 image_client 
 = 
  compute_v1 
 
 . 
  ImagesClient 
 
 () 
 disk_client 
 = 
  compute_v1 
 
 . 
  DisksClient 
 
 () 
 instance_client 
 = 
  compute_v1 
 
 . 
  InstancesClient 
 
 () 
 # Get source disk 
 disk 
 = 
 disk_client 
 . 
  get 
 
 ( 
 project 
 = 
 project_id 
 , 
 zone 
 = 
 zone 
 , 
 disk 
 = 
 source_disk_name 
 ) 
 for 
 disk_user 
 in 
 disk 
 . 
 users 
 : 
 instance_name 
 = 
 disk_user 
 . 
 split 
 ( 
 "/" 
 )[ 
 - 
 1 
 ] 
 instance 
 = 
 instance_client 
 . 
  get 
 
 ( 
 project 
 = 
 project_id 
 , 
 zone 
 = 
 zone 
 , 
 instance 
 = 
 instance_name 
 ) 
 if 
 instance 
 . 
 status 
 in 
 STOPPED_MACHINE_STATUS 
 : 
 continue 
 if 
 not 
 force_create 
 : 
 raise 
 RuntimeError 
 ( 
 f 
 "Instance 
 { 
 disk_user 
 } 
 should be stopped. For Windows instances please " 
 f 
 "stop the instance using `GCESysprep` command. For Linux instances just " 
 f 
 "shut it down normally. You can supress this error and create an image of" 
 f 
 "the disk by setting `force_create` parameter to true (not recommended). 
 \n 
 " 
 f 
 "More information here: 
 \n 
 " 
 f 
 " * https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image#api 
 \n 
 " 
 f 
 " * https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images#prepare_instance_for_image" 
 ) 
 else 
 : 
 warnings 
 . 
 warn 
 ( 
 f 
 "Warning: The `force_create` option may compromise the integrity of your image. " 
 f 
 "Stop the 
 { 
 disk_user 
 } 
 instance before you create the image if possible." 
 ) 
 # Create image 
 image 
 = 
  compute_v1 
 
 . 
  Image 
 
 () 
 image 
 . 
 source_disk 
 = 
 disk 
 . 
 self_link 
 image 
 . 
 name 
 = 
 image_name 
 if 
 storage_location 
 : 
 image 
 . 
 storage_locations 
 = 
 [ 
 storage_location 
 ] 
 operation 
 = 
 image_client 
 . 
  insert 
 
 ( 
 project 
 = 
 project_id 
 , 
 image_resource 
 = 
 image 
 ) 
 wait_for_extended_operation 
 ( 
 operation 
 , 
 "image creation from disk" 
 ) 
 return 
 image_client 
 . 
  get 
 
 ( 
 project 
 = 
 project_id 
 , 
 image 
 = 
 image_name 
 ) 
 

What's next

To search and filter code samples for other Google Cloud products, see the Google Cloud sample browser .

Design a Mobile Site
View Site in Mobile | Classic
Share by: