Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Go Docker API从装入的文件获取文件上下文_Docker_Go_Docker Api - Fatal编程技术网

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

使用Go Docker API从装入的文件获取文件上下文,docker,go,docker-api,Docker,Go,Docker Api,我正在尝试使用Go docker API获取挂载的文件内容: 文件secret.txt存储一行TOKEN=MY_TOKEN 代码: 我正在获取带有附加信息的secret.txt文件: secret.txt/00407550000000000000000000000000013204637420011354 5ustar0000000000000000 len=153 如何从文本文件中获取实际数据? 谢谢首先,绑定参数的格式是“source:target[:ro]”,因此您应该将其设置为“/et

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

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

代码:

我正在获取带有附加信息的
secret.txt
文件:

secret.txt/00407550000000000000000000000000013204637420011354 5ustar0000000000000000 len=153

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

首先,
绑定
参数的格式是
“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)))
}
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)))
}