The `docker info` code was shelling out to obtain the
version of containerd (using the `--version` flag).
Parsing the output of this version string is error-prone,
and not needed, as the containerd API can return the
version.
This patch adds a `Version()` method to the containerd Client
interface, and uses this to get the containerd version.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
... | ... |
@@ -3,6 +3,7 @@ |
3 | 3 |
package daemon |
4 | 4 |
|
5 | 5 |
import ( |
6 |
+ "context" |
|
6 | 7 |
"os/exec" |
7 | 8 |
"strings" |
8 | 9 |
|
... | ... |
@@ -48,20 +49,10 @@ func (daemon *Daemon) FillPlatformInfo(v *types.Info, sysInfo *sysinfo.SysInfo) |
48 | 48 |
} |
49 | 49 |
|
50 | 50 |
v.ContainerdCommit.Expected = dockerversion.ContainerdCommitID |
51 |
- if rv, err := exec.Command("docker-containerd", "--version").Output(); err == nil { |
|
52 |
- parts := strings.Split(strings.TrimSpace(string(rv)), " ") |
|
53 |
- if len(parts) == 3 { |
|
54 |
- v.ContainerdCommit.ID = parts[2] |
|
55 |
- } |
|
56 |
- switch { |
|
57 |
- case v.ContainerdCommit.ID == "": |
|
58 |
- logrus.Warnf("failed to retrieve docker-containerd version: unknown format", string(rv)) |
|
59 |
- v.ContainerdCommit.ID = "N/A" |
|
60 |
- case strings.HasSuffix(v.ContainerdCommit.ID, "-g"+v.ContainerdCommit.ID[len(v.ContainerdCommit.ID)-7:]): |
|
61 |
- v.ContainerdCommit.ID = v.ContainerdCommit.Expected |
|
62 |
- } |
|
51 |
+ if rv, err := daemon.containerd.Version(context.Background()); err == nil { |
|
52 |
+ v.ContainerdCommit.ID = rv.Revision |
|
63 | 53 |
} else { |
64 |
- logrus.Warnf("failed to retrieve docker-containerd version: %v", err) |
|
54 |
+ logrus.Warnf("failed to retrieve containerd version: %v", err) |
|
65 | 55 |
v.ContainerdCommit.ID = "N/A" |
66 | 56 |
} |
67 | 57 |
|
... | ... |
@@ -60,6 +60,10 @@ type client struct { |
60 | 60 |
containers map[string]*container |
61 | 61 |
} |
62 | 62 |
|
63 |
+func (c *client) Version(ctx context.Context) (containerd.Version, error) { |
|
64 |
+ return c.remote.Version(ctx) |
|
65 |
+} |
|
66 |
+ |
|
63 | 67 |
func (c *client) Restore(ctx context.Context, id string, attachStdio StdioCallback) (alive bool, pid int, err error) { |
64 | 68 |
c.Lock() |
65 | 69 |
defer c.Unlock() |
... | ... |
@@ -17,6 +17,7 @@ import ( |
17 | 17 |
|
18 | 18 |
"github.com/Microsoft/hcsshim" |
19 | 19 |
opengcs "github.com/Microsoft/opengcs/client" |
20 |
+ "github.com/containerd/containerd" |
|
20 | 21 |
"github.com/docker/docker/pkg/sysinfo" |
21 | 22 |
"github.com/docker/docker/pkg/system" |
22 | 23 |
specs "github.com/opencontainers/runtime-spec/specs-go" |
... | ... |
@@ -70,6 +71,10 @@ const ( |
70 | 70 |
// of docker. |
71 | 71 |
const defaultOwner = "docker" |
72 | 72 |
|
73 |
+func (c *client) Version(ctx context.Context) (containerd.Version, error) { |
|
74 |
+ return containerd.Version{}, errors.New("not implemented on Windows") |
|
75 |
+} |
|
76 |
+ |
|
73 | 77 |
// Create is the entrypoint to create a container from a spec. |
74 | 78 |
// Table below shows the fields required for HCS JSON calling parameters, |
75 | 79 |
// where if not populated, is omitted. |
... | ... |
@@ -82,6 +82,8 @@ type Backend interface { |
82 | 82 |
|
83 | 83 |
// Client provides access to containerd features. |
84 | 84 |
type Client interface { |
85 |
+ Version(ctx context.Context) (containerd.Version, error) |
|
86 |
+ |
|
85 | 87 |
Restore(ctx context.Context, containerID string, attachStdio StdioCallback) (alive bool, pid int, err error) |
86 | 88 |
|
87 | 89 |
Create(ctx context.Context, containerID string, spec *specs.Spec, runtimeOptions interface{}) error |