mirror of
				https://github.com/docker/compose.git
				synced 2025-11-04 05:34:09 +01:00 
			
		
		
		
	Closes: #6890 Some remarks, - `# coding ... utf-8` statements are not needed - isdigit on strings instead of a try-catch. - Default opening mode is read, so we can do `open()` without the `'r'` everywhere - Removed inheritinng from `object` class, it isn't necessary in python3. - `super(ClassName, self)` can now be replaced with `super()` - Use of itertools and `chain` on a couple places dealing with sets. - Used the operator module instead of lambdas when warranted `itemgetter(0)` instead of `lambda x: x[0]` `attrgetter('name')` instead of `lambda x: x.name` - `sorted` returns a list, so no need to use `list(sorted(...))` - Removed `dict()` using dictionary comprehensions whenever possible - Attempted to remove python3.2 support Signed-off-by: alexrecuenco <alejandrogonzalezrecuenco@gmail.com>
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import contextlib
 | 
						|
import os
 | 
						|
 | 
						|
from compose.config.config import ConfigDetails
 | 
						|
from compose.config.config import ConfigFile
 | 
						|
from compose.config.config import load
 | 
						|
 | 
						|
BUSYBOX_IMAGE_NAME = 'busybox'
 | 
						|
BUSYBOX_DEFAULT_TAG = '1.31.0-uclibc'
 | 
						|
BUSYBOX_IMAGE_WITH_TAG = '{}:{}'.format(BUSYBOX_IMAGE_NAME, BUSYBOX_DEFAULT_TAG)
 | 
						|
 | 
						|
 | 
						|
def build_config(contents, **kwargs):
 | 
						|
    return load(build_config_details(contents, **kwargs))
 | 
						|
 | 
						|
 | 
						|
def build_config_details(contents, working_dir='working_dir', filename='filename.yml'):
 | 
						|
    return ConfigDetails(
 | 
						|
        working_dir,
 | 
						|
        [ConfigFile(filename, contents)],
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def create_custom_host_file(client, filename, content):
 | 
						|
    dirname = os.path.dirname(filename)
 | 
						|
    container = client.create_container(
 | 
						|
        BUSYBOX_IMAGE_WITH_TAG,
 | 
						|
        ['sh', '-c', 'echo -n "{}" > {}'.format(content, filename)],
 | 
						|
        volumes={dirname: {}},
 | 
						|
        host_config=client.create_host_config(
 | 
						|
            binds={dirname: {'bind': dirname, 'ro': False}},
 | 
						|
            network_mode='none',
 | 
						|
        ),
 | 
						|
    )
 | 
						|
    try:
 | 
						|
        client.start(container)
 | 
						|
        exitcode = client.wait(container)['StatusCode']
 | 
						|
 | 
						|
        if exitcode != 0:
 | 
						|
            output = client.logs(container)
 | 
						|
            raise Exception(
 | 
						|
                "Container exited with code {}:\n{}".format(exitcode, output))
 | 
						|
 | 
						|
        container_info = client.inspect_container(container)
 | 
						|
        if 'Node' in container_info:
 | 
						|
            return container_info['Node']['Name']
 | 
						|
    finally:
 | 
						|
        client.remove_container(container, force=True)
 | 
						|
 | 
						|
 | 
						|
def create_host_file(client, filename):
 | 
						|
    with open(filename) as fh:
 | 
						|
        content = fh.read()
 | 
						|
 | 
						|
    return create_custom_host_file(client, filename, content)
 | 
						|
 | 
						|
 | 
						|
@contextlib.contextmanager
 | 
						|
def cd(path):
 | 
						|
    """
 | 
						|
    A context manager which changes the working directory to the given
 | 
						|
    path, and then changes it back to its previous value on exit.
 | 
						|
    """
 | 
						|
    prev_cwd = os.getcwd()
 | 
						|
    os.chdir(path)
 | 
						|
    try:
 | 
						|
        yield
 | 
						|
    finally:
 | 
						|
        os.chdir(prev_cwd)
 |