The health check process doesn't have all the environment
varialbes in the container or has them set incorrectly.
This patch should fix that problem.
Signed-off-by: Boaz Shuster <ripcurld.github@gmail.com>
| ... | ... |
@@ -64,31 +64,35 @@ type cmdProbe struct {
|
| 64 | 64 |
|
| 65 | 65 |
// exec the healthcheck command in the container. |
| 66 | 66 |
// Returns the exit code and probe output (if any) |
| 67 |
-func (p *cmdProbe) run(ctx context.Context, d *Daemon, container *container.Container) (*types.HealthcheckResult, error) {
|
|
| 68 |
- |
|
| 69 |
- cmdSlice := strslice.StrSlice(container.Config.Healthcheck.Test)[1:] |
|
| 67 |
+func (p *cmdProbe) run(ctx context.Context, d *Daemon, cntr *container.Container) (*types.HealthcheckResult, error) {
|
|
| 68 |
+ cmdSlice := strslice.StrSlice(cntr.Config.Healthcheck.Test)[1:] |
|
| 70 | 69 |
if p.shell {
|
| 71 |
- cmdSlice = append(getShell(container.Config), cmdSlice...) |
|
| 70 |
+ cmdSlice = append(getShell(cntr.Config), cmdSlice...) |
|
| 72 | 71 |
} |
| 73 | 72 |
entrypoint, args := d.getEntrypointAndArgs(strslice.StrSlice{}, cmdSlice)
|
| 74 | 73 |
execConfig := exec.NewConfig() |
| 75 | 74 |
execConfig.OpenStdin = false |
| 76 | 75 |
execConfig.OpenStdout = true |
| 77 | 76 |
execConfig.OpenStderr = true |
| 78 |
- execConfig.ContainerID = container.ID |
|
| 77 |
+ execConfig.ContainerID = cntr.ID |
|
| 79 | 78 |
execConfig.DetachKeys = []byte{}
|
| 80 | 79 |
execConfig.Entrypoint = entrypoint |
| 81 | 80 |
execConfig.Args = args |
| 82 | 81 |
execConfig.Tty = false |
| 83 | 82 |
execConfig.Privileged = false |
| 84 |
- execConfig.User = container.Config.User |
|
| 85 |
- execConfig.Env = container.Config.Env |
|
| 83 |
+ execConfig.User = cntr.Config.User |
|
| 84 |
+ |
|
| 85 |
+ linkedEnv, err := d.setupLinkedContainers(cntr) |
|
| 86 |
+ if err != nil {
|
|
| 87 |
+ return nil, err |
|
| 88 |
+ } |
|
| 89 |
+ execConfig.Env = container.ReplaceOrAppendEnvValues(cntr.CreateDaemonEnvironment(execConfig.Tty, linkedEnv), execConfig.Env) |
|
| 86 | 90 |
|
| 87 |
- d.registerExecCommand(container, execConfig) |
|
| 88 |
- d.LogContainerEvent(container, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")) |
|
| 91 |
+ d.registerExecCommand(cntr, execConfig) |
|
| 92 |
+ d.LogContainerEvent(cntr, "exec_create: "+execConfig.Entrypoint+" "+strings.Join(execConfig.Args, " ")) |
|
| 89 | 93 |
|
| 90 | 94 |
output := &limitedBuffer{}
|
| 91 |
- err := d.ContainerExecStart(ctx, execConfig.ID, nil, output, output) |
|
| 95 |
+ err = d.ContainerExecStart(ctx, execConfig.ID, nil, output, output) |
|
| 92 | 96 |
if err != nil {
|
| 93 | 97 |
return nil, err |
| 94 | 98 |
} |
| ... | ... |
@@ -97,7 +101,7 @@ func (p *cmdProbe) run(ctx context.Context, d *Daemon, container *container.Cont |
| 97 | 97 |
return nil, err |
| 98 | 98 |
} |
| 99 | 99 |
if info.ExitCode == nil {
|
| 100 |
- return nil, fmt.Errorf("Healthcheck for container %s has no exit code!", container.ID)
|
|
| 100 |
+ return nil, fmt.Errorf("Healthcheck for container %s has no exit code!", cntr.ID)
|
|
| 101 | 101 |
} |
| 102 | 102 |
// Note: Go's json package will handle invalid UTF-8 for us |
| 103 | 103 |
out := output.String() |
| ... | ... |
@@ -139,3 +139,26 @@ func (s *DockerSuite) TestHealth(c *check.C) {
|
| 139 | 139 |
c.Check(out, checker.Equals, "[CMD cat /my status]\n") |
| 140 | 140 |
|
| 141 | 141 |
} |
| 142 |
+ |
|
| 143 |
+// Github #33021 |
|
| 144 |
+func (s *DockerSuite) TestUnsetEnvVarHealthCheck(c *check.C) {
|
|
| 145 |
+ testRequires(c, DaemonIsLinux) // busybox doesn't work on Windows |
|
| 146 |
+ |
|
| 147 |
+ imageName := "testhealth" |
|
| 148 |
+ buildImageSuccessfully(c, imageName, build.WithDockerfile(`FROM busybox |
|
| 149 |
+HEALTHCHECK --interval=1s --timeout=5s --retries=5 CMD /bin/sh -c "sleep 1" |
|
| 150 |
+ENTRYPOINT /bin/sh -c "sleep 600"`)) |
|
| 151 |
+ |
|
| 152 |
+ name := "env_test_health" |
|
| 153 |
+ // No health status before starting |
|
| 154 |
+ dockerCmd(c, "run", "-d", "--name", name, "-e", "FOO", imageName) |
|
| 155 |
+ defer func() {
|
|
| 156 |
+ dockerCmd(c, "rm", "-f", name) |
|
| 157 |
+ dockerCmd(c, "rmi", imageName) |
|
| 158 |
+ }() |
|
| 159 |
+ |
|
| 160 |
+ // Start |
|
| 161 |
+ dockerCmd(c, "start", name) |
|
| 162 |
+ waitForHealthStatus(c, name, "starting", "healthy") |
|
| 163 |
+ |
|
| 164 |
+} |