| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | package docker | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-01-22 15:32:33 -08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2018-01-22 15:32:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-19 16:18:44 -08:00
										 |  |  | 	"github.com/hashicorp/packer/helper/multistep" | 
					
						
							| 
									
										
										
										
											2017-04-04 13:39:01 -07:00
										 |  |  | 	"github.com/hashicorp/packer/packer" | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StepCommit commits the container to a image. | 
					
						
							|  |  |  | type StepCommit struct { | 
					
						
							|  |  |  | 	imageId string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-29 16:50:02 +01:00
										 |  |  | func (s *StepCommit) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | 	driver := state.Get("driver").(Driver) | 
					
						
							|  |  |  | 	containerId := state.Get("container_id").(string) | 
					
						
							| 
									
										
										
										
											2016-11-24 11:42:34 +01:00
										 |  |  | 	config := state.Get("config").(*Config) | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | 	ui := state.Get("ui").(packer.Ui) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-27 14:51:50 -07:00
										 |  |  | 	if config.WindowsContainer { | 
					
						
							|  |  |  | 		// docker can't commit a running Windows container | 
					
						
							|  |  |  | 		err := driver.StopContainer(containerId) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			state.Put("error", err) | 
					
						
							|  |  |  | 			ui.Error(fmt.Sprintf("Error halting windows container for commit: %s", | 
					
						
							|  |  |  | 				err.Error())) | 
					
						
							|  |  |  | 			return multistep.ActionHalt | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | 	ui.Say("Committing the container") | 
					
						
							| 
									
										
										
										
											2016-11-24 13:33:42 +01:00
										 |  |  | 	imageId, err := driver.Commit(containerId, config.Author, config.Changes, config.Message) | 
					
						
							| 
									
										
										
										
											2014-07-20 19:57:10 +01:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		state.Put("error", err) | 
					
						
							|  |  |  | 		ui.Error(err.Error()) | 
					
						
							|  |  |  | 		return multistep.ActionHalt | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Save the container ID | 
					
						
							|  |  |  | 	s.imageId = imageId | 
					
						
							|  |  |  | 	state.Put("image_id", s.imageId) | 
					
						
							|  |  |  | 	ui.Message(fmt.Sprintf("Image ID: %s", s.imageId)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return multistep.ActionContinue | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *StepCommit) Cleanup(state multistep.StateBag) {} |