|
|
|
|
@ -23,7 +23,7 @@ type Communicator struct {
|
|
|
|
|
ContainerDir string
|
|
|
|
|
Version *version.Version
|
|
|
|
|
Config *Config
|
|
|
|
|
containerUser *string
|
|
|
|
|
ContainerUser string
|
|
|
|
|
lock sync.Mutex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -322,67 +322,22 @@ func (c *Communicator) run(cmd *exec.Cmd, remote *packer.RemoteCmd, stdin io.Wri
|
|
|
|
|
|
|
|
|
|
// TODO Workaround for #5307. Remove once #5409 is fixed.
|
|
|
|
|
func (c *Communicator) fixDestinationOwner(destination string) error {
|
|
|
|
|
if c.containerUser == nil {
|
|
|
|
|
containerUser, err := c.discoverContainerUser()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
c.containerUser = &containerUser
|
|
|
|
|
if !c.Config.FixUploadOwner {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if *c.containerUser != "" {
|
|
|
|
|
chownArgs := []string{
|
|
|
|
|
"docker", "exec", "--user", "root", c.ContainerID, "/bin/sh", "-c",
|
|
|
|
|
fmt.Sprintf("chown -R %s %s", *c.containerUser, destination),
|
|
|
|
|
}
|
|
|
|
|
if _, err := c.runLocalCommand(chownArgs[0], chownArgs[1:]...); err != nil {
|
|
|
|
|
return fmt.Errorf("Failed to set owner of the uploaded file: %s", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Communicator) discoverContainerUser() (string, error) {
|
|
|
|
|
var err error
|
|
|
|
|
var stdout []byte
|
|
|
|
|
inspectArgs := []string{"docker", "inspect", "--format", "{{.Config.User}}", c.ContainerID}
|
|
|
|
|
if stdout, err = c.runLocalCommand(inspectArgs[0], inspectArgs[1:]...); err != nil {
|
|
|
|
|
return "", fmt.Errorf("Failed to inspect the container: %s", err)
|
|
|
|
|
owner := c.ContainerUser
|
|
|
|
|
if owner == "" {
|
|
|
|
|
owner = "root"
|
|
|
|
|
}
|
|
|
|
|
return strings.TrimSpace(string(stdout)), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Communicator) runLocalCommand(name string, arg ...string) (stdout []byte, err error) {
|
|
|
|
|
localCmd := exec.Command(name, arg...)
|
|
|
|
|
|
|
|
|
|
stdoutP, err := localCmd.StdoutPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("failed to open stdout pipe, %s", err)
|
|
|
|
|
chownArgs := []string{
|
|
|
|
|
"docker", "exec", "--user", "root", c.ContainerID, "/bin/sh", "-c",
|
|
|
|
|
fmt.Sprintf("chown -R %s %s", owner, destination),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stderrP, err := localCmd.StderrPipe()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("failed to open stderr pipe, %s", err)
|
|
|
|
|
if output, err := exec.Command(chownArgs[0], chownArgs[1:]...).CombinedOutput(); err != nil {
|
|
|
|
|
return fmt.Errorf("Failed to set owner of the uploaded file: %s, %s", err, output)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = localCmd.Start(); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("failed to start command, %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stdout, err = ioutil.ReadAll(stdoutP)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("failed to read from stdout pipe, %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stderr, err := ioutil.ReadAll(stderrP)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("failed to read from stderr pipe, %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := localCmd.Wait(); err != nil {
|
|
|
|
|
return nil, fmt.Errorf("%s, %s", stderr, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return stdout, nil
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|