1- import os
21from docker .models .containers import Container
2+ import os
3+ from typing import Iterable , Optional , Tuple
34
45from .waiting_utils import wait_container_is_ready
56from .docker_client import DockerClient
910logger = setup_logger (__name__ )
1011
1112
12- class DockerContainer ( object ) :
13+ class DockerContainer :
1314 """
1415 Basic container object to spin up Docker instances.
1516
@@ -21,7 +22,7 @@ class DockerContainer(object):
2122 >>> with DockerContainer("hello-world") as container:
2223 ... delay = wait_for_logs(container, "Hello from Docker!")
2324 """
24- def __init__ (self , image , docker_client_kw : dict = None , ** kwargs ):
25+ def __init__ (self , image : str , docker_client_kw : Optional [ dict ] = None , ** kwargs ) -> None :
2526 self .env = {}
2627 self .ports = {}
2728 self .volumes = {}
@@ -36,13 +37,12 @@ def with_env(self, key: str, value: str) -> 'DockerContainer':
3637 self .env [key ] = value
3738 return self
3839
39- def with_bind_ports (self , container : int ,
40- host : int = None ) -> 'DockerContainer' :
40+ def with_bind_ports (self , container : int , host : int = None ) -> 'DockerContainer' :
4141 self .ports [container ] = host
4242 return self
4343
44- def with_exposed_ports (self , * ports ) -> 'DockerContainer' :
45- for port in list ( ports ) :
44+ def with_exposed_ports (self , * ports : Iterable [ int ] ) -> 'DockerContainer' :
45+ for port in ports :
4646 self .ports [port ] = None
4747 return self
4848
@@ -55,25 +55,20 @@ def maybe_emulate_amd64(self) -> 'DockerContainer':
5555 return self .with_kwargs (platform = 'linux/amd64' )
5656 return self
5757
58- def start (self ):
58+ def start (self ) -> 'DockerContainer' :
5959 logger .info ("Pulling image %s" , self .image )
6060 docker_client = self .get_docker_client ()
61- self ._container = docker_client .run (self .image ,
62- command = self ._command ,
63- detach = True ,
64- environment = self .env ,
65- ports = self .ports ,
66- name = self ._name ,
67- volumes = self .volumes ,
68- ** self ._kwargs
69- )
61+ self ._container = docker_client .run (
62+ self .image , command = self ._command , detach = True , environment = self .env , ports = self .ports ,
63+ name = self ._name , volumes = self .volumes , ** self ._kwargs
64+ )
7065 logger .info ("Container started: %s" , self ._container .short_id )
7166 return self
7267
73- def stop (self , force = True , delete_volume = True ):
68+ def stop (self , force = True , delete_volume = True ) -> None :
7469 self .get_wrapped_container ().remove (force = force , v = delete_volume )
7570
76- def __enter__ (self ):
71+ def __enter__ (self ) -> 'DockerContainer' :
7772 return self .start ()
7873
7974 def __exit__ (self , exc_type , exc_val , exc_tb ):
@@ -110,7 +105,7 @@ def get_container_host_ip(self) -> str:
110105 return host
111106
112107 @wait_container_is_ready ()
113- def get_exposed_port (self , port ) -> str :
108+ def get_exposed_port (self , port : int ) -> str :
114109 mapped_port = self .get_docker_client ().port (self ._container .id , port )
115110 if inside_container ():
116111 gateway_ip = self .get_docker_client ().gateway_ip (self ._container .id )
@@ -128,9 +123,7 @@ def with_name(self, name: str) -> 'DockerContainer':
128123 self ._name = name
129124 return self
130125
131- def with_volume_mapping (self , host : str , container : str ,
132- mode : str = 'ro' ) -> 'DockerContainer' :
133- # '/home/user1/': {'bind': '/mnt/vol2', 'mode': 'rw'}
126+ def with_volume_mapping (self , host : str , container : str , mode : str = 'ro' ) -> 'DockerContainer' :
134127 mapping = {'bind' : container , 'mode' : mode }
135128 self .volumes [host ] = mapping
136129 return self
@@ -141,12 +134,12 @@ def get_wrapped_container(self) -> Container:
141134 def get_docker_client (self ) -> DockerClient :
142135 return self ._docker
143136
144- def get_logs (self ):
137+ def get_logs (self ) -> Tuple [ str , str ] :
145138 if not self ._container :
146- raise ContainerStartException ("Container should be started before" )
139+ raise ContainerStartException ("Container should be started before getting logs " )
147140 return self ._container .logs (stderr = False ), self ._container .logs (stdout = False )
148141
149- def exec (self , command ):
142+ def exec (self , command ) -> Tuple [ int , str ] :
150143 if not self ._container :
151- raise ContainerStartException ("Container should be started before" )
144+ raise ContainerStartException ("Container should be started before executing a command " )
152145 return self .get_wrapped_container ().exec_run (command )
0 commit comments