|
@@ -50,6 +50,8 @@ type Container struct {
|
|
|
AppArmorProfile string
|
|
|
HostnamePath string
|
|
|
HostsPath string
|
|
|
+ ShmPath string
|
|
|
+ MqueuePath string
|
|
|
MountPoints map[string]*mountPoint
|
|
|
ResolvConfPath string
|
|
|
|
|
@@ -189,6 +191,16 @@ func populateCommand(c *Container, env []string) error {
|
|
|
}
|
|
|
|
|
|
ipc := &execdriver.Ipc{}
|
|
|
+ var err error
|
|
|
+ c.ShmPath, err = c.shmPath()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ c.MqueuePath, err = c.mqueuePath()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
if c.hostConfig.IpcMode.IsContainer() {
|
|
|
ic, err := c.getIpcContainer()
|
|
@@ -196,8 +208,14 @@ func populateCommand(c *Container, env []string) error {
|
|
|
return err
|
|
|
}
|
|
|
ipc.ContainerID = ic.ID
|
|
|
+ c.ShmPath = ic.ShmPath
|
|
|
+ c.MqueuePath = ic.MqueuePath
|
|
|
} else {
|
|
|
ipc.HostIpc = c.hostConfig.IpcMode.IsHost()
|
|
|
+ if ipc.HostIpc {
|
|
|
+ c.ShmPath = "/dev/shm"
|
|
|
+ c.MqueuePath = "/dev/mqueue"
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
pid := &execdriver.Pid{}
|
|
@@ -1222,3 +1240,85 @@ func (container *Container) removeMountPoints(rm bool) error {
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+func (container *Container) shmPath() (string, error) {
|
|
|
+ return container.GetRootResourcePath("shm")
|
|
|
+}
|
|
|
+func (container *Container) mqueuePath() (string, error) {
|
|
|
+ return container.GetRootResourcePath("mqueue")
|
|
|
+}
|
|
|
+
|
|
|
+func (container *Container) setupIpcDirs() error {
|
|
|
+ shmPath, err := container.shmPath()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := os.MkdirAll(shmPath, 0700); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := syscall.Mount("shm", shmPath, "tmpfs", uintptr(syscall.MS_NOEXEC|syscall.MS_NOSUID|syscall.MS_NODEV), label.FormatMountLabel("mode=1777,size=65536k", container.GetMountLabel())); err != nil {
|
|
|
+ return fmt.Errorf("mounting shm tmpfs: %s", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ mqueuePath, err := container.mqueuePath()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := os.MkdirAll(mqueuePath, 0700); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := syscall.Mount("mqueue", mqueuePath, "mqueue", uintptr(syscall.MS_NOEXEC|syscall.MS_NOSUID|syscall.MS_NODEV), ""); err != nil {
|
|
|
+ return fmt.Errorf("mounting mqueue mqueue : %s", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (container *Container) unmountIpcMounts() error {
|
|
|
+ if container.hostConfig.IpcMode.IsContainer() || container.hostConfig.IpcMode.IsHost() {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ shmPath, err := container.shmPath()
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("shm path does not exist %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := syscall.Unmount(shmPath, syscall.MNT_DETACH); err != nil {
|
|
|
+ return fmt.Errorf("failed to umount %s filesystem %v", shmPath, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ mqueuePath, err := container.mqueuePath()
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("mqueue path does not exist %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := syscall.Unmount(mqueuePath, syscall.MNT_DETACH); err != nil {
|
|
|
+ return fmt.Errorf("failed to umount %s filesystem %v", mqueuePath, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (container *Container) ipcMounts() []execdriver.Mount {
|
|
|
+ var mounts []execdriver.Mount
|
|
|
+ label.SetFileLabel(container.ShmPath, container.MountLabel)
|
|
|
+ mounts = append(mounts, execdriver.Mount{
|
|
|
+ Source: container.ShmPath,
|
|
|
+ Destination: "/dev/shm",
|
|
|
+ Writable: true,
|
|
|
+ Private: true,
|
|
|
+ })
|
|
|
+ label.SetFileLabel(container.MqueuePath, container.MountLabel)
|
|
|
+ mounts = append(mounts, execdriver.Mount{
|
|
|
+ Source: container.MqueuePath,
|
|
|
+ Destination: "/dev/mqueue",
|
|
|
+ Writable: true,
|
|
|
+ Private: true,
|
|
|
+ })
|
|
|
+ return mounts
|
|
|
+}
|