douqiao5440 2017-11-20 21:14
浏览 94
已采纳

使用Go Docker API从装入的文件中获取文件上下文

I'm trying to get mounted file content using Go docker API:

File secret.txt stores a line 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)))

I'm getting secret.txt file with additional information:

secret.txt/0040755000000000000000000000000013204637420011354 5ustar0000000000000000 len= 153

How to get actual data from text file? Thank you

  • 写回答

1条回答 默认 最新

  • duanguangwang5829 2017-11-21 16:57
    关注

    First, the Binds parameter is of the format "source:target[:ro]", so you should have it "/etc/secret.txt:/etc/secret.txt", or "/etc/secret.txt:/etc/secret.txt:ro" if you want it to be read-only.

    Second, the format of the data from the reader returned by CopyFromContainer() is a tar archive. Here is a small modification to your code that fixes Binds, and uses tar from the stdlib to extract the bytes from /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)
    ", b, len(string(b)))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么