diff --git a/compose/service.py b/compose/service.py
index 4ff56eea7..932ed8b34 100644
--- a/compose/service.py
+++ b/compose/service.py
@@ -1355,7 +1355,7 @@ class ServiceNetworkMode(object):
 
 
 def build_container_name(project, service, number, one_off=False):
-    bits = [project, service]
+    bits = [project.lstrip('-_'), service]
     if one_off:
         bits.append('run')
     return '_'.join(bits + [str(number)])
diff --git a/compose/volume.py b/compose/volume.py
index 7618417ff..60c1e0fe8 100644
--- a/compose/volume.py
+++ b/compose/volume.py
@@ -60,7 +60,7 @@ class Volume(object):
     def full_name(self):
         if self.custom_name:
             return self.name
-        return '{0}_{1}'.format(self.project, self.name)
+        return '{0}_{1}'.format(self.project.lstrip('-_'), self.name)
 
     @property
     def legacy_full_name(self):
diff --git a/tests/integration/project_test.py b/tests/integration/project_test.py
index 3960d12e5..8813e84ce 100644
--- a/tests/integration/project_test.py
+++ b/tests/integration/project_test.py
@@ -1915,3 +1915,65 @@ class ProjectTest(DockerClientTestCase):
         assert len(remote_secopts) == 1
         assert remote_secopts[0].startswith('seccomp=')
         assert json.loads(remote_secopts[0].lstrip('seccomp=')) == seccomp_data
+
+    @no_cluster('inspect volume by name defect on Swarm Classic')
+    def test_project_up_name_starts_with_illegal_char(self):
+        config_dict = {
+            'version': '2.3',
+            'services': {
+                'svc1': {
+                    'image': 'busybox:latest',
+                    'command': 'ls',
+                    'volumes': ['foo:/foo:rw'],
+                    'networks': ['bar'],
+                },
+            },
+            'volumes': {
+                'foo': {},
+            },
+            'networks': {
+                'bar': {},
+            }
+        }
+        config_data = load_config(config_dict)
+        project = Project.from_config(
+            name='_underscoretest', config_data=config_data, client=self.client
+        )
+        project.up()
+        self.addCleanup(project.down, None, True)
+
+        containers = project.containers(stopped=True)
+        assert len(containers) == 1
+        assert containers[0].name == 'underscoretest_svc1_1'
+        assert containers[0].project == '_underscoretest'
+
+        full_vol_name = 'underscoretest_foo'
+        vol_data = self.get_volume_data(full_vol_name)
+        assert vol_data
+        assert vol_data['Labels'][LABEL_PROJECT] == '_underscoretest'
+
+        full_net_name = '_underscoretest_bar'
+        net_data = self.client.inspect_network(full_net_name)
+        assert net_data
+        assert net_data['Labels'][LABEL_PROJECT] == '_underscoretest'
+
+        project2 = Project.from_config(
+            name='-dashtest', config_data=config_data, client=self.client
+        )
+        project2.up()
+        self.addCleanup(project2.down, None, True)
+
+        containers = project2.containers(stopped=True)
+        assert len(containers) == 1
+        assert containers[0].name == 'dashtest_svc1_1'
+        assert containers[0].project == '-dashtest'
+
+        full_vol_name = 'dashtest_foo'
+        vol_data = self.get_volume_data(full_vol_name)
+        assert vol_data
+        assert vol_data['Labels'][LABEL_PROJECT] == '-dashtest'
+
+        full_net_name = '-dashtest_bar'
+        net_data = self.client.inspect_network(full_net_name)
+        assert net_data
+        assert net_data['Labels'][LABEL_PROJECT] == '-dashtest'