mirror of
https://github.com/opencontainers/runc.git
synced 2025-10-06 07:56:55 +08:00
Do not create exec fifo in factory.Create
It should not be binded to container creation, for example, runc restore needs to create a libcontainer.Container, but it won't need exec fifo. So create exec fifo when container is started or run, where we really need it. Signed-off-by: Qiang Huang <h.huangqiang@huawei.com>
This commit is contained in:
@@ -191,17 +191,29 @@ func (c *linuxContainer) Start(process *Process) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return c.start(process, status == Stopped)
|
if status == Stopped {
|
||||||
|
if err := c.createExecFifo(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := c.start(process, status == Stopped); err != nil {
|
||||||
|
if status == Stopped {
|
||||||
|
c.deleteExecFifo()
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *linuxContainer) Run(process *Process) error {
|
func (c *linuxContainer) Run(process *Process) error {
|
||||||
c.m.Lock()
|
c.m.Lock()
|
||||||
defer c.m.Unlock()
|
|
||||||
status, err := c.currentStatus()
|
status, err := c.currentStatus()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
c.m.Unlock()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := c.start(process, status == Stopped); err != nil {
|
c.m.Unlock()
|
||||||
|
if err := c.Start(process); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if status == Stopped {
|
if status == Stopped {
|
||||||
@@ -291,6 +303,37 @@ func (c *linuxContainer) Signal(s os.Signal, all bool) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *linuxContainer) createExecFifo() error {
|
||||||
|
rootuid, err := c.Config().HostUID()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rootgid, err := c.Config().HostGID()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fifoName := filepath.Join(c.root, execFifoFilename)
|
||||||
|
if _, err := os.Stat(fifoName); err == nil {
|
||||||
|
return fmt.Errorf("exec fifo %s already exists", fifoName)
|
||||||
|
}
|
||||||
|
oldMask := syscall.Umask(0000)
|
||||||
|
if err := syscall.Mkfifo(fifoName, 0622); err != nil {
|
||||||
|
syscall.Umask(oldMask)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
syscall.Umask(oldMask)
|
||||||
|
if err := os.Chown(fifoName, rootuid, rootgid); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *linuxContainer) deleteExecFifo() {
|
||||||
|
fifoName := filepath.Join(c.root, execFifoFilename)
|
||||||
|
os.Remove(fifoName)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProcess, error) {
|
func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProcess, error) {
|
||||||
parentPipe, childPipe, err := newPipe()
|
parentPipe, childPipe, err := newPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -169,16 +169,6 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err
|
|||||||
if err := os.Chown(containerRoot, uid, gid); err != nil {
|
if err := os.Chown(containerRoot, uid, gid); err != nil {
|
||||||
return nil, newGenericError(err, SystemError)
|
return nil, newGenericError(err, SystemError)
|
||||||
}
|
}
|
||||||
fifoName := filepath.Join(containerRoot, execFifoFilename)
|
|
||||||
oldMask := syscall.Umask(0000)
|
|
||||||
if err := syscall.Mkfifo(fifoName, 0622); err != nil {
|
|
||||||
syscall.Umask(oldMask)
|
|
||||||
return nil, newGenericError(err, SystemError)
|
|
||||||
}
|
|
||||||
syscall.Umask(oldMask)
|
|
||||||
if err := os.Chown(fifoName, uid, gid); err != nil {
|
|
||||||
return nil, newGenericError(err, SystemError)
|
|
||||||
}
|
|
||||||
c := &linuxContainer{
|
c := &linuxContainer{
|
||||||
id: id,
|
id: id,
|
||||||
root: containerRoot,
|
root: containerRoot,
|
||||||
|
Reference in New Issue
Block a user