첫째, 감사, 그래서 당신은이 읽기 전용하려는 경우 당신은 그것을 "/etc/secret.txt:/etc/secret.txt"
, 또는 "/etc/secret.txt:/etc/secret.txt:ro"
이 있어야합니다.
두 번째로 CopyFromContainer()
이 반환 한 판독기의 데이터 형식은 tar 아카이브입니다. 다음은 Binds를 수정하는 코드를 약간 수정 한 것입니다. 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)))
}