diff --git a/ops/model.py b/ops/model.py
index 7d24ec5..3458c77 100644
--- a/ops/model.py
+++ b/ops/model.py
@@ -2093,7 +2093,7 @@ class Container:
 
         def local_list(source_path: Path) -> List[pebble.FileInfo]:
             paths = source_path.iterdir() if source_path.is_dir() else [source_path]
-            files = [self._build_fileinfo(source_path / f) for f in paths]
+            files = [self._build_fileinfo(f) for f in paths]
             return files
 
         errors: List[Tuple[str, Exception]] = []
@@ -2256,7 +2256,7 @@ class Container:
         # /src --> /dst/src
         file_path, source_path, dest_dir = Path(file_path), Path(source_path), Path(dest_dir)
         prefix = str(source_path.parent)
-        if os.path.commonprefix([prefix, str(file_path)]) != prefix:
+        if prefix != '.' and os.path.commonprefix([prefix, str(file_path)]) != prefix:
             raise RuntimeError(
                 f'file "{file_path}" does not have specified prefix "{prefix}"')
         path_suffix = os.path.relpath(str(file_path), prefix)

diff --git a/test/test_model.py b/test/test_model.py
index 7b7344a..97b0c9c 100755
--- a/test/test_model.py
+++ b/test/test_model.py
@@ -1174,6 +1174,64 @@ def test_recursive_push_and_pull(case):
         assert c.exists(fpath), f'pull_path failed: file {fpath} missing at destination'
 
 
+@pytest.mark.parametrize('case', [
+    PushPullCase(
+        name='push directory without trailing slash',
+        path='foo',
+        dst='/baz',
+        files=['foo/bar/baz.txt', 'foo/foobar.txt'],
+        want={'/baz/foo/foobar.txt', '/baz/foo/bar/baz.txt'},
+    ),
+    PushPullCase(
+        name='push directory with trailing slash',
+        path='foo/',
+        dst='/baz',
+        files=['foo/bar/baz.txt', 'foo/foobar.txt'],
+        want={'/baz/foo/foobar.txt', '/baz/foo/bar/baz.txt'},
+    ),
+    PushPullCase(
+        name='push directory relative pathing',
+        path='./foo',
+        dst='/baz',
+        files=['foo/bar/baz.txt', 'foo/foobar.txt'],
+        want={'/baz/foo/foobar.txt', '/baz/foo/bar/baz.txt'},
+    ),
+])
+def test_push_path_relative(case):
+    harness = ops.testing.Harness(ops.CharmBase, meta='''
+        name: test-app
+        containers:
+          foo:
+            resource: foo-image
+        ''')
+    harness.begin()
+    harness.set_can_connect('foo', True)
+    container = harness.model.unit.containers['foo']
+
+    with tempfile.TemporaryDirectory() as tmpdir:
+        cwd = os.getcwd()
+        # change working directory to enable relative pathing for testing
+        os.chdir(tmpdir)
+        try:
+            # create test files under temporary test directory
+            tmp = pathlib.Path(tmpdir)
+            for testfile in case.files:
+                testfile_path = pathlib.Path(tmp / testfile)
+                testfile_path.parent.mkdir(parents=True, exist_ok=True)
+                testfile_path.touch(exist_ok=True)
+                testfile_path.write_text("test", encoding="utf-8")
+
+            # push path under test to container
+            container.push_path(case.path, case.dst)
+
+            # test
+            for want_path in case.want:
+                content = container.pull(want_path).read()
+                assert content == 'test'
+        finally:
+            os.chdir(cwd)
+
+
 class TestApplication(unittest.TestCase):
 
     def setUp(self):

Container.push_path duplicates src_path
```python3
def local_list(source_path: Path) -> List[pebble.FileInfo]:
            paths = source_path.iterdir() if source_path.is_dir() else [source_path]
            files = [self._build_fileinfo(source_path / f) for f in paths]
            return files
```
in ops.model, line 2115, the `self.build_fileinfo(source_path / f)` duplicates the source path.

For instance:

```
source_path = Path("templates/config.yaml")
...
files = [self._build_fileinfo(source_path / f) for f in paths]
```
`source_path / f` would be equivalent to `"templates/config.yaml/templates/config.yaml"` which causes `FileNotFoundError`.

test/test_model.py::test_push_path_relative[case0] test/test_model.py::test_push_path_relative[case1] test/test_model.py::test_push_path_relative[case2]
test/test_model.py::TestModel::test_active_message_default test/test_model.py::TestModel::test_app_immutable test/test_model.py::TestModel::test_app_relation_data_modify_local_as_leader test/test_model.py::TestModel::test_app_relation_data_modify_local_as_minion test/test_model.py::TestModel::test_base_status_instance_raises test/test_model.py::TestModel::test_config test/test_model.py::TestModel::test_config_immutable test/test_model.py::TestModel::test_get_app_relation_data test/test_model.py::TestModel::test_get_relation test/test_model.py::TestModel::test_invalid_type_relation_data test/test_model.py::TestModel::test_is_leader test/test_model.py::TestModel::test_local_set_valid_app_status test/test_model.py::TestModel::test_local_set_valid_unit_status test/test_model.py::TestModel::test_model_attributes test/test_model.py::TestModel::test_model_name_from_backend test/test_model.py::TestModel::test_our_unit_is_our test/test_model.py::TestModel::test_peer_relation_app test/test_model.py::TestModel::test_pod_immutable test/test_model.py::TestModel::test_pod_spec test/test_model.py::TestModel::test_relation_data_access_peer_leader test/test_model.py::TestModel::test_relation_data_access_peer_minion test/test_model.py::TestModel::test_relation_data_del_key test/test_model.py::TestModel::test_relation_data_del_missing_key test/test_model.py::TestModel::test_relation_data_modify_our test/test_model.py::TestModel::test_relation_data_modify_remote test/test_model.py::TestModel::test_relation_data_type_check test/test_model.py::TestModel::test_relation_local_app_data_readability_follower test/test_model.py::TestModel::test_relation_local_app_data_readability_leader test/test_model.py::TestModel::test_relation_no_units test/test_model.py::TestModel::test_relation_set_fail test/test_model.py::TestModel::test_relations_immutable test/test_model.py::TestModel::test_relations_keys test/test_model.py::TestModel::test_remote_app_relation_data test/test_model.py::TestModel::test_remote_app_status test/test_model.py::TestModel::test_remote_unit_status test/test_model.py::TestModel::test_remote_units_is_our test/test_model.py::TestModel::test_resources test/test_model.py::TestModel::test_resources_immutable test/test_model.py::TestModel::test_run_error test/test_model.py::TestModel::test_set_app_status_invalid test/test_model.py::TestModel::test_set_app_status_non_leader_raises test/test_model.py::TestModel::test_set_unit_status_invalid test/test_model.py::TestModel::test_status_eq test/test_model.py::TestModel::test_status_repr test/test_model.py::TestModel::test_storage test/test_model.py::TestModel::test_storages_immutable test/test_model.py::TestModel::test_unit_immutable test/test_model.py::TestModel::test_unit_relation_data test/test_model.py::TestModel::test_workload_version test/test_model.py::TestModel::test_workload_version_invalid test/test_model.py::test_recursive_list[case0] test/test_model.py::test_recursive_list[case1] test/test_model.py::test_recursive_list[case2] test/test_model.py::test_recursive_push_and_pull[case0] test/test_model.py::test_recursive_push_and_pull[case1] test/test_model.py::test_recursive_push_and_pull[case2] test/test_model.py::test_recursive_push_and_pull[case3] test/test_model.py::test_recursive_push_and_pull[case4] test/test_model.py::test_recursive_push_and_pull[case5] test/test_model.py::test_recursive_push_and_pull[case6] test/test_model.py::test_recursive_push_and_pull[case7] test/test_model.py::test_recursive_push_and_pull[case8] test/test_model.py::TestApplication::test_mocked_get_services test/test_model.py::TestApplication::test_planned_units test/test_model.py::TestApplication::test_planned_units_garbage_values test/test_model.py::TestApplication::test_planned_units_override test/test_model.py::TestApplication::test_planned_units_user_set test/test_model.py::TestContainers::test_unit_containers test/test_model.py::TestContainers::test_unit_get_container test/test_model.py::TestContainerPebble::test_add_layer test/test_model.py::TestContainerPebble::test_autostart test/test_model.py::TestContainerPebble::test_can_connect test/test_model.py::TestContainerPebble::test_can_connect_api_error test/test_model.py::TestContainerPebble::test_can_connect_connection_error test/test_model.py::TestContainerPebble::test_can_connect_file_not_found_error test/test_model.py::TestContainerPebble::test_can_connect_simple test/test_model.py::TestContainerPebble::test_exec test/test_model.py::TestContainerPebble::test_get_check test/test_model.py::TestContainerPebble::test_get_checks test/test_model.py::TestContainerPebble::test_get_plan test/test_model.py::TestContainerPebble::test_get_service test/test_model.py::TestContainerPebble::test_get_services test/test_model.py::TestContainerPebble::test_list_files test/test_model.py::TestContainerPebble::test_make_dir test/test_model.py::TestContainerPebble::test_pull test/test_model.py::TestContainerPebble::test_push test/test_model.py::TestContainerPebble::test_remove_path test/test_model.py::TestContainerPebble::test_replan test/test_model.py::TestContainerPebble::test_restart test/test_model.py::TestContainerPebble::test_restart_fallback test/test_model.py::TestContainerPebble::test_restart_fallback_non_400_error test/test_model.py::TestContainerPebble::test_restart_no_arguments test/test_model.py::TestContainerPebble::test_send_signal test/test_model.py::TestContainerPebble::test_socket_path test/test_model.py::TestContainerPebble::test_start test/test_model.py::TestContainerPebble::test_start_no_arguments test/test_model.py::TestContainerPebble::test_stop test/test_model.py::TestContainerPebble::test_stop_no_arguments test/test_model.py::TestContainerPebble::test_type_errors test/test_model.py::TestModelBindings::test_binding_by_relation test/test_model.py::TestModelBindings::test_binding_by_relation_name test/test_model.py::TestModelBindings::test_binding_no_iface_name test/test_model.py::TestModelBindings::test_dead_relations test/test_model.py::TestModelBindings::test_empty_bind_addresses test/test_model.py::TestModelBindings::test_empty_interface_info test/test_model.py::TestModelBindings::test_invalid_keys test/test_model.py::TestModelBindings::test_missing_bind_addresses test/test_model.py::TestModelBindings::test_missing_egress_subnets test/test_model.py::TestModelBindings::test_missing_ingress_addresses test/test_model.py::TestModelBindings::test_no_bind_addresses test/test_model.py::TestModelBindings::test_unresolved_ingress_addresses test/test_model.py::TestModelBackend::test_action_fail test/test_model.py::TestModelBackend::test_action_get test/test_model.py::TestModelBackend::test_action_get_error test/test_model.py::TestModelBackend::test_action_log test/test_model.py::TestModelBackend::test_action_log_error test/test_model.py::TestModelBackend::test_action_set test/test_model.py::TestModelBackend::test_action_set_dotted_dict test/test_model.py::TestModelBackend::test_action_set_duplicated_keys test/test_model.py::TestModelBackend::test_action_set_error test/test_model.py::TestModelBackend::test_action_set_key_validation test/test_model.py::TestModelBackend::test_action_set_more_nested test/test_model.py::TestModelBackend::test_action_set_nested test/test_model.py::TestModelBackend::test_application_version_set test/test_model.py::TestModelBackend::test_application_version_set_invalid test/test_model.py::TestModelBackend::test_invalid_metric_label_values test/test_model.py::TestModelBackend::test_invalid_metric_labels test/test_model.py::TestModelBackend::test_invalid_metric_names test/test_model.py::TestModelBackend::test_invalid_metric_values test/test_model.py::TestModelBackend::test_is_leader_refresh test/test_model.py::TestModelBackend::test_juju_log test/test_model.py::TestModelBackend::test_local_get_status test/test_model.py::TestModelBackend::test_local_set_invalid_status test/test_model.py::TestModelBackend::test_network_get test/test_model.py::TestModelBackend::test_network_get_errors test/test_model.py::TestModelBackend::test_planned_units test/test_model.py::TestModelBackend::test_relation_get_juju_version_quirks test/test_model.py::TestModelBackend::test_relation_get_set_is_app_arg test/test_model.py::TestModelBackend::test_relation_remote_app_name_env test/test_model.py::TestModelBackend::test_relation_remote_app_name_script_errors test/test_model.py::TestModelBackend::test_relation_remote_app_name_script_success test/test_model.py::TestModelBackend::test_relation_set_juju_version_quirks test/test_model.py::TestModelBackend::test_relation_tool_errors test/test_model.py::TestModelBackend::test_status_get test/test_model.py::TestModelBackend::test_status_is_app_forced_kwargs test/test_model.py::TestModelBackend::test_status_set_is_app_not_bool_raises test/test_model.py::TestModelBackend::test_storage_tool_errors test/test_model.py::TestModelBackend::test_valid_metrics test/test_model.py::TestLazyMapping::test_invalidate test/test_model.py::TestSecrets::test_add_secret_errors test/test_model.py::TestSecrets::test_app_add_secret_args test/test_model.py::TestSecrets::test_app_add_secret_simple test/test_model.py::TestSecrets::test_get_secret_id test/test_model.py::TestSecrets::test_get_secret_id_and_label test/test_model.py::TestSecrets::test_get_secret_label test/test_model.py::TestSecrets::test_get_secret_no_args test/test_model.py::TestSecrets::test_get_secret_not_found test/test_model.py::TestSecrets::test_get_secret_other_error test/test_model.py::TestSecrets::test_unit_add_secret_args test/test_model.py::TestSecrets::test_unit_add_secret_errors test/test_model.py::TestSecrets::test_unit_add_secret_simple test/test_model.py::TestSecretInfo::test_from_dict test/test_model.py::TestSecretInfo::test_init test/test_model.py::TestSecretClass::test_get_content_cached test/test_model.py::TestSecretClass::test_get_content_refresh test/test_model.py::TestSecretClass::test_get_content_uncached test/test_model.py::TestSecretClass::test_get_info test/test_model.py::TestSecretClass::test_grant test/test_model.py::TestSecretClass::test_id_and_label test/test_model.py::TestSecretClass::test_peek_content test/test_model.py::TestSecretClass::test_remove_all_revisions test/test_model.py::TestSecretClass::test_remove_revision test/test_model.py::TestSecretClass::test_revoke test/test_model.py::TestSecretClass::test_set_content test/test_model.py::TestSecretClass::test_set_info test/test_model.py::TestPorts::test_close_port test/test_model.py::TestPorts::test_close_port_error test/test_model.py::TestPorts::test_open_port test/test_model.py::TestPorts::test_open_port_error test/test_model.py::TestPorts::test_opened_ports test/test_model.py::TestPorts::test_opened_ports_warnings