package container import ( "context" "testing" "time" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/strslice" "github.com/docker/docker/client" "github.com/docker/docker/integration/util/request" "github.com/gotestyourself/gotestyourself/poll" "github.com/stretchr/testify/require" ) // TestHealthCheckWorkdir verifies that health-checks inherit the containers' // working-dir. func TestHealthCheckWorkdir(t *testing.T) { defer setupTest(t)() ctx := context.Background() client := request.NewAPIClient(t) c, err := client.ContainerCreate(ctx, &container.Config{ Image: "busybox", Tty: true, WorkingDir: "/foo", Cmd: strslice.StrSlice([]string{"top"}), Healthcheck: &container.HealthConfig{ Test: []string{"CMD-SHELL", "if [ \"$PWD\" = \"/foo\" ]; then exit 0; else exit 1; fi;"}, Interval: 50 * time.Millisecond, Retries: 3, }, }, &container.HostConfig{}, &network.NetworkingConfig{}, "healthtest", ) require.NoError(t, err) err = client.ContainerStart(ctx, c.ID, types.ContainerStartOptions{}) require.NoError(t, err) poll.WaitOn(t, pollForHealthStatus(ctx, client, c.ID, types.Healthy), poll.WithDelay(100*time.Millisecond)) } func pollForHealthStatus(ctx context.Context, client client.APIClient, containerID string, healthStatus string) func(log poll.LogT) poll.Result { return func(log poll.LogT) poll.Result { inspect, err := client.ContainerInspect(ctx, containerID) switch { case err != nil: return poll.Error(err) case inspect.State.Health.Status == healthStatus: return poll.Success() default: return poll.Continue("waiting for container to become %s", healthStatus) } } }