mirror of
https://github.com/docker/compose.git
synced 2025-07-21 12:44:54 +02:00
commit
bc1f6c97d8
@ -1,7 +1,6 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
from requests.exceptions import ConnectionError, SSLError
|
from requests.exceptions import ConnectionError, SSLError
|
||||||
import errno
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
@ -75,8 +74,6 @@ class Command(DocoptCommand):
|
|||||||
with open(config_path, 'r') as fh:
|
with open(config_path, 'r') as fh:
|
||||||
return yaml.safe_load(fh)
|
return yaml.safe_load(fh)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
if e.errno == errno.ENOENT:
|
|
||||||
raise errors.ComposeFileNotFound(os.path.basename(e.filename))
|
|
||||||
raise errors.UserError(six.text_type(e))
|
raise errors.UserError(six.text_type(e))
|
||||||
|
|
||||||
def get_project(self, config_path, project_name=None, verbose=False):
|
def get_project(self, config_path, project_name=None, verbose=False):
|
||||||
@ -110,13 +107,34 @@ class Command(DocoptCommand):
|
|||||||
if file_path:
|
if file_path:
|
||||||
return os.path.join(self.base_dir, file_path)
|
return os.path.join(self.base_dir, file_path)
|
||||||
|
|
||||||
if os.path.exists(os.path.join(self.base_dir, 'docker-compose.yaml')):
|
supported_filenames = [
|
||||||
log.warning("Compose just read the file 'docker-compose.yaml' on startup, rather "
|
'docker-compose.yml',
|
||||||
"than 'docker-compose.yml'")
|
'docker-compose.yaml',
|
||||||
|
'fig.yml',
|
||||||
|
'fig.yaml',
|
||||||
|
]
|
||||||
|
|
||||||
|
def expand(filename):
|
||||||
|
return os.path.join(self.base_dir, filename)
|
||||||
|
|
||||||
|
candidates = [filename for filename in supported_filenames if os.path.exists(expand(filename))]
|
||||||
|
|
||||||
|
if len(candidates) == 0:
|
||||||
|
raise errors.ComposeFileNotFound(supported_filenames)
|
||||||
|
|
||||||
|
winner = candidates[0]
|
||||||
|
|
||||||
|
if len(candidates) > 1:
|
||||||
|
log.warning("Found multiple config files with supported names: %s", ", ".join(candidates))
|
||||||
|
log.warning("Using %s\n", winner)
|
||||||
|
|
||||||
|
if winner == 'docker-compose.yaml':
|
||||||
log.warning("Please be aware that .yml is the expected extension "
|
log.warning("Please be aware that .yml is the expected extension "
|
||||||
"in most cases, and using .yaml can cause compatibility "
|
"in most cases, and using .yaml can cause compatibility "
|
||||||
"issues in future")
|
"issues in future.\n")
|
||||||
|
|
||||||
return os.path.join(self.base_dir, 'docker-compose.yaml')
|
if winner.startswith("fig."):
|
||||||
|
log.warning("%s is deprecated and will not be supported in future. "
|
||||||
|
"Please rename your config file to docker-compose.yml\n" % winner)
|
||||||
|
|
||||||
return os.path.join(self.base_dir, 'docker-compose.yml')
|
return expand(winner)
|
||||||
|
@ -56,7 +56,9 @@ class ConnectionErrorGeneric(UserError):
|
|||||||
|
|
||||||
|
|
||||||
class ComposeFileNotFound(UserError):
|
class ComposeFileNotFound(UserError):
|
||||||
def __init__(self, filename):
|
def __init__(self, supported_filenames):
|
||||||
super(ComposeFileNotFound, self).__init__("""
|
super(ComposeFileNotFound, self).__init__("""
|
||||||
Can't find %s. Are you in the right directory?
|
Can't find a suitable configuration file. Are you in the right directory?
|
||||||
""" % filename)
|
|
||||||
|
Supported filenames: %s
|
||||||
|
""" % ", ".join(supported_filenames))
|
||||||
|
6
tests/fixtures/UpperCaseDir/docker-compose.yml
vendored
Normal file
6
tests/fixtures/UpperCaseDir/docker-compose.yml
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
simple:
|
||||||
|
image: busybox:latest
|
||||||
|
command: /bin/sleep 300
|
||||||
|
another:
|
||||||
|
image: busybox:latest
|
||||||
|
command: /bin/sleep 300
|
@ -2,12 +2,15 @@ from __future__ import unicode_literals
|
|||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import tempfile
|
||||||
|
import shutil
|
||||||
from .. import unittest
|
from .. import unittest
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
|
|
||||||
from compose.cli import main
|
from compose.cli import main
|
||||||
from compose.cli.main import TopLevelCommand
|
from compose.cli.main import TopLevelCommand
|
||||||
|
from compose.cli.errors import ComposeFileNotFound
|
||||||
from six import StringIO
|
from six import StringIO
|
||||||
|
|
||||||
|
|
||||||
@ -31,9 +34,9 @@ class CLITestCase(unittest.TestCase):
|
|||||||
|
|
||||||
def test_project_name_with_explicit_uppercase_base_dir(self):
|
def test_project_name_with_explicit_uppercase_base_dir(self):
|
||||||
command = TopLevelCommand()
|
command = TopLevelCommand()
|
||||||
command.base_dir = 'tests/fixtures/Simple-figfile'
|
command.base_dir = 'tests/fixtures/UpperCaseDir'
|
||||||
project_name = command.get_project_name(command.get_config_path())
|
project_name = command.get_project_name(command.get_config_path())
|
||||||
self.assertEquals('simplefigfile', project_name)
|
self.assertEquals('uppercasedir', project_name)
|
||||||
|
|
||||||
def test_project_name_with_explicit_project_name(self):
|
def test_project_name_with_explicit_project_name(self):
|
||||||
command = TopLevelCommand()
|
command = TopLevelCommand()
|
||||||
@ -57,12 +60,30 @@ class CLITestCase(unittest.TestCase):
|
|||||||
project_name = command.get_project_name(None)
|
project_name = command.get_project_name(None)
|
||||||
self.assertEquals(project_name, name)
|
self.assertEquals(project_name, name)
|
||||||
|
|
||||||
def test_yaml_filename_check(self):
|
def test_filename_check(self):
|
||||||
command = TopLevelCommand()
|
self.assertEqual('docker-compose.yml', get_config_filename_for_files([
|
||||||
command.base_dir = 'tests/fixtures/longer-filename-composefile'
|
'docker-compose.yml',
|
||||||
with mock.patch('compose.cli.command.log', autospec=True) as mock_log:
|
'docker-compose.yaml',
|
||||||
self.assertTrue(command.get_config_path())
|
'fig.yml',
|
||||||
self.assertEqual(mock_log.warning.call_count, 2)
|
'fig.yaml',
|
||||||
|
]))
|
||||||
|
|
||||||
|
self.assertEqual('docker-compose.yaml', get_config_filename_for_files([
|
||||||
|
'docker-compose.yaml',
|
||||||
|
'fig.yml',
|
||||||
|
'fig.yaml',
|
||||||
|
]))
|
||||||
|
|
||||||
|
self.assertEqual('fig.yml', get_config_filename_for_files([
|
||||||
|
'fig.yml',
|
||||||
|
'fig.yaml',
|
||||||
|
]))
|
||||||
|
|
||||||
|
self.assertEqual('fig.yaml', get_config_filename_for_files([
|
||||||
|
'fig.yaml',
|
||||||
|
]))
|
||||||
|
|
||||||
|
self.assertRaises(ComposeFileNotFound, lambda: get_config_filename_for_files([]))
|
||||||
|
|
||||||
def test_get_project(self):
|
def test_get_project(self):
|
||||||
command = TopLevelCommand()
|
command = TopLevelCommand()
|
||||||
@ -81,3 +102,21 @@ class CLITestCase(unittest.TestCase):
|
|||||||
main.setup_logging()
|
main.setup_logging()
|
||||||
self.assertEqual(logging.getLogger().level, logging.DEBUG)
|
self.assertEqual(logging.getLogger().level, logging.DEBUG)
|
||||||
self.assertEqual(logging.getLogger('requests').propagate, False)
|
self.assertEqual(logging.getLogger('requests').propagate, False)
|
||||||
|
|
||||||
|
|
||||||
|
def get_config_filename_for_files(filenames):
|
||||||
|
project_dir = tempfile.mkdtemp()
|
||||||
|
try:
|
||||||
|
make_files(project_dir, filenames)
|
||||||
|
command = TopLevelCommand()
|
||||||
|
command.base_dir = project_dir
|
||||||
|
return os.path.basename(command.get_config_path())
|
||||||
|
finally:
|
||||||
|
shutil.rmtree(project_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def make_files(dirname, filenames):
|
||||||
|
for fname in filenames:
|
||||||
|
with open(os.path.join(dirname, fname), 'w') as f:
|
||||||
|
f.write('')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user