github.phpd.cn/hashicorp/packer@v1.3.2/builder/docker/step_pull.go (about) 1 package docker 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 8 "github.com/hashicorp/packer/helper/multistep" 9 "github.com/hashicorp/packer/packer" 10 ) 11 12 type StepPull struct{} 13 14 func (s *StepPull) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 15 config := state.Get("config").(*Config) 16 driver := state.Get("driver").(Driver) 17 ui := state.Get("ui").(packer.Ui) 18 19 if !config.Pull { 20 log.Println("Pull disabled, won't docker pull") 21 return multistep.ActionContinue 22 } 23 24 ui.Say(fmt.Sprintf("Pulling Docker image: %s", config.Image)) 25 26 if config.EcrLogin { 27 ui.Message("Fetching ECR credentials...") 28 29 username, password, err := config.EcrGetLogin(config.LoginServer) 30 if err != nil { 31 err := fmt.Errorf("Error fetching ECR credentials: %s", err) 32 state.Put("error", err) 33 ui.Error(err.Error()) 34 return multistep.ActionHalt 35 } 36 37 config.LoginUsername = username 38 config.LoginPassword = password 39 } 40 41 if config.Login || config.EcrLogin { 42 ui.Message("Logging in...") 43 err := driver.Login( 44 config.LoginServer, 45 config.LoginUsername, 46 config.LoginPassword) 47 if err != nil { 48 err := fmt.Errorf("Error logging in: %s", err) 49 state.Put("error", err) 50 ui.Error(err.Error()) 51 return multistep.ActionHalt 52 } 53 54 defer func() { 55 ui.Message("Logging out...") 56 if err := driver.Logout(config.LoginServer); err != nil { 57 ui.Error(fmt.Sprintf("Error logging out: %s", err)) 58 } 59 }() 60 } 61 62 if err := driver.Pull(config.Image); err != nil { 63 err := fmt.Errorf("Error pulling Docker image: %s", err) 64 state.Put("error", err) 65 ui.Error(err.Error()) 66 return multistep.ActionHalt 67 } 68 69 return multistep.ActionContinue 70 } 71 72 func (s *StepPull) Cleanup(state multistep.StateBag) { 73 }