diff options
Diffstat (limited to 'libpod/container_internal_linux.go')
-rw-r--r-- | libpod/container_internal_linux.go | 77 |
1 files changed, 67 insertions, 10 deletions
diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index 2c78f6bd2..8bf6092c3 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -22,16 +22,16 @@ import ( "github.com/containers/buildah/pkg/secrets" "github.com/containers/common/pkg/apparmor" "github.com/containers/common/pkg/config" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/libpod/events" - "github.com/containers/libpod/pkg/annotations" - "github.com/containers/libpod/pkg/cgroups" - "github.com/containers/libpod/pkg/criu" - "github.com/containers/libpod/pkg/lookup" - "github.com/containers/libpod/pkg/resolvconf" - "github.com/containers/libpod/pkg/rootless" - "github.com/containers/libpod/pkg/util" - "github.com/containers/libpod/utils" + "github.com/containers/libpod/v2/libpod/define" + "github.com/containers/libpod/v2/libpod/events" + "github.com/containers/libpod/v2/pkg/annotations" + "github.com/containers/libpod/v2/pkg/cgroups" + "github.com/containers/libpod/v2/pkg/criu" + "github.com/containers/libpod/v2/pkg/lookup" + "github.com/containers/libpod/v2/pkg/resolvconf" + "github.com/containers/libpod/v2/pkg/rootless" + "github.com/containers/libpod/v2/pkg/util" + "github.com/containers/libpod/v2/utils" "github.com/containers/storage/pkg/archive" securejoin "github.com/cyphar/filepath-securejoin" "github.com/opencontainers/runc/libcontainer/user" @@ -1241,6 +1241,31 @@ func (c *Container) makeBindMounts() error { c.state.BindMounts["/etc/hostname"] = hostnamePath } + // Make /etc/localtime + if c.Timezone() != "" { + if _, ok := c.state.BindMounts["/etc/localtime"]; !ok { + var zonePath string + if c.Timezone() == "local" { + zonePath, err = filepath.EvalSymlinks("/etc/localtime") + if err != nil { + return errors.Wrapf(err, "error finding local timezone for container %s", c.ID()) + } + } else { + zone := filepath.Join("/usr/share/zoneinfo", c.Timezone()) + zonePath, err = filepath.EvalSymlinks(zone) + if err != nil { + return errors.Wrapf(err, "error setting timezone for container %s", c.ID()) + } + } + localtimePath, err := c.copyTimezoneFile(zonePath) + if err != nil { + return errors.Wrapf(err, "error setting timezone for container %s", c.ID()) + } + c.state.BindMounts["/etc/localtime"] = localtimePath + + } + } + // Make .containerenv // Empty file, so no need to recreate if it exists if _, ok := c.state.BindMounts["/run/.containerenv"]; !ok { @@ -1533,3 +1558,35 @@ func (c *Container) getOCICgroupPath() (string, error) { return "", errors.Wrapf(define.ErrInvalidArg, "invalid cgroup manager %s requested", c.runtime.config.Engine.CgroupManager) } } + +func (c *Container) copyTimezoneFile(zonePath string) (string, error) { + var localtimeCopy string = filepath.Join(c.state.RunDir, "localtime") + file, err := os.Stat(zonePath) + if err != nil { + return "", err + } + if file.IsDir() { + return "", errors.New("Invalid timezone: is a directory") + } + src, err := os.Open(zonePath) + if err != nil { + return "", err + } + defer src.Close() + dest, err := os.Create(localtimeCopy) + if err != nil { + return "", err + } + defer dest.Close() + _, err = io.Copy(dest, src) + if err != nil { + return "", err + } + if err := label.Relabel(localtimeCopy, c.config.MountLabel, false); err != nil { + return "", err + } + if err := dest.Chown(c.RootUID(), c.RootGID()); err != nil { + return "", err + } + return localtimeCopy, err +} |