Browse Source

Add expected 3rd party binaries commit ids to info

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
Kenfe-Mickael Laventure 8 năm trước cách đây
mục cha
commit
2790ac68b3

+ 1 - 0
Dockerfile

@@ -236,6 +236,7 @@ RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
 
 # Install tomlv, vndr, runc, containerd, tini, docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy
 

+ 1 - 0
Dockerfile.aarch64

@@ -164,6 +164,7 @@ RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
 
 # Install tomlv, vndr, runc, containerd, tini, docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy
 

+ 1 - 0
Dockerfile.armhf

@@ -168,6 +168,7 @@ RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
 
 # Install tomlv, vndr, runc, containerd, tini, docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy
 

+ 1 - 0
Dockerfile.ppc64le

@@ -187,6 +187,7 @@ RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
 
 # Install tomlv, vndr, runc, containerd, tini, docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy
 

+ 1 - 0
Dockerfile.s390x

@@ -179,6 +179,7 @@ RUN ./contrib/download-frozen-image-v2.sh /docker-frozen-images \
 
 # Install tomlv, vndr, runc, containerd, tini, docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy
 

+ 1 - 0
Dockerfile.simple

@@ -60,6 +60,7 @@ ENV CGO_LDFLAGS -L/lib
 
 # Install runc, containerd, tini and docker-proxy
 # Please edit hack/dockerfile/install-binaries.sh to update them.
+COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
 COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
 RUN /tmp/install-binaries.sh runc containerd tini proxy
 

+ 11 - 0
api/types/types.go

@@ -150,6 +150,13 @@ type Version struct {
 	BuildTime     string `json:",omitempty"`
 }
 
+// Commit records a external tool actual commit id version along the
+// one expect by dockerd as set at build time
+type Commit struct {
+	ID       string
+	Expected string
+}
+
 // InfoBase contains the base response of Remote API:
 // GET "/info"
 type InfoBase struct {
@@ -207,6 +214,10 @@ type InfoBase struct {
 	// running containers are detected
 	LiveRestoreEnabled bool
 	Isolation          container.Isolation
+	InitBinary         string
+	ContainerdCommit   Commit
+	RuncCommit         Commit
+	InitCommit         Commit
 }
 
 // SecurityOpt holds key/value pair about a security option

+ 16 - 0
cli/command/system/info.go

@@ -143,6 +143,22 @@ func prettyPrintInfo(dockerCli *command.DockerCli, info types.Info) error {
 	}
 
 	if info.OSType == "linux" {
+		fmt.Fprintf(dockerCli.Out(), "Init Binary: %v\n", info.InitBinary)
+
+		for _, ci := range []struct {
+			Name   string
+			Commit types.Commit
+		}{
+			{"containerd", info.ContainerdCommit},
+			{"runc", info.RuncCommit},
+			{"init", info.InitCommit},
+		} {
+			fmt.Fprintf(dockerCli.Out(), "%s version: %s", ci.Name, ci.Commit.ID)
+			if ci.Commit.ID != ci.Commit.Expected {
+				fmt.Fprintf(dockerCli.Out(), " (expected: %s)", ci.Commit.Expected)
+			}
+			fmt.Fprintf(dockerCli.Out(), "\n")
+		}
 		if len(info.SecurityOptions) != 0 {
 			fmt.Fprintf(dockerCli.Out(), "Security Options:\n")
 			for _, o := range info.SecurityOptions {

+ 10 - 0
daemon/config_common_unix.go

@@ -78,3 +78,13 @@ func (config *Config) GetAllRuntimes() map[string]types.Runtime {
 func (config *Config) GetExecRoot() string {
 	return config.ExecRoot
 }
+
+// GetInitPath returns the configure docker-init path
+func (config *Config) GetInitPath() string {
+	config.reloadLock.Lock()
+	defer config.reloadLock.Unlock()
+	if config.InitPath != "" {
+		return config.InitPath
+	}
+	return DefaultInitBinary
+}

+ 5 - 0
daemon/config_windows.go

@@ -46,6 +46,11 @@ func (config *Config) GetRuntime(name string) *types.Runtime {
 	return nil
 }
 
+// GetInitPath returns the configure docker-init path
+func (config *Config) GetInitPath() string {
+	return ""
+}
+
 // GetDefaultRuntimeName returns the current default runtime
 func (config *Config) GetDefaultRuntimeName() string {
 	return stockRuntimeName

+ 3 - 0
daemon/daemon.go

@@ -66,6 +66,9 @@ var (
 	// containerd if none is specified
 	DefaultRuntimeBinary = "docker-runc"
 
+	// DefaultInitBinary is the name of the default init binary
+	DefaultInitBinary = "docker-init"
+
 	errSystemNotSupported = fmt.Errorf("The Docker daemon is not supported on this platform.")
 )
 

+ 44 - 0
daemon/info.go

@@ -1,8 +1,11 @@
 package daemon
 
 import (
+	"context"
 	"os"
+	"os/exec"
 	"runtime"
+	"strings"
 	"sync/atomic"
 	"time"
 
@@ -147,6 +150,47 @@ func (daemon *Daemon) SystemInfo() (*types.Info, error) {
 		v.CPUSet = sysInfo.Cpuset
 		v.Runtimes = daemon.configStore.GetAllRuntimes()
 		v.DefaultRuntime = daemon.configStore.GetDefaultRuntimeName()
+		v.InitBinary = daemon.configStore.GetInitPath()
+
+		v.ContainerdCommit.Expected = dockerversion.ContainerdCommitID
+		if sv, err := daemon.containerd.GetServerVersion(context.Background()); err == nil {
+			v.ContainerdCommit.ID = sv.Revision
+		} else {
+			logrus.Warnf("failed to retrieve containerd version: %v", err)
+			v.ContainerdCommit.ID = "N/A"
+		}
+
+		v.RuncCommit.Expected = dockerversion.RuncCommitID
+		if rv, err := exec.Command(DefaultRuntimeBinary, "--version").Output(); err == nil {
+			parts := strings.Split(strings.TrimSpace(string(rv)), "\n")
+			if len(parts) == 3 {
+				parts = strings.Split(parts[1], ": ")
+				if len(parts) == 2 {
+					v.RuncCommit.ID = strings.TrimSpace(parts[1])
+				}
+			}
+		} else {
+			logrus.Warnf("failed to retrieve %s version: %v", DefaultRuntimeBinary, err)
+			v.RuncCommit.ID = "N/A"
+		}
+		if v.RuncCommit.ID == "" {
+			logrus.Warnf("failed to retrieve %s version: unknown output format", DefaultRuntimeBinary)
+			v.RuncCommit.ID = "N/A"
+		}
+
+		v.InitCommit.Expected = dockerversion.InitCommitID
+		if rv, err := exec.Command(DefaultInitBinary, "--version").Output(); err == nil {
+			parts := strings.Split(string(rv), " ")
+			if len(parts) == 3 {
+				v.InitCommit.ID = strings.TrimSpace(parts[2])
+			} else {
+				logrus.Warnf("failed to retrieve %s version: unknown output format", DefaultInitBinary)
+				v.InitCommit.ID = "N/A"
+			}
+		} else {
+			logrus.Warnf("failed to retrieve %s version", DefaultInitBinary)
+			v.InitCommit.ID = "N/A"
+		}
 	}
 
 	hostname := ""

+ 1 - 1
daemon/oci_linux.go

@@ -596,7 +596,7 @@ func (daemon *Daemon) populateCommonSpec(s *specs.Spec, c *container.Container)
 			s.Process.Args = append([]string{"/dev/init", c.Path}, c.Args...)
 			var path string
 			if daemon.configStore.InitPath == "" && c.HostConfig.InitPath == "" {
-				path, err = exec.LookPath("docker-init")
+				path, err = exec.LookPath(DefaultInitBinary)
 				if err != nil {
 					return err
 				}

+ 8 - 0
hack/dockerfile/binaries-commits

@@ -0,0 +1,8 @@
+#!/bin/sh
+
+TOMLV_COMMIT=9baf8a8a9f2ed20a8e54160840c492f937eeaf9a
+RUNC_COMMIT=ac031b5bf1cc92239461125f4c1ffb760522bbf2
+CONTAINERD_COMMIT=8517738ba4b82aff5662c97ca4627e7e4d03b531
+TINI_COMMIT=v0.13.0
+LIBNETWORK_COMMIT=0f534354b813003a754606689722fe253101bc4e
+VNDR_COMMIT=f56bd4504b4fad07a357913687fb652ee54bb3b0

+ 1 - 6
hack/dockerfile/install-binaries.sh

@@ -2,12 +2,7 @@
 set -e
 set -x
 
-TOMLV_COMMIT=9baf8a8a9f2ed20a8e54160840c492f937eeaf9a
-RUNC_COMMIT=ac031b5bf1cc92239461125f4c1ffb760522bbf2
-CONTAINERD_COMMIT=8517738ba4b82aff5662c97ca4627e7e4d03b531
-TINI_COMMIT=v0.13.0
-LIBNETWORK_COMMIT=0f534354b813003a754606689722fe253101bc4e
-VNDR_COMMIT=f56bd4504b4fad07a357913687fb652ee54bb3b0
+. $(dirname "$0")/binaries-commits
 
 RM_GOPATH=0
 

+ 11 - 5
hack/make/.go-autogen

@@ -2,6 +2,8 @@
 
 rm -rf autogen
 
+source hack/dockerfile/binaries-commits
+
 cat > dockerversion/version_autogen.go <<DVEOF
 // +build autogen
 
@@ -11,12 +13,16 @@ package dockerversion
 // Default build-time variable for library-import.
 // This file is overridden on build with build-time informations.
 const (
-	GitCommit string = "$GITCOMMIT"
-	Version   string = "$VERSION"
-	BuildTime string = "$BUILDTIME"
-	IAmStatic string = "${IAMSTATIC:-true}"
+	GitCommit          string = "$GITCOMMIT"
+	Version            string = "$VERSION"
+	BuildTime          string = "$BUILDTIME"
+	IAmStatic          string = "${IAMSTATIC:-true}"
+	ContainerdCommitID string = "${CONTAINERD_COMMIT}"
+	RuncCommitID       string = "${RUNC_COMMIT}"
+	InitCommitID       string = "${TINI_COMMIT}"
 )
-// AUTOGENERATED FILE; see $BASH_SOURCE
+
+// AUTOGENERATED FILE; see /go/src/github.com/docker/docker/hack/make/.go-autogen
 DVEOF
 
 # Compile the Windows resources into the sources

+ 1 - 1
integration-cli/docker_cli_info_test.go

@@ -36,7 +36,7 @@ func (s *DockerSuite) TestInfoEnsureSucceeds(c *check.C) {
 	}
 
 	if daemonPlatform == "linux" {
-		stringsToCheck = append(stringsToCheck, "Security Options:")
+		stringsToCheck = append(stringsToCheck, "Init Binary:", "Security Options:", "containerd version:", "runc version:", "init version:")
 	}
 
 	if DaemonIsLinux.Condition() {

+ 14 - 0
libcontainerd/client_linux.go

@@ -28,6 +28,20 @@ type client struct {
 	liveRestore   bool
 }
 
+// GetServerVersion returns the connected server version information
+func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) {
+	resp, err := clnt.remote.apiClient.GetServerVersion(ctx, &containerd.GetServerVersionRequest{})
+	if err != nil {
+		return nil, err
+	}
+
+	sv := &ServerVersion{
+		GetServerVersionResponse: *resp,
+	}
+
+	return sv, nil
+}
+
 // AddProcess is the handler for adding a process to an already running
 // container. It's called through docker exec. It returns the system pid of the
 // exec'd process.

+ 14 - 0
libcontainerd/client_solaris.go

@@ -12,6 +12,20 @@ type client struct {
 	liveRestore   bool
 }
 
+// GetServerVersion returns the connected server version information
+func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) {
+	resp, err := clnt.remote.apiClient.GetServerVersion(ctx, &containerd.GetServerVersionRequest{})
+	if err != nil {
+		return nil, err
+	}
+
+	sv := &ServerVersion{
+		GetServerVersionResponse: *resp,
+	}
+
+	return sv, nil
+}
+
 func (clnt *client) AddProcess(ctx context.Context, containerID, processFriendlyName string, specp Process, attachStdio StdioCallback) (int, error) {
 	return -1, nil
 }

+ 4 - 0
libcontainerd/client_windows.go

@@ -614,3 +614,7 @@ func (clnt *client) DeleteCheckpoint(containerID string, checkpointID string, ch
 func (clnt *client) ListCheckpoints(containerID string, checkpointDir string) (*Checkpoints, error) {
 	return nil, errors.New("Windows: Containers do not support checkpoints")
 }
+
+func (clnt *client) GetServerVersion(ctx context.Context) (*ServerVersion, error) {
+	return &ServerVersion{}, nil
+}

+ 8 - 0
libcontainerd/types.go

@@ -3,6 +3,7 @@ package libcontainerd
 import (
 	"io"
 
+	containerd "github.com/docker/containerd/api/grpc/types"
 	"github.com/opencontainers/runtime-spec/specs-go"
 	"golang.org/x/net/context"
 )
@@ -33,6 +34,7 @@ type Backend interface {
 
 // Client provides access to containerd features.
 type Client interface {
+	GetServerVersion(ctx context.Context) (*ServerVersion, error)
 	Create(containerID string, checkpoint string, checkpointDir string, spec specs.Spec, attachStdio StdioCallback, options ...CreateOption) error
 	Signal(containerID string, sig int) error
 	SignalProcess(containerID string, processFriendlyName string, sig int) error
@@ -65,3 +67,9 @@ type IOPipe struct {
 	Stderr   io.ReadCloser
 	Terminal bool // Whether stderr is connected on Windows
 }
+
+// ServerVersion contains version information as retrieved from the
+// server
+type ServerVersion struct {
+	containerd.GetServerVersionResponse
+}