mirror of
https://github.com/containers/podman.git
synced 2025-07-15 03:02:52 +08:00
v2 podman remote attach, start, and run
for the remote client, add the ability to attach to a container, start a container, and run a container. Signed-off-by: Brent Baude <bbaude@redhat.com>
This commit is contained in:
@ -52,14 +52,14 @@ func attachFlags(flags *pflag.FlagSet) {
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: attachCommand,
|
Command: attachCommand,
|
||||||
})
|
})
|
||||||
flags := attachCommand.Flags()
|
flags := attachCommand.Flags()
|
||||||
attachFlags(flags)
|
attachFlags(flags)
|
||||||
|
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: containerAttachCommand,
|
Command: containerAttachCommand,
|
||||||
Parent: containerCmd,
|
Parent: containerCmd,
|
||||||
})
|
})
|
||||||
|
@ -66,14 +66,14 @@ func runFlags(flags *pflag.FlagSet) {
|
|||||||
}
|
}
|
||||||
func init() {
|
func init() {
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: runCommand,
|
Command: runCommand,
|
||||||
})
|
})
|
||||||
flags := runCommand.Flags()
|
flags := runCommand.Flags()
|
||||||
runFlags(flags)
|
runFlags(flags)
|
||||||
|
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: containerRunCommand,
|
Command: containerRunCommand,
|
||||||
Parent: containerCmd,
|
Parent: containerCmd,
|
||||||
})
|
})
|
||||||
|
@ -53,14 +53,14 @@ func startFlags(flags *pflag.FlagSet) {
|
|||||||
}
|
}
|
||||||
func init() {
|
func init() {
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: startCommand,
|
Command: startCommand,
|
||||||
})
|
})
|
||||||
flags := startCommand.Flags()
|
flags := startCommand.Flags()
|
||||||
startFlags(flags)
|
startFlags(flags)
|
||||||
|
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Mode: []entities.EngineMode{entities.ABIMode},
|
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
|
||||||
Command: containerStartCommand,
|
Command: containerStartCommand,
|
||||||
Parent: containerCmd,
|
Parent: containerCmd,
|
||||||
})
|
})
|
||||||
|
@ -3,11 +3,12 @@ package compat
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/containers/libpod/libpod"
|
"github.com/containers/libpod/libpod"
|
||||||
"github.com/containers/libpod/libpod/define"
|
"github.com/containers/libpod/libpod/define"
|
||||||
"github.com/containers/libpod/pkg/api/handlers/utils"
|
"github.com/containers/libpod/pkg/api/handlers/utils"
|
||||||
"github.com/gorilla/schema"
|
"github.com/gorilla/schema"
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func StartContainer(w http.ResponseWriter, r *http.Request) {
|
func StartContainer(w http.ResponseWriter, r *http.Request) {
|
||||||
@ -23,8 +24,7 @@ func StartContainer(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
if len(query.DetachKeys) > 0 {
|
if len(query.DetachKeys) > 0 {
|
||||||
// TODO - start does not support adding detach keys
|
// TODO - start does not support adding detach keys
|
||||||
utils.BadRequest(w, "detachKeys", query.DetachKeys, errors.New("the detachKeys parameter is not supported yet"))
|
logrus.Info("the detach keys parameter is not supported on start container")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
runtime := r.Context().Value("runtime").(*libpod.Runtime)
|
||||||
name := utils.GetName(r)
|
name := utils.GetName(r)
|
||||||
|
@ -8,10 +8,12 @@ import (
|
|||||||
"github.com/containers/common/pkg/config"
|
"github.com/containers/common/pkg/config"
|
||||||
"github.com/containers/image/v5/docker/reference"
|
"github.com/containers/image/v5/docker/reference"
|
||||||
"github.com/containers/libpod/libpod/define"
|
"github.com/containers/libpod/libpod/define"
|
||||||
|
"github.com/containers/libpod/pkg/bindings"
|
||||||
"github.com/containers/libpod/pkg/bindings/containers"
|
"github.com/containers/libpod/pkg/bindings/containers"
|
||||||
"github.com/containers/libpod/pkg/domain/entities"
|
"github.com/containers/libpod/pkg/domain/entities"
|
||||||
"github.com/containers/libpod/pkg/specgen"
|
"github.com/containers/libpod/pkg/specgen"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerRunlabel(ctx context.Context, label string, image string, args []string, options entities.ContainerRunlabelOptions) error {
|
func (ic *ContainerEngine) ContainerRunlabel(ctx context.Context, label string, image string, args []string, options entities.ContainerRunlabelOptions) error {
|
||||||
@ -324,15 +326,39 @@ func (ic *ContainerEngine) ContainerLogs(ctx context.Context, containers []strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerAttach(ctx context.Context, nameOrId string, options entities.AttachOptions) error {
|
func (ic *ContainerEngine) ContainerAttach(ctx context.Context, nameOrId string, options entities.AttachOptions) error {
|
||||||
return errors.New("not implemented")
|
return containers.Attach(ic.ClientCxt, nameOrId, &options.DetachKeys, nil, bindings.PTrue, options.Stdin, options.Stdout, options.Stderr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerExec(ctx context.Context, nameOrId string, options entities.ExecOptions) (int, error) {
|
func (ic *ContainerEngine) ContainerExec(ctx context.Context, nameOrId string, options entities.ExecOptions) (int, error) {
|
||||||
return 125, errors.New("not implemented")
|
return 125, errors.New("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func startAndAttach(ic *ContainerEngine, name string, detachKeys *string, input, output, errput *os.File) error { //nolint
|
||||||
|
attachErr := make(chan error)
|
||||||
|
go func() {
|
||||||
|
err := containers.Attach(ic.ClientCxt, name, detachKeys, bindings.PFalse, bindings.PTrue, input, output, errput)
|
||||||
|
attachErr <- err
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := containers.Start(ic.ClientCxt, name, detachKeys); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return <-attachErr
|
||||||
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerStart(ctx context.Context, namesOrIds []string, options entities.ContainerStartOptions) ([]*entities.ContainerStartReport, error) {
|
func (ic *ContainerEngine) ContainerStart(ctx context.Context, namesOrIds []string, options entities.ContainerStartOptions) ([]*entities.ContainerStartReport, error) {
|
||||||
return nil, errors.New("not implemented")
|
var reports []*entities.ContainerStartReport
|
||||||
|
for _, name := range namesOrIds {
|
||||||
|
report := entities.ContainerStartReport{Id: name}
|
||||||
|
if options.Attach {
|
||||||
|
report.Err = startAndAttach(ic, name, &options.DetachKeys, options.Stdin, options.Stdout, options.Stderr)
|
||||||
|
reports = append(reports, &report)
|
||||||
|
return reports, nil
|
||||||
|
}
|
||||||
|
report.Err = containers.Start(ic.ClientCxt, name, &options.DetachKeys)
|
||||||
|
reports = append(reports, &report)
|
||||||
|
}
|
||||||
|
return reports, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerList(ctx context.Context, options entities.ContainerListOptions) ([]entities.ListContainer, error) {
|
func (ic *ContainerEngine) ContainerList(ctx context.Context, options entities.ContainerListOptions) ([]entities.ListContainer, error) {
|
||||||
@ -340,7 +366,23 @@ func (ic *ContainerEngine) ContainerList(ctx context.Context, options entities.C
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.ContainerRunOptions) (*entities.ContainerRunReport, error) {
|
func (ic *ContainerEngine) ContainerRun(ctx context.Context, opts entities.ContainerRunOptions) (*entities.ContainerRunReport, error) {
|
||||||
return nil, errors.New("not implemented")
|
if opts.Rm {
|
||||||
|
logrus.Info("the remote client does not support --rm yet")
|
||||||
|
}
|
||||||
|
con, err := containers.CreateWithSpec(ic.ClientCxt, opts.Spec)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
report := entities.ContainerRunReport{Id: con.ID}
|
||||||
|
// Attach
|
||||||
|
if !opts.Detach {
|
||||||
|
err = startAndAttach(ic, con.ID, &opts.DetachKeys, opts.InputStream, opts.OutputStream, opts.ErrorStream)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
err = containers.Start(ic.ClientCxt, con.ID, nil)
|
||||||
|
}
|
||||||
|
report.ExitCode = define.ExitCode(err)
|
||||||
|
return &report, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ic *ContainerEngine) ContainerDiff(ctx context.Context, nameOrId string, _ entities.DiffOptions) (*entities.DiffReport, error) {
|
func (ic *ContainerEngine) ContainerDiff(ctx context.Context, nameOrId string, _ entities.DiffOptions) (*entities.DiffReport, error) {
|
||||||
|
Reference in New Issue
Block a user