diff --git a/components/engine/builder/dockerfile/dispatchers.go b/components/engine/builder/dockerfile/dispatchers.go index 6ee2b17cda..02e7385a9b 100644 --- a/components/engine/builder/dockerfile/dispatchers.go +++ b/components/engine/builder/dockerfile/dispatchers.go @@ -365,7 +365,8 @@ func dispatchRun(d dispatchRequest, c *instructions.RunCommand) error { runConfig := copyRunConfig(stateRunConfig, withCmd(cmdFromArgs), withEnv(append(stateRunConfig.Env, buildArgs...)), - withEntrypointOverride(saveCmd, strslice.StrSlice{""})) + withEntrypointOverride(saveCmd, strslice.StrSlice{""}), + withoutHealthcheck()) // set config as already being escaped, this prevents double escaping on windows runConfig.ArgsEscaped = true diff --git a/components/engine/builder/dockerfile/dispatchers_test.go b/components/engine/builder/dockerfile/dispatchers_test.go index c61a45b03a..efa3a1f47e 100644 --- a/components/engine/builder/dockerfile/dispatchers_test.go +++ b/components/engine/builder/dockerfile/dispatchers_test.go @@ -473,3 +473,64 @@ func TestRunWithBuildArgs(t *testing.T) { // Check that runConfig.Cmd has not been modified by run assert.Check(t, is.DeepEqual(origCmd, sb.state.runConfig.Cmd)) } + +func TestRunIgnoresHealthcheck(t *testing.T) { + b := newBuilderWithMockBackend() + args := NewBuildArgs(make(map[string]*string)) + sb := newDispatchRequest(b, '`', nil, args, newStagesBuildResults()) + b.disableCommit = false + + origCmd := strslice.StrSlice([]string{"cmd", "in", "from", "image"}) + + imageCache := &mockImageCache{ + getCacheFunc: func(parentID string, cfg *container.Config) (string, error) { + return "", nil + }, + } + + mockBackend := b.docker.(*MockBackend) + mockBackend.makeImageCacheFunc = func(_ []string) builder.ImageCache { + return imageCache + } + b.imageProber = newImageProber(mockBackend, nil, false) + mockBackend.getImageFunc = func(_ string) (builder.Image, builder.ROLayer, error) { + return &mockImage{ + id: "abcdef", + config: &container.Config{Cmd: origCmd}, + }, nil, nil + } + mockBackend.containerCreateFunc = func(config types.ContainerCreateConfig) (container.ContainerCreateCreatedBody, error) { + return container.ContainerCreateCreatedBody{ID: "12345"}, nil + } + mockBackend.commitFunc = func(cfg backend.CommitConfig) (image.ID, error) { + return "", nil + } + from := &instructions.Stage{BaseName: "abcdef"} + err := initializeStage(sb, from) + assert.NilError(t, err) + + expectedTest := []string{"CMD-SHELL", "curl -f http://localhost/ || exit 1"} + cmd := &instructions.HealthCheckCommand{ + Health: &container.HealthConfig{ + Test: expectedTest, + }, + } + assert.NilError(t, dispatch(sb, cmd)) + assert.Assert(t, sb.state.runConfig.Healthcheck != nil) + + mockBackend.containerCreateFunc = func(config types.ContainerCreateConfig) (container.ContainerCreateCreatedBody, error) { + // Check the Healthcheck is disabled. + assert.Check(t, is.DeepEqual([]string{"NONE"}, config.Config.Healthcheck.Test)) + return container.ContainerCreateCreatedBody{ID: "123456"}, nil + } + + sb.state.buildArgs.AddArg("one", strPtr("two")) + run := &instructions.RunCommand{ + ShellDependantCmdLine: instructions.ShellDependantCmdLine{ + CmdLine: strslice.StrSlice{"echo foo"}, + PrependShell: true, + }, + } + assert.NilError(t, dispatch(sb, run)) + assert.Check(t, is.DeepEqual(expectedTest, sb.state.runConfig.Healthcheck.Test)) +} diff --git a/components/engine/builder/dockerfile/internals.go b/components/engine/builder/dockerfile/internals.go index 1b3a5b0f03..d892285a1c 100644 --- a/components/engine/builder/dockerfile/internals.go +++ b/components/engine/builder/dockerfile/internals.go @@ -343,6 +343,18 @@ func withEntrypointOverride(cmd []string, entrypoint []string) runConfigModifier } } +// withoutHealthcheck disables healthcheck. +// +// The dockerfile RUN instruction expect to run without healthcheck +// so the runConfig Healthcheck needs to be disabled. +func withoutHealthcheck() runConfigModifier { + return func(runConfig *container.Config) { + runConfig.Healthcheck = &container.HealthConfig{ + Test: []string{"NONE"}, + } + } +} + func copyRunConfig(runConfig *container.Config, modifiers ...runConfigModifier) *container.Config { copy := *runConfig copy.Cmd = copyStringSlice(runConfig.Cmd) diff --git a/components/engine/daemon/cluster/controllers/plugin/controller.go b/components/engine/daemon/cluster/controllers/plugin/controller.go index 6d7606aa84..371f918d39 100644 --- a/components/engine/daemon/cluster/controllers/plugin/controller.go +++ b/components/engine/daemon/cluster/controllers/plugin/controller.go @@ -180,7 +180,7 @@ func (p *Controller) Wait(ctx context.Context) error { case <-ctx.Done(): return ctx.Err() case e := <-events: - p.logger.Debugf("got event %#T", e) + p.logger.Debugf("got event %T", e) switch e.(type) { case plugin.EventEnable: diff --git a/components/engine/daemon/daemon.go b/components/engine/daemon/daemon.go index 5e5f586ae0..119fac2a0a 100644 --- a/components/engine/daemon/daemon.go +++ b/components/engine/daemon/daemon.go @@ -538,7 +538,7 @@ func (daemon *Daemon) DaemonLeavesCluster() { select { case <-done: case <-time.After(5 * time.Second): - logrus.Warnf("timeout while waiting for ingress network removal") + logrus.Warn("timeout while waiting for ingress network removal") } } else { logrus.Warnf("failed to initiate ingress network removal: %v", err) diff --git a/components/engine/daemon/daemon_unix.go b/components/engine/daemon/daemon_unix.go index e2c77610d4..3c11f9d582 100644 --- a/components/engine/daemon/daemon_unix.go +++ b/components/engine/daemon/daemon_unix.go @@ -646,13 +646,13 @@ func (daemon *Daemon) initRuntimes(runtimes map[string]types.Runtime) (err error os.RemoveAll(runtimeDir + "-old") tmpDir, err := ioutils.TempDir(daemon.configStore.Root, "gen-runtimes") if err != nil { - return errors.Wrapf(err, "failed to get temp dir to generate runtime scripts") + return errors.Wrap(err, "failed to get temp dir to generate runtime scripts") } defer func() { if err != nil { if err1 := os.RemoveAll(tmpDir); err1 != nil { logrus.WithError(err1).WithField("dir", tmpDir). - Warnf("failed to remove tmp dir") + Warn("failed to remove tmp dir") } return } @@ -661,12 +661,12 @@ func (daemon *Daemon) initRuntimes(runtimes map[string]types.Runtime) (err error return } if err = os.Rename(tmpDir, runtimeDir); err != nil { - err = errors.Wrapf(err, "failed to setup runtimes dir, new containers may not start") + err = errors.Wrap(err, "failed to setup runtimes dir, new containers may not start") return } if err = os.RemoveAll(runtimeDir + "-old"); err != nil { logrus.WithError(err).WithField("dir", tmpDir). - Warnf("failed to remove old runtimes dir") + Warn("failed to remove old runtimes dir") } }() @@ -1126,7 +1126,7 @@ func setupRemappedRoot(config *config.Config) (*idtools.IDMappings, error) { mappings, err := idtools.NewIDMappings(username, groupname) if err != nil { - return nil, errors.Wrapf(err, "Can't create ID mappings: %v") + return nil, errors.Wrap(err, "Can't create ID mappings") } return mappings, nil } diff --git a/components/engine/daemon/graphdriver/aufs/aufs.go b/components/engine/daemon/graphdriver/aufs/aufs.go index 9152252770..ac2fe26ecd 100644 --- a/components/engine/daemon/graphdriver/aufs/aufs.go +++ b/components/engine/daemon/graphdriver/aufs/aufs.go @@ -373,7 +373,7 @@ func atomicRemove(source string) error { case os.IsExist(err): // Got error saying the target dir already exists, maybe the source doesn't exist due to a previous (failed) remove if _, e := os.Stat(source); !os.IsNotExist(e) { - return errors.Wrapf(err, "target rename dir '%s' exists but should not, this needs to be manually cleaned up") + return errors.Wrapf(err, "target rename dir %q exists but should not, this needs to be manually cleaned up", target) } default: return errors.Wrapf(err, "error preparing atomic delete") diff --git a/components/engine/daemon/kill.go b/components/engine/daemon/kill.go index 5034c4df39..3e6457e952 100644 --- a/components/engine/daemon/kill.go +++ b/components/engine/daemon/kill.go @@ -108,7 +108,7 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int) if unpause { // above kill signal will be sent once resume is finished if err := daemon.containerd.Resume(context.Background(), container.ID); err != nil { - logrus.Warn("Cannot unpause container %s: %s", container.ID, err) + logrus.Warnf("Cannot unpause container %s: %s", container.ID, err) } } diff --git a/components/engine/daemon/logger/loggerutils/logfile.go b/components/engine/daemon/logger/loggerutils/logfile.go index 6e3cda8648..d13db5ec48 100644 --- a/components/engine/daemon/logger/loggerutils/logfile.go +++ b/components/engine/daemon/logger/loggerutils/logfile.go @@ -332,7 +332,7 @@ func (w *LogFile) ReadLogs(config logger.ReadConfig, watcher *logger.LogWatcher) if strings.HasSuffix(fileName, tmpLogfileSuffix) { err := w.filesRefCounter.Dereference(fileName) if err != nil { - logrus.Errorf("Failed to dereference the log file %q: %v", fileName, err) + logrus.Errorf("Failed to dereference log file %q: %v", fileName, err) } } } @@ -364,7 +364,7 @@ func (w *LogFile) openRotatedFiles(config logger.ReadConfig) (files []*os.File, if strings.HasSuffix(f.Name(), tmpLogfileSuffix) { err := os.Remove(f.Name()) if err != nil && !os.IsNotExist(err) { - logrus.Warningf("Failed to remove the logfile %q: %v", f.Name, err) + logrus.Warnf("Failed to remove logfile: %v", err) } } } @@ -436,7 +436,7 @@ func decompressfile(fileName, destFileName string, since time.Time) (*os.File, e rs.Close() rErr := os.Remove(rs.Name()) if rErr != nil && !os.IsNotExist(rErr) { - logrus.Errorf("Failed to remove the logfile %q: %v", rs.Name(), rErr) + logrus.Errorf("Failed to remove logfile: %v", rErr) } return nil, errors.Wrap(err, "error while copying decompressed log stream to file") } @@ -561,7 +561,7 @@ func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan int } return errRetry case err := <-fileWatcher.Errors(): - logrus.Debug("logger got error watching file: %v", err) + logrus.Debugf("logger got error watching file: %v", err) // Something happened, let's try and stay alive and create a new watcher if retries <= 5 { fileWatcher.Close() diff --git a/components/engine/daemon/monitor.go b/components/engine/daemon/monitor.go index 5e740dd4fe..9b4452d7ef 100644 --- a/components/engine/daemon/monitor.go +++ b/components/engine/daemon/monitor.go @@ -138,7 +138,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc "container": c.ID, "exec-id": ei.ProcessID, "exec-pid": ei.Pid, - }).Warnf("Ignoring Exit Event, no such exec command found") + }).Warn("Ignoring Exit Event, no such exec command found") } case libcontainerd.EventStart: c.Lock() diff --git a/components/engine/daemon/reload.go b/components/engine/daemon/reload.go index 210864ff87..452615c3ee 100644 --- a/components/engine/daemon/reload.go +++ b/components/engine/daemon/reload.go @@ -186,7 +186,7 @@ func (daemon *Daemon) reloadClusterDiscovery(conf *config.Config, attributes map } netOptions, err := daemon.networkOptions(daemon.configStore, daemon.PluginStore, nil) if err != nil { - logrus.WithError(err).Warnf("failed to get options with network controller") + logrus.WithError(err).Warn("failed to get options with network controller") return nil } err = daemon.netController.ReloadConfiguration(netOptions...) diff --git a/components/engine/daemon/unpause.go b/components/engine/daemon/unpause.go index 9061d50a16..27648ae72e 100644 --- a/components/engine/daemon/unpause.go +++ b/components/engine/daemon/unpause.go @@ -37,7 +37,7 @@ func (daemon *Daemon) containerUnpause(container *container.Container) error { daemon.LogContainerEvent(container, "unpause") if err := container.CheckpointTo(daemon.containersReplica); err != nil { - logrus.WithError(err).Warnf("could not save container to disk") + logrus.WithError(err).Warn("could not save container to disk") } return nil diff --git a/components/engine/hack/dockerfile/install/gometalinter.installer b/components/engine/hack/dockerfile/install/gometalinter.installer index 13500e1c89..d921fd739a 100755 --- a/components/engine/hack/dockerfile/install/gometalinter.installer +++ b/components/engine/hack/dockerfile/install/gometalinter.installer @@ -1,6 +1,6 @@ #!/bin/sh -GOMETALINTER_COMMIT=bfcc1d6942136fd86eb6f1a6fb328de8398fbd80 +GOMETALINTER_COMMIT=v2.0.6 install_gometalinter() { echo "Installing gometalinter version $GOMETALINTER_COMMIT"