mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-28 03:53:33 +00:00
fix: auto-detect containerd.sock path and conditionally start unregistry
This commit is contained in:
+20
-16
@@ -215,13 +215,15 @@ func (cc *clusterController) Run(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
errGroup.Go(func() error {
|
if cc.unregistry != nil {
|
||||||
slog.Info("Starting unregistry server.")
|
errGroup.Go(func() error {
|
||||||
if err := cc.unregistry.ListenAndServe(); err != nil {
|
slog.Info("Starting unregistry server.")
|
||||||
return fmt.Errorf("unregistry server failed: %w", err)
|
if err := cc.unregistry.ListenAndServe(); err != nil {
|
||||||
}
|
return fmt.Errorf("unregistry server failed: %w", err)
|
||||||
return nil
|
}
|
||||||
})
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Wait for the context to be done and stop the network API server.
|
// Wait for the context to be done and stop the network API server.
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
@@ -230,23 +232,25 @@ func (cc *clusterController) Run(ctx context.Context) error {
|
|||||||
cc.server.GracefulStop()
|
cc.server.GracefulStop()
|
||||||
slog.Info("Network API server stopped.")
|
slog.Info("Network API server stopped.")
|
||||||
|
|
||||||
// Stop the unregistry server with a timeout.
|
// Stop the unregistry server with a timeout if it was started.
|
||||||
unregTimeout := 30 * time.Second
|
if cc.unregistry != nil {
|
||||||
slog.Info("Stopping unregistry server.", "timeout", unregTimeout)
|
unregTimeout := 30 * time.Second
|
||||||
unregCtx, cancel := context.WithTimeout(context.Background(), unregTimeout)
|
slog.Info("Stopping unregistry server.", "timeout", unregTimeout)
|
||||||
defer cancel()
|
unregCtx, cancel := context.WithTimeout(context.Background(), unregTimeout)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
if err = cc.unregistry.Shutdown(unregCtx); err != nil {
|
if err = cc.unregistry.Shutdown(unregCtx); err != nil {
|
||||||
return fmt.Errorf("unregistry server forced to shutdown: %w", err)
|
return fmt.Errorf("unregistry server forced to shutdown: %w", err)
|
||||||
|
}
|
||||||
|
slog.Info("Unregistry server stopped.")
|
||||||
}
|
}
|
||||||
slog.Info("Unregistry server stopped.")
|
|
||||||
|
|
||||||
// Wait for all controllers to finish.
|
// Wait for all controllers to finish.
|
||||||
err = errGroup.Wait()
|
err = errGroup.Wait()
|
||||||
|
|
||||||
// It's safe to stop the Corrosion service after the controllers depending on it and API server are stopped.
|
// It's safe to stop the Corrosion service after the controllers depending on it and API server are stopped.
|
||||||
// Use a new context with a timeout as the current context is already canceled.
|
// Use a new context with a timeout as the current context is already canceled.
|
||||||
ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
if corroErr := cc.corroService.Stop(ctx); corroErr != nil {
|
if corroErr := cc.corroService.Stop(ctx); corroErr != nil {
|
||||||
err = errors.Join(err, fmt.Errorf("stop corrosion service: %w", corroErr))
|
err = errors.Join(err, fmt.Errorf("stop corrosion service: %w", corroErr))
|
||||||
|
|||||||
+38
-12
@@ -64,6 +64,8 @@ type Config struct {
|
|||||||
|
|
||||||
// DockerClient manages system and user containers using the local Docker daemon.
|
// DockerClient manages system and user containers using the local Docker daemon.
|
||||||
DockerClient *client.Client
|
DockerClient *client.Client
|
||||||
|
// ContainerdSockPath is the path to the containerd.sock used by Docker.
|
||||||
|
ContainerdSockPath string
|
||||||
|
|
||||||
// CaddyConfigDir specifies the directory where the machine generates the Caddy reverse proxy configuration file
|
// CaddyConfigDir specifies the directory where the machine generates the Caddy reverse proxy configuration file
|
||||||
// for routing external traffic to service containers across the internal network. Default is DataDir/caddy.
|
// for routing external traffic to service containers across the internal network. Default is DataDir/caddy.
|
||||||
@@ -94,6 +96,26 @@ func (c *Config) SetDefaults() (*Config, error) {
|
|||||||
}
|
}
|
||||||
cfg.DockerClient = cli
|
cfg.DockerClient = cli
|
||||||
}
|
}
|
||||||
|
if cfg.ContainerdSockPath == "" {
|
||||||
|
// Auto-detect the containerd.sock path used by Docker.
|
||||||
|
paths := []string{
|
||||||
|
"/run/containerd/containerd.sock", // Default path on most Linux distributions.
|
||||||
|
"/run/docker/containerd/containerd.sock",
|
||||||
|
"/var/run/containerd/containerd.sock",
|
||||||
|
"/var/run/docker/containerd/containerd.sock",
|
||||||
|
}
|
||||||
|
for _, path := range paths {
|
||||||
|
if _, err := os.Stat(path); err == nil {
|
||||||
|
cfg.ContainerdSockPath = path
|
||||||
|
slog.Debug("Detected containerd socket used by Docker.", "path", path)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.ContainerdSockPath == "" {
|
||||||
|
slog.Warn("Failed to auto-detect containerd socket used by Docker.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if cfg.CorrosionDir == "" {
|
if cfg.CorrosionDir == "" {
|
||||||
cfg.CorrosionDir = filepath.Join(cfg.DataDir, "corrosion")
|
cfg.CorrosionDir = filepath.Join(cfg.DataDir, "corrosion")
|
||||||
@@ -409,18 +431,22 @@ func (m *Machine) Run(ctx context.Context) error {
|
|||||||
return fmt.Errorf("create embedded DNS server: %w", err)
|
return fmt.Errorf("create embedded DNS server: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an embedded container registry listening on the machine IP address and
|
var unreg *unregistry.Registry
|
||||||
// using the local Docker (containerd) image store as its backend.
|
if m.config.ContainerdSockPath != "" {
|
||||||
unreg, err := unregistry.NewRegistry(unregistry.Config{
|
// Create an embedded container registry listening on the machine IP address and
|
||||||
Addr: net.JoinHostPort(m.IP().String(), strconv.Itoa(constants.UnregistryPort)),
|
// using the local Docker (containerd) image store as its backend.
|
||||||
ContainerdNamespace: "moby",
|
unreg, err = unregistry.NewRegistry(unregistry.Config{
|
||||||
// TODO: auto-detect the containerd.sock path used by Docker and/or allow configuring it.
|
Addr: net.JoinHostPort(m.IP().String(), strconv.Itoa(constants.UnregistryPort)),
|
||||||
ContainerdSock: "/run/containerd/containerd.sock",
|
ContainerdNamespace: "moby",
|
||||||
LogFormatter: "text",
|
ContainerdSock: m.config.ContainerdSockPath,
|
||||||
LogLevel: "info",
|
LogFormatter: "text",
|
||||||
})
|
LogLevel: "info",
|
||||||
if err != nil {
|
})
|
||||||
return fmt.Errorf("create embedded registry: %w", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("create embedded registry: %w", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
slog.Warn("Skipping embedded unregistry setup as the containerd socket path is not configured.")
|
||||||
}
|
}
|
||||||
|
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
|
|||||||
Reference in New Issue
Block a user