mirror of
https://github.com/containers/podman.git
synced 2025-10-25 18:25:59 +08:00
logging: new mode -l passthrough
it allows to pass the current std streams down to the container. conmon support: https://github.com/containers/conmon/pull/289 [NO TESTS NEEDED] it needs a new conmon. Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
@ -229,6 +229,10 @@ func (c *Container) Kill(signal uint) error {
|
||||
// This function returns when the attach finishes. It does not hold the lock for
|
||||
// the duration of its runtime, only using it at the beginning to verify state.
|
||||
func (c *Container) Attach(streams *define.AttachStreams, keys string, resize <-chan define.TerminalSize) error {
|
||||
switch c.LogDriver() {
|
||||
case define.PassthroughLogging:
|
||||
return errors.Wrapf(define.ErrNoLogs, "this container is using the 'passthrough' log driver, cannot attach")
|
||||
}
|
||||
if !c.batched {
|
||||
c.lock.Lock()
|
||||
if err := c.syncContainer(); err != nil {
|
||||
|
||||
@ -18,7 +18,7 @@ import (
|
||||
var logDrivers []string
|
||||
|
||||
func init() {
|
||||
logDrivers = append(logDrivers, define.KubernetesLogging, define.NoLogging)
|
||||
logDrivers = append(logDrivers, define.KubernetesLogging, define.NoLogging, define.PassthroughLogging)
|
||||
}
|
||||
|
||||
// Log is a runtime function that can read one or more container logs.
|
||||
@ -34,6 +34,8 @@ func (r *Runtime) Log(ctx context.Context, containers []*Container, options *log
|
||||
// ReadLog reads a containers log based on the input options and returns log lines over a channel.
|
||||
func (c *Container) ReadLog(ctx context.Context, options *logs.LogOptions, logChannel chan *logs.LogLine) error {
|
||||
switch c.LogDriver() {
|
||||
case define.PassthroughLogging:
|
||||
return errors.Wrapf(define.ErrNoLogs, "this container is using the 'passthrough' log driver, cannot read logs")
|
||||
case define.NoLogging:
|
||||
return errors.Wrapf(define.ErrNoLogs, "this container is using the 'none' log driver, cannot read logs")
|
||||
case define.JournaldLogging:
|
||||
|
||||
@ -78,6 +78,9 @@ const JSONLogging = "json-file"
|
||||
// NoLogging is the string conmon expects when specifying to use no log driver whatsoever
|
||||
const NoLogging = "none"
|
||||
|
||||
// PassthroughLogging is the string conmon expects when specifying to use the passthrough driver
|
||||
const PassthroughLogging = "passthrough"
|
||||
|
||||
// Strings used for --sdnotify option to podman
|
||||
const (
|
||||
SdNotifyModeContainer = "container"
|
||||
|
||||
@ -40,7 +40,9 @@ func openUnixSocket(path string) (*net.UnixConn, error) {
|
||||
// Does not check if state is appropriate
|
||||
// started is only required if startContainer is true
|
||||
func (c *Container) attach(streams *define.AttachStreams, keys string, resize <-chan define.TerminalSize, startContainer bool, started chan bool, attachRdy chan<- bool) error {
|
||||
if !streams.AttachOutput && !streams.AttachError && !streams.AttachInput {
|
||||
passthrough := c.LogDriver() == define.PassthroughLogging
|
||||
|
||||
if !streams.AttachOutput && !streams.AttachError && !streams.AttachInput && !passthrough {
|
||||
return errors.Wrapf(define.ErrInvalidArg, "must provide at least one stream to attach to")
|
||||
}
|
||||
if startContainer && started == nil {
|
||||
@ -52,24 +54,27 @@ func (c *Container) attach(streams *define.AttachStreams, keys string, resize <-
|
||||
return err
|
||||
}
|
||||
|
||||
logrus.Debugf("Attaching to container %s", c.ID())
|
||||
var conn *net.UnixConn
|
||||
if !passthrough {
|
||||
logrus.Debugf("Attaching to container %s", c.ID())
|
||||
|
||||
registerResizeFunc(resize, c.bundlePath())
|
||||
registerResizeFunc(resize, c.bundlePath())
|
||||
|
||||
attachSock, err := c.AttachSocketPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
conn, err := openUnixSocket(attachSock)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to connect to container's attach socket: %v", attachSock)
|
||||
}
|
||||
defer func() {
|
||||
if err := conn.Close(); err != nil {
|
||||
logrus.Errorf("Unable to close socket: %q", err)
|
||||
attachSock, err := c.AttachSocketPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}()
|
||||
|
||||
conn, err = openUnixSocket(attachSock)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to connect to container's attach socket: %v", attachSock)
|
||||
}
|
||||
defer func() {
|
||||
if err := conn.Close(); err != nil {
|
||||
logrus.Errorf("unable to close socket: %q", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// If starting was requested, start the container and notify when that's
|
||||
// done.
|
||||
@ -80,6 +85,10 @@ func (c *Container) attach(streams *define.AttachStreams, keys string, resize <-
|
||||
started <- true
|
||||
}
|
||||
|
||||
if passthrough {
|
||||
return nil
|
||||
}
|
||||
|
||||
receiveStdoutError, stdinDone := setupStdioChannels(streams, conn, detachKeys)
|
||||
if attachRdy != nil {
|
||||
attachRdy <- true
|
||||
|
||||
@ -1288,6 +1288,8 @@ func (r *ConmonOCIRuntime) sharedConmonArgs(ctr *Container, cuuid, bundlePath, p
|
||||
logDriverArg = define.JournaldLogging
|
||||
case define.NoLogging:
|
||||
logDriverArg = define.NoLogging
|
||||
case define.PassthroughLogging:
|
||||
logDriverArg = define.PassthroughLogging
|
||||
case define.JSONLogging:
|
||||
fallthrough
|
||||
//lint:ignore ST1015 the default case has to be here
|
||||
|
||||
@ -1114,7 +1114,7 @@ func WithLogDriver(driver string) CtrCreateOption {
|
||||
switch driver {
|
||||
case "":
|
||||
return errors.Wrapf(define.ErrInvalidArg, "log driver must be set")
|
||||
case define.JournaldLogging, define.KubernetesLogging, define.JSONLogging, define.NoLogging:
|
||||
case define.JournaldLogging, define.KubernetesLogging, define.JSONLogging, define.NoLogging, define.PassthroughLogging:
|
||||
break
|
||||
default:
|
||||
return errors.Wrapf(define.ErrInvalidArg, "invalid log driver")
|
||||
|
||||
@ -473,7 +473,7 @@ func (r *Runtime) setupContainer(ctx context.Context, ctr *Container) (_ *Contai
|
||||
}
|
||||
|
||||
switch ctr.config.LogDriver {
|
||||
case define.NoLogging:
|
||||
case define.NoLogging, define.PassthroughLogging:
|
||||
break
|
||||
case define.JournaldLogging:
|
||||
ctr.initializeJournal(ctx)
|
||||
|
||||
Reference in New Issue
Block a user