使用Go Docker API从挂载的文件获取文件上下文
我正在尝试使用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
如何从文本文件中获取实际的数据? 谢谢
首先, Binds
参数的格式是"source:target[:ro]"
,所以你应该有"/etc/secret.txt:/etc/secret.txt"
或者"/etc/secret.txt:/etc/secret.txt:ro"
如果你希望它是只读的。
其次,由CopyFromContainer()
返回的阅读器数据的格式是一个tar档案。 以下是修改绑定的代码的一个小修改,并使用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))) }
- 从头开始非特权执行
- Go和Docker:当我使用stdlib时,我能够运行一个去web服务器,当我使用自定义包发生错误
- 使用Docker与Jenkins上的“vendor”目录构buildGo应用程序
- GO使用Docker API时发出问题 – 无法导入“nat”
- Golang Docker API在点击ImageBuild时报告无效的参数
- Dokku部署问题无法select构build包
- Docker隐藏调用容器的IP
- 尝试使用docker撰写文件连接redis时连接被拒绝
- 获取stream错误:streamID 1; 在容器中使用Golang中的GooglesearchAPI时的PROTOCOL_ERROR