Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions cmd/nerdctl/compose/compose_start.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ func startAction(cmd *cobra.Command, args []string) error {
return err
}

nerdctlCmd, nerdctlArgs := helpers.GlobalFlags(cmd)

client, ctx, cancel, err := clientutil.NewClient(cmd.Context(), globalOptions.Namespace, globalOptions.Address)
if err != nil {
return err
Expand Down Expand Up @@ -88,15 +90,15 @@ func startAction(cmd *cobra.Command, args []string) error {
return fmt.Errorf("service %q has no container to start", svcName)
}

if err := startContainers(ctx, client, containers, &globalOptions); err != nil {
if err := startContainers(ctx, client, containers, &globalOptions, nerdctlCmd, nerdctlArgs); err != nil {
return err
}
}

return nil
}

func startContainers(ctx context.Context, client *containerd.Client, containers []containerd.Container, globalOptions *types.GlobalCommandOptions) error {
func startContainers(ctx context.Context, client *containerd.Client, containers []containerd.Container, globalOptions *types.GlobalCommandOptions, nerdctlCmd string, nerdctlArgs []string) error {
eg, ctx := errgroup.WithContext(ctx)
for _, c := range containers {
c := c
Expand All @@ -114,7 +116,7 @@ func startContainers(ctx context.Context, client *containerd.Client, containers
}

// in compose, always disable attach
if err := containerutil.Start(ctx, c, false, false, client, "", "", (*config.Config)(globalOptions)); err != nil {
if err := containerutil.Start(ctx, c, false, false, client, "", "", (*config.Config)(globalOptions), nerdctlCmd, nerdctlArgs); err != nil {
return err
}
info, err := c.Info(ctx, containerd.WithoutRefreshedMetadata)
Expand Down
8 changes: 4 additions & 4 deletions cmd/nerdctl/container/container_health_check_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ func TestContainerHealthCheckAdvance(t *testing.T) {
debug, _ := json.MarshalIndent(h, "", " ")
t.Log(string(debug))
assert.Assert(t, h != nil, "expected health state")
assert.Equal(t, h.FailingStreak, 1)
assert.Assert(t, h.FailingStreak >= 1, "expected at least one failing streak")
assert.Assert(t, len(inspect.State.Health.Log) > 0, "expected health log to have entries")
last := inspect.State.Health.Log[0]
assert.Equal(t, -1, last.ExitCode)
Expand Down Expand Up @@ -348,7 +348,7 @@ func TestContainerHealthCheckAdvance(t *testing.T) {
t.Log(string(debug))
assert.Assert(t, h != nil, "expected health state")
assert.Equal(t, h.Status, healthcheck.Unhealthy)
assert.Equal(t, h.FailingStreak, 2)
assert.Assert(t, h.FailingStreak >= 1, "expected atleast one FailingStreak")
}),
}
},
Expand Down Expand Up @@ -411,7 +411,7 @@ func TestContainerHealthCheckAdvance(t *testing.T) {
t.Log(string(debug))
assert.Assert(t, h != nil, "expected health state")
assert.Equal(t, h.Status, healthcheck.Unhealthy)
assert.Equal(t, h.FailingStreak, 1)
assert.Assert(t, h.FailingStreak >= 1, "expected at least one failing streak")
}),
}
},
Expand Down Expand Up @@ -633,7 +633,7 @@ func TestContainerHealthCheckAdvance(t *testing.T) {
assert.Assert(t, h != nil, "expected health state")
assert.Equal(t, h.Status, healthcheck.Healthy)
assert.Equal(t, h.FailingStreak, 0)
assert.Assert(t, len(h.Log) == 1, "expected one log entry")
assert.Assert(t, len(h.Log) >= 1, "expected at least one log entry")
output := h.Log[0].Output
assert.Assert(t, strings.HasSuffix(output, "[truncated]"), "expected output to be truncated with '[truncated]'")
}),
Expand Down
13 changes: 9 additions & 4 deletions cmd/nerdctl/container/container_restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ func restartOptions(cmd *cobra.Command) (types.ContainerRestartOptions, error) {
return types.ContainerRestartOptions{}, err
}

// Call GlobalFlags function here
nerdctlCmd, nerdctlArgs := helpers.GlobalFlags(cmd)

var timeout *time.Duration
if cmd.Flags().Changed("time") {
// Seconds to wait for stop before killing it
Expand All @@ -70,10 +73,12 @@ func restartOptions(cmd *cobra.Command) (types.ContainerRestartOptions, error) {
}

return types.ContainerRestartOptions{
Stdout: cmd.OutOrStdout(),
GOption: globalOptions,
Timeout: timeout,
Signal: signal,
Stdout: cmd.OutOrStdout(),
GOption: globalOptions,
Timeout: timeout,
Signal: signal,
NerdctlCmd: nerdctlCmd,
NerdctlArgs: nerdctlArgs,
}, err
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/nerdctl/container/container_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ func runAction(cmd *cobra.Command, args []string) error {
}

// Setup container healthchecks.
if err := healthcheck.CreateTimer(ctx, c, (*config.Config)(&createOpt.GOptions)); err != nil {
if err := healthcheck.CreateTimer(ctx, c, (*config.Config)(&createOpt.GOptions), createOpt.NerdctlCmd, createOpt.NerdctlArgs); err != nil {
return fmt.Errorf("failed to create healthcheck timer: %w", err)
}
if err := healthcheck.StartTimer(ctx, c, (*config.Config)(&createOpt.GOptions)); err != nil {
Expand Down
2 changes: 2 additions & 0 deletions cmd/nerdctl/container/container_start.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ func startAction(cmd *cobra.Command, args []string) error {
return err
}

options.NerdctlCmd, options.NerdctlArgs = helpers.GlobalFlags(cmd)

client, ctx, cancel, err := clientutil.NewClient(cmd.Context(), options.GOptions.Namespace, options.GOptions.Address)
if err != nil {
return err
Expand Down
7 changes: 5 additions & 2 deletions cmd/nerdctl/container/container_unpause.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,12 @@ func unpauseOptions(cmd *cobra.Command) (types.ContainerUnpauseOptions, error) {
if err != nil {
return types.ContainerUnpauseOptions{}, err
}
nerdctlCmd, nerdctlArgs := helpers.GlobalFlags(cmd)
return types.ContainerUnpauseOptions{
GOptions: globalOptions,
Stdout: cmd.OutOrStdout(),
GOptions: globalOptions,
Stdout: cmd.OutOrStdout(),
NerdctlCmd: nerdctlCmd,
NerdctlArgs: nerdctlArgs,
}, nil
}

Expand Down
17 changes: 16 additions & 1 deletion pkg/api/types/container_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ type ContainerStartOptions struct {
Checkpoint string
// CheckpointDir is the directory to store checkpoints
CheckpointDir string
// NerdctlCmd is the command name of nerdctl
NerdctlCmd string
// NerdctlArgs is the arguments of nerdctl
NerdctlArgs []string
}

// ContainerKillOptions specifies options for `nerdctl (container) kill`.
Expand Down Expand Up @@ -329,6 +333,10 @@ type ContainerRestartOptions struct {
Timeout *time.Duration
// Signal to send to stop the container, before sending SIGKILL
Signal string
// NerdctlCmd is the command name of nerdctl
NerdctlCmd string
// NerdctlArgs is the arguments of nerdctl
NerdctlArgs []string
}

// ContainerPauseOptions specifies options for `nerdctl (container) pause`.
Expand All @@ -346,7 +354,14 @@ type ContainerPruneOptions struct {
}

// ContainerUnpauseOptions specifies options for `nerdctl (container) unpause`.
type ContainerUnpauseOptions ContainerPauseOptions
type ContainerUnpauseOptions struct {
Stdout io.Writer
GOptions GlobalCommandOptions
// NerdctlCmd is the command name of nerdctl
NerdctlCmd string
// NerdctlArgs is the arguments of nerdctl
NerdctlArgs []string
}

// ContainerRemoveOptions specifies options for `nerdctl (container) rm`.
type ContainerRemoveOptions struct {
Expand Down
3 changes: 2 additions & 1 deletion pkg/cmd/container/restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ func Restart(ctx context.Context, client *containerd.Client, containers []string
if err := containerutil.Stop(ctx, found.Container, options.Timeout, options.Signal); err != nil {
return err
}
if err := containerutil.Start(ctx, found.Container, false, false, client, "", "", (*config.Config)(&options.GOption)); err != nil {

if err := containerutil.Start(ctx, found.Container, false, false, client, "", "", (*config.Config)(&options.GOption), options.NerdctlCmd, options.NerdctlArgs); err != nil {
return err
}
_, err = fmt.Fprintln(options.Stdout, found.Req)
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/container/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func Start(ctx context.Context, client *containerd.Client, reqs []string, option
return err
}
}
if err := containerutil.Start(ctx, found.Container, options.Attach, options.Interactive, client, options.DetachKeys, checkpointDir, (*config.Config)(&options.GOptions)); err != nil {
if err := containerutil.Start(ctx, found.Container, options.Attach, options.Interactive, client, options.DetachKeys, checkpointDir, (*config.Config)(&options.GOptions), options.NerdctlCmd, options.NerdctlArgs); err != nil {
return err
}
if !options.Attach {
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/container/unpause.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func Unpause(ctx context.Context, client *containerd.Client, reqs []string, opti
if found.MatchCount > 1 {
return fmt.Errorf("multiple IDs found with provided prefix: %s", found.Req)
}
if err := containerutil.Unpause(ctx, client, found.Container.ID(), (*config.Config)(&options.GOptions)); err != nil {
if err := containerutil.Unpause(ctx, client, found.Container.ID(), (*config.Config)(&options.GOptions), options.NerdctlCmd, options.NerdctlArgs); err != nil {
return err
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/composer/pause.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func (c *Composer) Unpause(ctx context.Context, services []string, writer io.Wri
for _, container := range containers {
container := container
eg.Go(func() error {
if err := containerutil.Unpause(ctx, c.client, container.ID(), c.config); err != nil {
if err := containerutil.Unpause(ctx, c.client, container.ID(), c.config, c.NerdctlCmd, c.NerdctlArgs); err != nil {
return err
}
info, err := container.Info(ctx, containerd.WithoutRefreshedMetadata)
Expand Down
8 changes: 4 additions & 4 deletions pkg/containerutil/containerutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ func GenerateSharingPIDOpts(ctx context.Context, targetCon containerd.Container)
}

// Start starts `container` with `attach` flag. If `attach` is true, it will attach to the container's stdio.
func Start(ctx context.Context, container containerd.Container, isAttach bool, isInteractive bool, client *containerd.Client, detachKeys string, checkpointDir string, cfg *config.Config) (err error) {
func Start(ctx context.Context, container containerd.Container, isAttach bool, isInteractive bool, client *containerd.Client, detachKeys string, checkpointDir string, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) (err error) {
// defer the storage of start error in the dedicated label
defer func() {
if err != nil {
Expand Down Expand Up @@ -304,7 +304,7 @@ func Start(ctx context.Context, container containerd.Container, isAttach bool, i
}

// If container has health checks configured, create and start systemd timer/service files.
if err := healthcheck.CreateTimer(ctx, container, cfg); err != nil {
if err := healthcheck.CreateTimer(ctx, container, cfg, nerdctlCmd, nerdctlArgs); err != nil {
return fmt.Errorf("failed to create healthcheck timer: %w", err)
}
if err := healthcheck.StartTimer(ctx, container, cfg); err != nil {
Expand Down Expand Up @@ -526,7 +526,7 @@ func Pause(ctx context.Context, client *containerd.Client, id string) error {
}

// Unpause unpauses a container by its id.
func Unpause(ctx context.Context, client *containerd.Client, id string, cfg *config.Config) error {
func Unpause(ctx context.Context, client *containerd.Client, id string, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) error {
container, err := client.LoadContainer(ctx, id)
if err != nil {
return err
Expand All @@ -543,7 +543,7 @@ func Unpause(ctx context.Context, client *containerd.Client, id string, cfg *con
}

// Recreate healthcheck related systemd timer/service files.
if err := healthcheck.CreateTimer(ctx, container, cfg); err != nil {
if err := healthcheck.CreateTimer(ctx, container, cfg, nerdctlCmd, nerdctlArgs); err != nil {
return fmt.Errorf("failed to create healthcheck timer: %w", err)
}
if err := healthcheck.StartTimer(ctx, container, cfg); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/healthcheck/healthcheck_manager_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
)

// CreateTimer sets up the transient systemd timer and service for healthchecks.
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config) error {
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) error {
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/healthcheck/healthcheck_manager_freebsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
)

// CreateTimer sets up the transient systemd timer and service for healthchecks.
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config) error {
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) error {
return nil
}

Expand Down
17 changes: 5 additions & 12 deletions pkg/healthcheck/healthcheck_manager_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import (
)

// CreateTimer sets up the transient systemd timer and service for healthchecks.
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config) error {
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) error {
hc := extractHealthcheck(ctx, container)
if hc == nil {
return nil
Expand All @@ -56,18 +56,11 @@ func CreateTimer(ctx context.Context, container containerd.Container, cfg *confi
// Always use health-interval for timer frequency
cmdOpts = append(cmdOpts, "--unit", containerID, "--on-unit-inactive="+hc.Interval.String(), "--timer-property=AccuracySec=1s")

// Get the full path to the current nerdctl binary
nerdctlPath, err := os.Executable()
if err != nil {
return fmt.Errorf("could not determine nerdctl executable path: %v", err)
}

cmdOpts = append(cmdOpts, nerdctlPath, "container", "healthcheck", containerID)
if log.G(ctx).Logger.IsLevelEnabled(log.DebugLevel) {
cmdOpts = append(cmdOpts, "--debug")
}
cmdOpts = append(cmdOpts, nerdctlCmd)
cmdOpts = append(cmdOpts, nerdctlArgs...)
cmdOpts = append(cmdOpts, "container", "healthcheck", containerID)

log.G(ctx).Debugf("creating healthcheck timer with: systemd-run %s", strings.Join(cmdOpts, " "))
log.G(ctx).Infof("creating healthcheck timer with: systemd-run %s", strings.Join(cmdOpts, " "))
run := exec.Command("systemd-run", cmdOpts...)
if out, err := run.CombinedOutput(); err != nil {
return fmt.Errorf("systemd-run failed: %w\noutput: %s", err, strings.TrimSpace(string(out)))
Expand Down
2 changes: 1 addition & 1 deletion pkg/healthcheck/healthcheck_manager_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
)

// CreateTimer sets up the transient systemd timer and service for healthchecks.
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config) error {
func CreateTimer(ctx context.Context, container containerd.Container, cfg *config.Config, nerdctlCmd string, nerdctlArgs []string) error {
return nil
}

Expand Down
Loading