binctr/rootfs_ops.go

57 lines
1.2 KiB
Go
Raw Normal View History

package main
import (
"bytes"
"encoding/base64"
"os"
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/idtools"
"github.com/opencontainers/runtime-spec/specs-go"
)
func unpackRootfs(spec *specs.Spec) error {
data, err := base64.StdEncoding.DecodeString(DATA)
if err != nil {
return err
}
if len(spec.Linux.UIDMappings) > 0 && len(spec.Linux.GIDMappings) > 0 {
if err := idtools.MkdirAs(defaultRootfsDir, 0755, int(spec.Linux.UIDMappings[0].HostID), int(spec.Linux.GIDMappings[0].HostID)); err != nil {
return err
}
} else {
if err := os.MkdirAll(defaultRootfsDir, 0755); err != nil {
return err
}
}
uidMaps := []idtools.IDMap{}
gidMaps := []idtools.IDMap{}
for _, u := range spec.Linux.UIDMappings {
uidMaps = append(uidMaps, idtools.IDMap{
ContainerID: int(u.ContainerID),
HostID: int(u.HostID),
Size: int(u.Size),
})
}
for _, g := range spec.Linux.GIDMappings {
gidMaps = append(gidMaps, idtools.IDMap{
ContainerID: int(g.ContainerID),
HostID: int(g.HostID),
Size: int(g.Size),
})
}
r := bytes.NewReader(data)
if err := archive.Untar(r, defaultRootfsDir, &archive.TarOptions{
UIDMaps: uidMaps,
GIDMaps: gidMaps,
}); err != nil {
return err
}
return nil
}