使用Go Docker API从装入的文件获取文件上下文
我正在尝试使用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
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)))
}