diff --git a/internal/cri/server/restart.go b/internal/cri/server/restart.go index 70f433570..f487c9aed 100644 --- a/internal/cri/server/restart.go +++ b/internal/cri/server/restart.go @@ -257,7 +257,6 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe defer cancel() id := cntr.ID() containerDir := c.getContainerRootDir(id) - volatileContainerDir := c.getVolatileContainerRootDir(id) var container containerstore.Container // Load container metadata. exts, err := cntr.Extensions(ctx) @@ -336,9 +335,7 @@ func (c *criService) loadContainer(ctx context.Context, cntr containerd.Containe // NOTE: Another possibility is that we've tried to start the container, but // containerd got restarted during that. In that case, we still // treat the container as `CREATED`. - containerIO, err = cio.NewContainerIO(id, - cio.WithNewFIFOs(volatileContainerDir, meta.Config.GetTty(), meta.Config.GetStdin()), - ) + containerIO, err = c.createContainerIO(id, meta.SandboxID, meta.Config) if err != nil { return fmt.Errorf("failed to create container io: %w", err) } @@ -465,3 +462,31 @@ func cleanupOrphanedIDDirs(ctx context.Context, cntrs []containerd.Container, ba } return nil } + +func (c *criService) createContainerIO(containerID, sandboxID string, config *runtime.ContainerConfig) (*cio.ContainerIO, error) { + if config == nil { + return nil, fmt.Errorf("ContainerConfig should not be nil when create container io") + } + sb, err := c.sandboxStore.Get(sandboxID) + if err != nil { + return nil, fmt.Errorf("an error occurred when try to find sandbox %q: %w", sandboxID, err) + } + ociRuntime, err := c.config.GetSandboxRuntime(sb.Config, sb.Metadata.RuntimeHandler) + if err != nil { + return nil, fmt.Errorf("failed to get sandbox runtime: %w", err) + } + var containerIO *cio.ContainerIO + switch ociRuntime.IOType { + case criconfig.IOTypeStreaming: + containerIO, err = cio.NewContainerIO(containerID, + cio.WithStreams(sb.Endpoint.Address, config.GetTty(), config.GetStdin())) + default: + volatileContainerRootDir := c.getVolatileContainerRootDir(containerID) + containerIO, err = cio.NewContainerIO(containerID, + cio.WithNewFIFOs(volatileContainerRootDir, config.GetTty(), config.GetStdin())) + } + if err != nil { + return nil, fmt.Errorf("failed to create container io: %w", err) + } + return containerIO, nil +}