【问题标题】:Getting file context from mounted file with Go Docker API使用 Go Docker API 从挂载文件中获取文件上下文
【发布时间】:2018-05-04 05:06:10
【问题描述】:

我正在尝试使用 Go docker API 获取挂载的文件内容:

文件secret.txt存储一行TOKEN=MY_TOKEN

代码:

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

我收到了带有附加信息的 secret.txt 文件:

secret.txt/0040755000000000000000000000000013204637420011354 5ustar0000000000000000 len= 153

如何从文本文件中获取实际数据? 谢谢

【问题讨论】:

    标签: docker go docker-api


    【解决方案1】:

    首先,Binds 参数的格式为"source:target[:ro]",因此您应该使用"/etc/secret.txt:/etc/secret.txt",如果您希望它是只读的,则应使用"/etc/secret.txt:/etc/secret.txt:ro"

    其次,CopyFromContainer()返回的阅读器数据的格式是tar归档。这是对修复绑定的代码的小修改,并使用标准库中的 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)))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多