2017-11-20 6 views
3

이동 도커 API를 사용하여 마운트 된 파일에서 파일 컨텍스트를 얻기 추가 정보가있는 secret.txt 파일이 있습니다.내가 이동 고정 표시기 API를 사용하여 마운트 된 파일 내용을 얻으려고

secret.txt/0040755000000000000000000000000013204637420011354 5ustar0000000000000000 len= 153

텍스트 파일에서 실제 데이터를 가져 오는 방법은 무엇입니까? 는 Binds 매개 변수는 형식 "source:target[:ro]"의 당신에게

답변

2

첫째, 감사, 그래서 당신은이 읽기 전용하려는 경우 당신은 그것을 "/etc/secret.txt:/etc/secret.txt", 또는 "/etc/secret.txt:/etc/secret.txt:ro"이 있어야합니다.

두 번째로 CopyFromContainer()이 반환 한 판독기의 데이터 형식은 tar 아카이브입니다. 다음은 Binds를 수정하는 코드를 약간 수정 한 것입니다. stdlib의 tar를 사용하여/etc/secret에서 바이트를 추출합니다.

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))) 
}