2013-11-09 02:43:41 -05:00
|
|
|
package docker
|
|
|
|
|
|
|
|
import (
|
2018-01-22 18:32:33 -05:00
|
|
|
"context"
|
2017-10-10 16:45:47 -04:00
|
|
|
"fmt"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
2018-01-22 20:21:10 -05:00
|
|
|
|
2020-11-17 19:31:03 -05:00
|
|
|
"github.com/hashicorp/packer/packer-plugin-sdk/multistep"
|
2013-11-09 02:43:41 -05:00
|
|
|
)
|
|
|
|
|
2015-06-15 01:09:38 -04:00
|
|
|
type StepConnectDocker struct{}
|
2013-11-09 02:43:41 -05:00
|
|
|
|
2019-03-29 11:50:02 -04:00
|
|
|
func (s *StepConnectDocker) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
2019-12-17 17:34:58 -05:00
|
|
|
config, ok := state.Get("config").(*Config)
|
|
|
|
if !ok {
|
|
|
|
err := fmt.Errorf("error encountered obtaining docker config")
|
|
|
|
state.Put("error", err)
|
|
|
|
return multistep.ActionHalt
|
|
|
|
}
|
|
|
|
|
2013-11-09 02:43:41 -05:00
|
|
|
containerId := state.Get("container_id").(string)
|
2015-05-29 12:29:59 -04:00
|
|
|
driver := state.Get("driver").(Driver)
|
2013-11-09 02:43:41 -05:00
|
|
|
tempDir := state.Get("temp_dir").(string)
|
|
|
|
|
2015-05-29 12:29:59 -04:00
|
|
|
// Get the version so we can pass it to the communicator
|
|
|
|
version, err := driver.Version()
|
|
|
|
if err != nil {
|
|
|
|
state.Put("error", err)
|
|
|
|
return multistep.ActionHalt
|
|
|
|
}
|
|
|
|
|
2017-10-10 16:45:47 -04:00
|
|
|
containerUser, err := getContainerUser(containerId)
|
|
|
|
if err != nil {
|
|
|
|
state.Put("error", err)
|
|
|
|
return multistep.ActionHalt
|
|
|
|
}
|
|
|
|
|
2013-11-09 02:43:41 -05:00
|
|
|
// Create the communicator that talks to Docker via various
|
|
|
|
// os/exec tricks.
|
2019-03-27 17:51:50 -04:00
|
|
|
if config.WindowsContainer {
|
2019-03-28 12:38:17 -04:00
|
|
|
comm := &WindowsContainerCommunicator{Communicator{
|
2019-03-27 17:51:50 -04:00
|
|
|
ContainerID: containerId,
|
|
|
|
HostDir: tempDir,
|
|
|
|
ContainerDir: config.ContainerDir,
|
|
|
|
Version: version,
|
|
|
|
Config: config,
|
|
|
|
ContainerUser: containerUser,
|
2019-03-29 14:14:01 -04:00
|
|
|
EntryPoint: []string{"powershell"},
|
2019-03-28 12:38:17 -04:00
|
|
|
},
|
2019-03-27 17:51:50 -04:00
|
|
|
}
|
|
|
|
state.Put("communicator", comm)
|
2013-11-09 02:43:41 -05:00
|
|
|
|
2019-03-27 17:51:50 -04:00
|
|
|
} else {
|
|
|
|
comm := &Communicator{
|
|
|
|
ContainerID: containerId,
|
|
|
|
HostDir: tempDir,
|
|
|
|
ContainerDir: config.ContainerDir,
|
|
|
|
Version: version,
|
|
|
|
Config: config,
|
|
|
|
ContainerUser: containerUser,
|
2019-03-29 14:14:01 -04:00
|
|
|
EntryPoint: []string{"/bin/sh", "-c"},
|
2019-03-27 17:51:50 -04:00
|
|
|
}
|
|
|
|
state.Put("communicator", comm)
|
|
|
|
}
|
2015-06-15 01:09:38 -04:00
|
|
|
return multistep.ActionContinue
|
2013-11-09 02:43:41 -05:00
|
|
|
}
|
|
|
|
|
2015-06-15 01:09:38 -04:00
|
|
|
func (s *StepConnectDocker) Cleanup(state multistep.StateBag) {}
|
2017-10-10 16:45:47 -04:00
|
|
|
|
|
|
|
func getContainerUser(containerId string) (string, error) {
|
|
|
|
inspectArgs := []string{"docker", "inspect", "--format", "{{.Config.User}}", containerId}
|
|
|
|
stdout, err := exec.Command(inspectArgs[0], inspectArgs[1:]...).Output()
|
|
|
|
if err != nil {
|
|
|
|
errStr := fmt.Sprintf("Failed to inspect the container: %s", err)
|
|
|
|
if ee, ok := err.(*exec.ExitError); ok {
|
|
|
|
errStr = fmt.Sprintf("%s, %s", errStr, ee.Stderr)
|
|
|
|
}
|
|
|
|
return "", fmt.Errorf(errStr)
|
|
|
|
}
|
|
|
|
return strings.TrimSpace(string(stdout)), nil
|
|
|
|
}
|