2017-11-20 1 views
3

I hängten Dateiinhalt zu bekommen bin versucht Go Docker API:Erste Dateikontext der eingebundenen Datei mit Go Docker API

Datei secret.txt speichert eine Zeile TOKEN=MY_TOKEN

Code:

cli, err := client.NewEnvClient() 
if err != nil { 
    panic(err) 
} 
defer cli.Close() 

ctx := context.Background() 

_, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{}) 
if err != nil { 
    panic(err) 

} 

containerConfig := &container.Config{ 
    Image: "alpine", 
    Cmd: []string{"echo", "hello world"}, 
} 

// mounted file 
h := container.HostConfig{ 
    Binds: []string{"/etc/secret.txt"}, 
} 

resp, err := cli.ContainerCreate(ctx, containerConfig, &h, nil, "") 
if err != nil { 
    panic(err) 
} 

rc, _, err := cli.CopyFromContainer(context.Background(), resp.ID, "/etc/secret.txt") 
if err != nil { 
    fmt.Println(err.Error()) 
} 
b, err := ioutil.ReadAll(rc) 
if err != nil { 
    fmt.Println(err.Error()) 
} 
rc.Close() 
fmt.Println(string(b), " len=", len(string(b))) 

Ich erhalte secret.txt Datei mit zusätzlichen Informationen:

secret.txt/0040755000000000000000000000000013204637420011354 5ustar0000000000000000 len= 153

Wie bekomme ich die tatsächlichen Daten aus der Textdatei? Danke

Antwort

2

Zuerst wird der Binds Parameter des Formats "source:target[:ro]", so sollten Sie es "/etc/secret.txt:/etc/secret.txt" haben oder "/etc/secret.txt:/etc/secret.txt:ro" wenn Sie es wollen nur gelesen werden.

Zweitens ist das Format der Daten von dem Leser, der von CopyFromContainer() zurückgegeben wird, ein tar-Archiv. Hier ist eine kleine Änderung an Ihrem Code, die Binds behebt und tar der stdlib verwendet, um die Bytes aus/etc/secret zu extrahieren.

func main() { 
     cli, err := client.NewEnvClient() 
     if err != nil { 
       panic(err) 
     } 
     defer cli.Close() 

     ctx := context.Background() 

     _, err = cli.ImagePull(ctx, "alpine", types.ImagePullOptions{}) 
     if err != nil { 
       panic(err) 

     } 

     containerConfig := &container.Config{ 
       Image: "alpine", 
       Cmd: []string{"sleep", "1h"}, 
     } 

     // mounted file 
     h := container.HostConfig{ 
       Binds: []string{"/etc/secret.txt:/etc/secret.txt"}, 
     } 

     resp, err := cli.ContainerCreate(ctx, containerConfig, &h, nil, "") 
     if err != nil { 
       panic(err) 
     } 

     rc, _, err := cli.CopyFromContainer(context.Background(), resp.ID, "/etc/secret.txt") 
     if err != nil { 
       fmt.Println(err.Error()) 
     } 

     tr := tar.NewReader(rc) 
     var b []byte 
     for { 
       hdr, err := tr.Next() 
       if err == io.EOF { 
         break 
       } 
       if err != nil { 
         break 
       } 
       if hdr.Name == "secret.txt" { 
         b, err = ioutil.ReadAll(tr) 
         break 
       } 
       fmt.Println("Name:", hdr.Name) 
       if err != nil { 
         break 
       } 
     } 
     if err != nil { 
       fmt.Println(err.Error()) 
     } 
     rc.Close() 
     fmt.Printf("%q (len=%d)\n", b, len(string(b))) 
}