diff --git a/changes/pr4287.yaml b/changes/pr4287.yaml
new file mode 100644
index 0000000000..2f28d5641f
--- /dev/null
+++ b/changes/pr4287.yaml
@@ -0,0 +1,2 @@
+fix:
+  - "Fix bug where sometimes the global `prefect.context` wouldn't be respected during a flow run - [#4287](https://github.com/PrefectHQ/prefect/pull/4287)"
diff --git a/src/prefect/engine/flow_runner.py b/src/prefect/engine/flow_runner.py
index 5150b15fb2..e741366341 100644
--- a/src/prefect/engine/flow_runner.py
+++ b/src/prefect/engine/flow_runner.py
@@ -224,10 +224,13 @@ class FlowRunner(Runner):
         self.logger.info("Beginning Flow run for '{}'".format(self.flow.name))
 
         # make copies to avoid modifying user inputs
+        parameters = dict(parameters or {})
         task_states = dict(task_states or {})
-        context = dict(context or {})
         task_contexts = dict(task_contexts or {})
-        parameters = dict(parameters or {})
+        # Default to global context, with provided context as override
+        run_context = dict(prefect.context)
+        run_context.update(context or {})
+
         if executor is None:
             # Use the executor on the flow, if configured
             executor = getattr(self.flow, "executor", None)
@@ -237,15 +240,15 @@ class FlowRunner(Runner):
         self.logger.debug("Using executor type %s", type(executor).__name__)
 
         try:
-            state, task_states, context, task_contexts = self.initialize_run(
+            state, task_states, run_context, task_contexts = self.initialize_run(
                 state=state,
                 task_states=task_states,
-                context=context,
+                context=run_context,
                 task_contexts=task_contexts,
                 parameters=parameters,
             )
 
-            with prefect.context(context):
+            with prefect.context(run_context):
                 state = self.check_flow_is_pending_or_running(state)
                 state = self.check_flow_reached_start_time(state)
                 state = self.set_flow_to_running(state)
@@ -266,7 +269,7 @@ class FlowRunner(Runner):
             self.logger.exception(
                 "Unexpected error while running flow: {}".format(repr(exc))
             )
-            if prefect.context.get("raise_on_exception"):
+            if run_context.get("raise_on_exception"):
                 raise exc
             new_state = Failed(
                 message="Unexpected error while running flow: {}".format(repr(exc)),

diff --git a/tests/engine/test_flow_runner.py b/tests/engine/test_flow_runner.py
index 47749cd250..c07cc95fbf 100644
--- a/tests/engine/test_flow_runner.py
+++ b/tests/engine/test_flow_runner.py
@@ -1323,18 +1323,28 @@ class TestContext:
         output = res.result[return_ctx_key].result
         assert isinstance(output, datetime.datetime)
 
-    def test_user_provided_context_is_prioritized(self):
+    @pytest.mark.parametrize(
+        "outer_context, inner_context, sol",
+        [
+            ({"date": "outer"}, {"date": "inner"}, "inner"),
+            ({"date": "outer"}, {}, "outer"),
+        ],
+    )
+    def test_user_provided_context_is_prioritized(
+        self, outer_context, inner_context, sol
+    ):
         @prefect.task
         def return_ctx_key():
             return prefect.context.get("date")
 
         f = Flow(name="test", tasks=[return_ctx_key])
-        res = f.run(context={"date": "42"})
+        with prefect.context(**outer_context):
+            res = f.run(context=inner_context)
 
         assert res.is_successful()
 
         output = res.result[return_ctx_key].result
-        assert output == "42"
+        assert output == sol
 
 
 @pytest.mark.parametrize(

FlowRunner won't preserve all items from prefect.context
## Description
<!-- A clear description of the bug -->
FlowRunner does not preserve all items from prefect.context (e.g. dates: today, yesterday, etc.), because `initialize_run()` method prepares an empty context if not specified in `context` parameter. This could be okay, but contradicts to the [documentation](https://docs.prefect.io/core/concepts/execution.html#modifying-context-at-runtime), where it is suggested that for "backfills", dates could be overridded (e.g. today). 

## Expected Behavior
<!-- What did you expect to happen instead? -->
Items already set in prefect.context should be respected.

## Reproduction
<!-- A minimal example that exhibits the behavior. -->

Both runs should output the same value "YESTERDAAAAAY" for `yesterday`, but the first outputs the actual date (2021-03-18 as of this writing).

```python
import prefect
from prefect import task, Flow

CTX = dict(test_variable="TEST_VALUE", yesterday="YESTERDAAAAAY")

@task(log_stdout=True)
def print_env():
    print('TEST_VARIABLE: %s' % prefect.context.get('test_variable', 'MISSING'))
    print('YESTERDAY: %s' % prefect.context.get('yesterday', 'MISSING'))

with Flow("Context override test") as flow:
    print_env()

## Run 1
with prefect.context(**CTX):
    flow.run()

## Run 2
flow.run(context=CTX)
```

## Environment
<!-- Any additional information about your environment

Optionally run `prefect diagnostics` from the command line and paste the information here. -->
```json
{
  "config_overrides": {},
  "env_vars": [],
  "system_information": {
    "platform": "Linux-4.18.0-240.10.1.el8_3.x86_64-x86_64-with-centos-8.3.2011",
    "prefect_backend": "server",
    "prefect_version": "0.14.10",
    "python_version": "3.6.8"
  }
}
```

## Suggested Resolution

A single line added to FlowRunner could solve that. 

```diff
--- prefect/engine/flow_runner.py.orig  2021-02-16 16:08:28.204208267 +0100
+++ prefect/engine/flow_runner.py       2021-03-19 16:36:56.278923592 +0100
@@ -152,6 +152,7 @@
         for param, value in (parameters or {}).items():
             context_params[param] = value
 
+        context.update(prefect.context)
         context.update(flow_name=self.flow.name)
         context.setdefault("scheduled_start_time", pendulum.now("utc"))
```
tests/engine/test_flow_runner.py::TestContext::test_user_provided_context_is_prioritized[outer_context1-inner_context1-outer]
tests/engine/test_flow_runner.py::test_flow_runner_has_logger tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_1_task tests/engine/test_flow_runner.py::test_flow_runner_with_no_return_tasks tests/engine/test_flow_runner.py::test_flow_runner_with_invalid_return_tasks tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_2_independent_tasks tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_2_dependent_tasks tests/engine/test_flow_runner.py::test_flow_runner_runs_base_task_class tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_2_dependent_tasks_and_first_task_fails tests/engine/test_flow_runner.py::test_flow_runner_runs_flow_with_2_dependent_tasks_and_first_task_fails_and_second_has_trigger tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_2_dependent_tasks_and_first_task_fails_with_FAIL tests/engine/test_flow_runner.py::test_flow_runner_runs_basic_flow_with_2_dependent_tasks_and_second_task_fails tests/engine/test_flow_runner.py::test_flow_runner_does_not_return_task_states_when_it_doesnt_run tests/engine/test_flow_runner.py::test_flow_run_method_returns_task_states_even_if_it_doesnt_run tests/engine/test_flow_runner.py::test_flow_runner_remains_running_if_tasks_are_retrying tests/engine/test_flow_runner.py::test_secrets_dynamically_pull_from_context tests/engine/test_flow_runner.py::test_secrets_are_rerun_on_restart tests/engine/test_flow_runner.py::test_flow_runner_doesnt_return_by_default tests/engine/test_flow_runner.py::test_flow_runner_does_return_tasks_when_requested tests/engine/test_flow_runner.py::test_required_parameters_must_be_provided tests/engine/test_flow_runner.py::test_parameters_are_placed_into_context tests/engine/test_flow_runner.py::test_parameters_are_placed_into_context_including_defaults tests/engine/test_flow_runner.py::test_parameters_are_placed_into_context_and_override_current_context tests/engine/test_flow_runner.py::test_flow_run_state_determined_by_reference_tasks tests/engine/test_flow_runner.py::test_flow_run_state_not_determined_by_reference_tasks_if_terminal_tasks_are_not_finished tests/engine/test_flow_runner.py::test_flow_with_multiple_retry_tasks_doesnt_run_them_early tests/engine/test_flow_runner.py::test_flow_runner_makes_copy_of_task_results_dict tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_pending_or_running_are_ok[state0] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_pending_or_running_are_ok[state1] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_pending_or_running_are_ok[state2] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_pending_or_running_are_ok[state3] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_not_pending_or_running_raise_endrun[state0] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_not_pending_or_running_raise_endrun[state1] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_not_pending_or_running_raise_endrun[state2] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_not_pending_or_running_raise_endrun[state3] tests/engine/test_flow_runner.py::TestCheckFlowPendingOrRunning::test_not_pending_or_running_raise_endrun[state4] tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_non_scheduled_states[state0] tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_non_scheduled_states[state1] tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_non_scheduled_states[state2] tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_non_scheduled_states[state3] tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_scheduled_states_without_start_time tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_scheduled_states_with_future_start_time tests/engine/test_flow_runner.py::TestCheckScheduledStep::test_scheduled_states_with_past_start_time tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_pending_becomes_running[state0] tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_pending_becomes_running[state1] tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_running_stays_running tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_other_states_raise_endrun[state0] tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_other_states_raise_endrun[state1] tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_other_states_raise_endrun[state2] tests/engine/test_flow_runner.py::TestSetFlowToRunning::test_other_states_raise_endrun[state3] tests/engine/test_flow_runner.py::TestRunFlowStep::test_running_state_finishes tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state0] tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state1] tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state2] tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state3] tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state4] tests/engine/test_flow_runner.py::TestRunFlowStep::test_other_states_raise_endrun[state5] tests/engine/test_flow_runner.py::TestRunFlowStep::test_determine_final_state_has_final_say tests/engine/test_flow_runner.py::TestRunFlowStep::test_determine_final_state_preserves_running_states_when_tasks_still_running tests/engine/test_flow_runner.py::TestOutputCaching::test_providing_cachedstate_with_simple_example[local] tests/engine/test_flow_runner.py::TestOutputCaching::test_providing_cachedstate_with_simple_example[sync] tests/engine/test_flow_runner.py::TestOutputCaching::test_providing_cachedstate_with_simple_example[mproc] tests/engine/test_flow_runner.py::TestOutputCaching::test_providing_cachedstate_with_simple_example[mthread] tests/engine/test_flow_runner.py::TestCachingFromContext::test_caches_do_not_persist_across_flow_runner_runs tests/engine/test_flow_runner.py::TestInitializeRun::test_initialize_sets_none_to_pending tests/engine/test_flow_runner.py::TestInitializeRun::test_initialize_returns_state_if_provided[state0] tests/engine/test_flow_runner.py::TestInitializeRun::test_initialize_returns_state_if_provided[state1] tests/engine/test_flow_runner.py::TestInitializeRun::test_initialize_sets_task_contexts tests/engine/test_flow_runner.py::TestInitializeRun::test_initialize_puts_parameters_in_context tests/engine/test_flow_runner.py::TestInitializeRun::test_parameter_precedance tests/engine/test_flow_runner.py::TestRunCount::test_run_count_updates_after_each_retry tests/engine/test_flow_runner.py::TestRunCount::test_run_count_tracked_via_retry_states tests/engine/test_flow_runner.py::test_flow_runner_uses_default_executor_on_flow_if_present tests/engine/test_flow_runner.py::test_flow_runner_uses_user_provided_executor tests/engine/test_flow_runner.py::test_flow_runner_properly_provides_context_to_task_runners[local] tests/engine/test_flow_runner.py::test_flow_runner_properly_provides_context_to_task_runners[mproc] tests/engine/test_flow_runner.py::test_flow_runner_properly_provides_context_to_task_runners[mthread] tests/engine/test_flow_runner.py::test_flow_runner_properly_provides_context_to_task_runners[sync] tests/engine/test_flow_runner.py::test_flow_runner_handles_timeouts[local] tests/engine/test_flow_runner.py::test_flow_runner_handles_timeouts[mthread] tests/engine/test_flow_runner.py::test_flow_runner_handles_timeouts[sync] tests/engine/test_flow_runner.py::test_flow_runner_handles_timeout_error_with_mproc tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_flow_handlers_are_called tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_flow_handlers_are_called_even_when_initialize_run_fails tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_flow_handlers_can_return_none tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_flow_on_failure_is_not_called tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_task_on_failure_is_called tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_multiple_flow_handlers_are_called tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_multiple_flow_handlers_are_called_in_sequence tests/engine/test_flow_runner.py::TestFlowStateHandlers::test_task_handler_that_doesnt_return_state_or_none tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_task_runner_handlers_are_called tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_multiple_task_runner_handlers_are_called tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_multiple_task_runner_handlers_are_called_in_sequence tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_task_runner_handler_that_doesnt_return_state_or_none tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_task_handler_that_raises_signal_is_trapped tests/engine/test_flow_runner.py::TestFlowRunnerStateHandlers::test_task_handler_that_has_error_is_trapped tests/engine/test_flow_runner.py::test_improper_use_of_unmapped_fails_gracefully tests/engine/test_flow_runner.py::test_all_pipeline_method_steps_are_called tests/engine/test_flow_runner.py::test_endrun_raised_in_initialize_is_caught_correctly tests/engine/test_flow_runner.py::test_task_runner_cls_uses_default_function_if_none tests/engine/test_flow_runner.py::test_flow_run_uses_default_flow_runner tests/engine/test_flow_runner.py::test_parameters_can_be_set_in_context_if_none_passed tests/engine/test_flow_runner.py::test_parameters_overwrite_context tests/engine/test_flow_runner.py::test_parameters_overwrite_context_only_if_key_matches tests/engine/test_flow_runner.py::TestMapping::test_terminal_mapped_states_are_used_for_flow_state[local] tests/engine/test_flow_runner.py::TestMapping::test_terminal_mapped_states_are_used_for_flow_state[mthread] tests/engine/test_flow_runner.py::TestMapping::test_terminal_mapped_states_are_used_for_flow_state[mproc] tests/engine/test_flow_runner.py::TestMapping::test_terminal_mapped_states_are_used_for_flow_state[sync] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_existing_map_states_if_available[local] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_existing_map_states_if_available[mthread] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_existing_map_states_if_available[mproc] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_existing_map_states_if_available[sync] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_partial_existing_map_states_if_available[local] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_partial_existing_map_states_if_available[mthread] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_partial_existing_map_states_if_available[mproc] tests/engine/test_flow_runner.py::TestMapping::test_mapped_will_use_partial_existing_map_states_if_available[sync] tests/engine/test_flow_runner.py::TestMapping::test_mapped_tasks_dont_run_if_upstream_pending[local] tests/engine/test_flow_runner.py::TestMapping::test_mapped_tasks_dont_run_if_upstream_pending[mthread] tests/engine/test_flow_runner.py::TestMapping::test_mapped_tasks_dont_run_if_upstream_pending[mproc] tests/engine/test_flow_runner.py::TestMapping::test_mapped_tasks_dont_run_if_upstream_pending[sync] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled[local] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled[mthread] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled[mproc] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled[sync] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled_for_future[local] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled_for_future[mthread] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled_for_future[mproc] tests/engine/test_flow_runner.py::TestMapping::test_mapped_task_can_be_scheduled_for_future[sync] tests/engine/test_flow_runner.py::test_task_contexts_are_provided_to_tasks tests/engine/test_flow_runner.py::test_paused_tasks_stay_paused_when_run tests/engine/test_flow_runner.py::TestContext::test_flow_runner_passes_along_its_run_context_to_tasks tests/engine/test_flow_runner.py::TestContext::test_flow_runner_provides_scheduled_start_time tests/engine/test_flow_runner.py::TestContext::test_flow_runner_doesnt_override_scheduled_start_time_when_running_on_schedule[True] tests/engine/test_flow_runner.py::TestContext::test_flow_runner_doesnt_override_scheduled_start_time_when_running_on_schedule[False] tests/engine/test_flow_runner.py::TestContext::test_context_contains_nodash_date_formats[today_nodash] tests/engine/test_flow_runner.py::TestContext::test_context_contains_nodash_date_formats[tomorrow_nodash] tests/engine/test_flow_runner.py::TestContext::test_context_contains_nodash_date_formats[yesterday_nodash] tests/engine/test_flow_runner.py::TestContext::test_context_contains_date_formats[today] tests/engine/test_flow_runner.py::TestContext::test_context_contains_date_formats[tomorrow] tests/engine/test_flow_runner.py::TestContext::test_context_contains_date_formats[yesterday] tests/engine/test_flow_runner.py::TestContext::test_context_includes_date tests/engine/test_flow_runner.py::TestContext::test_user_provided_context_is_prioritized[outer_context0-inner_context0-inner] tests/engine/test_flow_runner.py::test_task_logs_survive_if_timeout_is_used[local] tests/engine/test_flow_runner.py::test_task_logs_survive_if_timeout_is_used[sync] tests/engine/test_flow_runner.py::test_task_logs_survive_if_timeout_is_used[mproc] tests/engine/test_flow_runner.py::test_task_logs_survive_if_timeout_is_used[mthread] tests/engine/test_flow_runner.py::test_constant_tasks_arent_submitted tests/engine/test_flow_runner.py::test_constant_tasks_arent_submitted_when_mapped tests/engine/test_flow_runner.py::test_dask_executor_with_flow_runner_sets_task_keys