mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
fn: docker version check2 (#744)
1) now required docker version is 17.06 2) enable circle ci latest docker install 3) docker driver & agent check minimum version before start
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
"github.com/fnproject/fn/api/agent/drivers"
|
||||
"github.com/fnproject/fn/api/common"
|
||||
"github.com/fnproject/fn/api/models"
|
||||
@@ -58,12 +59,45 @@ func NewDocker(conf drivers.Config) *DockerDriver {
|
||||
logrus.WithError(err).Fatal("couldn't resolve hostname")
|
||||
}
|
||||
|
||||
return &DockerDriver{
|
||||
driver := &DockerDriver{
|
||||
conf: conf,
|
||||
docker: newClient(),
|
||||
hostname: hostname,
|
||||
auths: registryFromEnv(),
|
||||
}
|
||||
|
||||
if conf.ServerVersion != "" {
|
||||
err = checkDockerVersion(driver, conf.ServerVersion)
|
||||
if err != nil {
|
||||
logrus.WithError(err).Fatal("docker version error")
|
||||
}
|
||||
}
|
||||
|
||||
return driver
|
||||
}
|
||||
|
||||
func checkDockerVersion(driver *DockerDriver, expected string) error {
|
||||
|
||||
info, err := driver.docker.Info(context.Background())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
actual, err := semver.NewVersion(info.ServerVersion)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
wanted, err := semver.NewVersion(expected)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if actual.Compare(*wanted) < 0 {
|
||||
return fmt.Errorf("docker version is too old. Required: %s Found: %s", expected, info.ServerVersion)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func registryFromEnv() map[string]docker.AuthConfiguration {
|
||||
|
||||
@@ -38,6 +38,7 @@ type dockerClient interface {
|
||||
InspectImage(ctx context.Context, name string) (*docker.Image, error)
|
||||
InspectContainerWithContext(container string, ctx context.Context) (*docker.Container, error)
|
||||
Stats(opts docker.StatsOptions) error
|
||||
Info(ctx context.Context) (*docker.DockerInfo, error)
|
||||
}
|
||||
|
||||
// TODO: switch to github.com/docker/engine-api
|
||||
@@ -169,6 +170,19 @@ func filterNoSuchContainer(ctx context.Context, err error) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (d *dockerWrap) Info(ctx context.Context) (info *docker.DockerInfo, err error) {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "docker_server_version")
|
||||
defer span.Finish()
|
||||
|
||||
ctx, cancel := context.WithTimeout(ctx, retryTimeout)
|
||||
defer cancel()
|
||||
err = d.retry(ctx, func() error {
|
||||
info, err = d.docker.Info()
|
||||
return err
|
||||
})
|
||||
return info, err
|
||||
}
|
||||
|
||||
func (d *dockerWrap) AttachToContainerNonBlocking(ctx context.Context, opts docker.AttachToContainerOptions) (w docker.CloseWaiter, err error) {
|
||||
span, ctx := opentracing.StartSpanFromContext(ctx, "docker_attach_container")
|
||||
defer span.Finish()
|
||||
|
||||
@@ -63,6 +63,26 @@ func TestRunnerDocker(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunnerDockerVersion(t *testing.T) {
|
||||
|
||||
dkr := NewDocker(drivers.Config{
|
||||
ServerVersion: "0.0.0",
|
||||
})
|
||||
if dkr == nil {
|
||||
t.Fatal("should not be nil")
|
||||
}
|
||||
|
||||
err := checkDockerVersion(dkr, "1.0.0")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = checkDockerVersion(dkr, "9999.0.0")
|
||||
if err == nil {
|
||||
t.Fatal("should have failed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunnerDockerStdin(t *testing.T) {
|
||||
dkr := NewDocker(drivers.Config{})
|
||||
ctx := context.Background()
|
||||
|
||||
Reference in New Issue
Block a user