1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- //go:build !windows
- // +build !windows
- package snapshot
- import (
- "io/ioutil"
- "os"
- "syscall"
- "github.com/containerd/containerd/mount"
- "github.com/pkg/errors"
- )
- func (lm *localMounter) Mount() (string, error) {
- lm.mu.Lock()
- defer lm.mu.Unlock()
- if lm.mounts == nil && lm.mountable != nil {
- mounts, release, err := lm.mountable.Mount()
- if err != nil {
- return "", err
- }
- lm.mounts = mounts
- lm.release = release
- }
- if len(lm.mounts) == 1 && (lm.mounts[0].Type == "bind" || lm.mounts[0].Type == "rbind") {
- ro := false
- for _, opt := range lm.mounts[0].Options {
- if opt == "ro" {
- ro = true
- break
- }
- }
- if !ro {
- return lm.mounts[0].Source, nil
- }
- }
- dir, err := ioutil.TempDir("", "buildkit-mount")
- if err != nil {
- return "", errors.Wrap(err, "failed to create temp dir")
- }
- if err := mount.All(lm.mounts, dir); err != nil {
- os.RemoveAll(dir)
- return "", errors.Wrapf(err, "failed to mount %s: %+v", dir, lm.mounts)
- }
- lm.target = dir
- return dir, nil
- }
- func (lm *localMounter) Unmount() error {
- lm.mu.Lock()
- defer lm.mu.Unlock()
- if lm.target != "" {
- if err := mount.Unmount(lm.target, syscall.MNT_DETACH); err != nil {
- return err
- }
- os.RemoveAll(lm.target)
- lm.target = ""
- }
- if lm.release != nil {
- return lm.release()
- }
- return nil
- }
|