HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/compose/__pycache__/service.cpython-310.pyc
o

S�`��@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddlm
Z
ddlmZddl
mZddl
mZddl
mZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddl m!Z!ddl m"Z"ddl m#Z#ddl m$Z$ddl%m&Z&ddl'm(Z(ddl'm)Z)ddl'm*Z*ddlm+Z+ddlm,Z,ddlm-Z-ddlm.Z.ddlm/Z/dd lm0Z0dd!lm1Z1dd"lm2Z2dd#lm3Z3dd$lm4Z4dd%lm5Z5dd&l6m7Z7dd'l8m9Z9dd(l8m:Z:dd)l8m;Z;dd*l8m<Z<dd+l=m>Z>dd,lm?Z?dd-lm@Z@dd.lAmBZBdd/lAmCZCdd0lAmDZDdd1lAmEZEdd2lAmFZFdd3lAmGZGdd4lHmIZIe�JeK�ZLgd5�ZMd6ZNd7ZOd8ZPGd9d:�d:eQ�ZRGd;d<�d<eQ�ZSGd=d>�d>eQ�ZTe	d?d@�ZUe	dAdB�ZVejWGdCdD�dDejX��ZYejWGdEdF�dFejX��ZZejWGdGdH�dHejX��Z[GdIdJ�dJ�Z\dKdL�Z]GdMdN�dN�Z^GdOdP�dPe^�Z_GdQdR�dRe^�Z`GdSdT�dT�ZaGdUdV�dVea�ZbGdWdX�dXea�ZcGdYdZ�dZ�ZdGd[d\�d\�ZeGd]d^�d^�Zfd�d_d`�Zgdadb�Zhdcdd�Zidedf�Zjdgdh�Zkdidj�Zldkdl�Zmdmdn�Zndodp�Zodqdr�Zpdsdt�Zqdudv�Zrdwdx�Zsdydz�Ztd{d|�Zud}d~�ZvGdd��d��ZwGd�d��d��ZxGd�d��d��ZydS)��N)�
namedtuple)�OrderedDict)�
attrgetter)�APIError)�
ImageNotFound)�NotFound)�	LogConfig)�Mount)�version_gte)�
version_lt)�build_port_bindings)�
split_port)�convert_tmpfs_mounts�)�__version__)�const)�progress_stream)�DOCKER_CONFIG_KEYS)�is_url)�merge_environment)�merge_labels)�DependencyError)�	MountSpec)�ServicePort)�
VolumeSpec)�DEFAULT_TIMEOUT)�IS_WINDOWS_PLATFORM)�LABEL_CONFIG_HASH)�LABEL_CONTAINER_NUMBER)�
LABEL_ONE_OFF)�
LABEL_PROJECT)�
LABEL_SERVICE)�
LABEL_SLUG)�
LABEL_VERSION)�NANOCPUS_SCALE)�WINDOWS_LONGPATH_PREFIX)�	Container)�CompletedUnsuccessfully)�HealthCheckFailed)�NoHealthCheckConfigured)�OperationFailedError��parallel_execute)�
stream_output)�StreamOutputError)�generate_random_id)�	json_hash)�parse_bytes)�parse_seconds_float)�truncate_id)�unique_everseen)�binarystr_to_unicode)-�cap_add�cap_drop�
cgroup_parent�	cpu_count�cpu_percent�
cpu_period�	cpu_quota�
cpu_rt_period�cpu_rt_runtime�
cpu_shares�cpus�cpuset�device_cgroup_rules�devices�device_requests�dns�
dns_search�dns_opt�env_file�extra_hosts�	group_add�init�ipc�	isolation�	read_only�
log_driver�log_opt�	mem_limit�mem_reservation�
memswap_limit�mem_swappiness�oom_kill_disable�
oom_score_adj�pid�
pids_limit�
privileged�restart�runtime�security_opt�shm_size�storage_opt�sysctls�userns_mode�volumes_from�
volume_driver�service_started�service_healthy�service_completed_successfullyc@�eZdZdd�ZdS)�
BuildErrorcCs||_||_dS�N)�service�reason)�selfrirj�rl�1/usr/lib/python3/dist-packages/compose/service.py�__init__ws
zBuildError.__init__N��__name__�
__module__�__qualname__rnrlrlrlrmrgv�rgc@rf)�NeedsBuildErrorcC�
||_dSrh�ri�rkrirlrlrmrn}�
zNeedsBuildError.__init__Nrorlrlrlrmrt|rsrtc@seZdZdS)�NoSuchImageErrorN)rprqrrrlrlrlrmry�sry�ServiceNamezproject service number�ConvergencePlanzaction containersc@s(eZdZdZdZdZdZedd��ZdS)�ConvergenceStrategyzrEnumeration for all possible convergence strategies. Values refer to
    when containers should be recreated.
    r��cCs|t|�juSrh)�type�never�rkrlrlrm�allows_recreate�sz#ConvergenceStrategy.allows_recreateN)	rprqrr�__doc__�changed�alwaysr��propertyr�rlrlrlrmr|�sr|c@�eZdZdZdZdZdZdS)�	ImageTypez5Enumeration for the types of images known to compose.rrr}N)rprqrrr��none�local�allrlrlrlrmr���
r�c@r�)�BuildActionz+Enumeration for the possible build actions.rrr}N)rprqrrr�r��force�skiprlrlrlrmr��r�r�c@s|eZdZ													d�dd�Zdd�Zd�d	d
�Zd�dd�Zd
d�Zdd�Zd�dd�Z					d�dd�Z
ejddfdd�Z
dd�Zdd�Zedd��Zedd��Zejdfdd �Zd!d"�Zd�d#d$�Zd%d&�Zd'd(�Zd�d)d*�Z				d�d,d-�Z	+	d�d.d/�Zd0d1�Zd�d2d3�Zd�d4d5�Zed6d7��Z d�d8d9�Z!d�d:d;�Z"d<d=�Z#ed>d?��Z$d@dA�Z%dBdC�Z&dDdE�Z'dFdG�Z(dHdI�Z)dJdK�Z*d�dLdM�Z+dNdO�Z,d�dPdQ�Z-dRdS�Z.dTdU�Z/dVdW�Z0		d�dXdY�Z1dZd[�Z2d�d\d]�Z3d^d_�Z4		d�d`da�Z5dbdc�Z6ddde�Z7d�dfdg�Z8edhdi��Z9d�djdk�Z:dldm�Z;dndo�Z<dpdq�Z=d�drds�Z>d�dtdu�Z?dvdw�Z@dxdy�ZAdzd{�ZBd|d}�ZCd~d�ZDdS)��ServiceN�defaultFrcKs�||_||_||_||_|pg|_|pg|_|ptd�|_|p"td�|_	|p)t
d�|_|p.i|_|	p3g|_
|
|_|
|_||_|pAg|_dSrh)�name�client�project�use_networking�linksra�IpcMode�ipc_mode�NetworkMode�network_mode�PidMode�pid_mode�networks�secrets�	scale_num�default_platform�options�extra_labels)rkr�r�r�r�r�rar�r�r��scaler�r�r�r�r�rlrlrmrn�s



zService.__init__cCsd�|j�S)Nz
<Service: {}>)�formatr�r�rlrlrm�__repr__�szService.__repr__c
s�|duri}|�d�j|d�|pgi�ttd�fdd��jj||d�D���}|r-|S|�d�j|dd�|p9gi�tt�fdd	�td�fd
d��jj||d�D����S)N�label��one_offc�g|]	}t��j|��qSrl�r&�from_psr���.0�	containerr�rlrm�
<listcomp>����z&Service.containers.<locals>.<listcomp>�r��filtersT�r��legacycs|��j�Srh)�has_legacy_proj_namer���cr�rlrm�<lambda>��z$Service.containers.<locals>.<lambda>cr�rlr�r�r�rlrmr��r�)�update�labels�list�filterr��
containers)rk�stoppedr�r�r��resultrlr�rmr��s,�
� ����zService.containerscCs4|jd�t|�gd�D]}|Std�|j|���)z�Return a :class:`compose.container.Container` for this service. The
        container must be active, and match `number`.
        �{}={})r�zNo container found for {}_{})r�r�r�
ValueErrorr�)rk�numberr�rlrlrm�
get_container�szService.get_containercKs,|jdd�}|D]}|j|fi|��q|S)NT�r�)r��start_container_if_stopped)rkr�r�r�rlrlrm�start�sz
Service.startcCsP|jr|dkrt�d|j|jf�|��r$|dkr&t�d|j�dSdSdS)Nrz�The "%s" service is using the custom container name "%s". Docker requires each container to have a unique name. Remove the custom name to scale the service.z�The "%s" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.)�custom_container_name�log�warningr��specifies_host_port)rk�desired_numrlrlrm�show_scale_warnings�s
�
��zService.show_scale_warningscs2��|��jdd�}t|�}|D]}|��j�sqt�d|j��j||dd�q||kr6t�d�dS||krz�jdd�}|t|�kridd	�|D�}�fd
d	�|D�}|D]}|�	�qXt
t|�t|��}t|t
d�d�}	��|	||dd�||kr�||}
t|t
d�d�}��||
d�|�dSdS)
ar
        Adjusts the number of containers to the specified number and ensures
        they are running.

        - creates containers until there are at least `desired_num`
        - stops containers until there are at most `desired_num` running
        - starts containers until there are at least `desired_num` running
        - removes all stopped containers
        Fr�z(Recreating container with legacy name %s)�start_new_containerz)Desired container number already achievedNTcS�g|]}|js|�qSrl��
is_running�r�r�rlrlrmr�!s
��z!Service.scale.<locals>.<listcomp>csg|]
}��|g�r|�qSrl)�_containers_have_divergedr�r�rlrmr�&s
��r���key)r�r��lenr�r�r��infor��recreate_container�remover��set�sortedr�_execute_convergence_start�
_downscale)rkr��timeout�running_containers�num_runningr��all_containers�stopped_containers�divergent_containers�sorted_containers�num_to_stop�sorted_running_containersrlr�rmr�sF

�
�

���z
Service.scalec
Ks�|��|j||p|j|d�||d�}d|vr"|s"t�d|d�ztj|jfi|��WStyE}zt	d|j
t|j�f��d}~ww)zn
        Create a container for this service. If the image doesn't exist, attempt to pull
        it.
        r�)r��previous_containerr�zCreating %sz*Cannot create container for service %s: %sN)
�ensure_image_exists�_get_container_create_options�_next_container_numberr�r�r&�creater�rr*r�r5�explanation)rkr�r�r��quiet�override_options�container_options�exrlrlrm�create_container<s"����zService.create_containercCs�|��r|tjkr|j|d�dSz|��WdSty!Ynw|��s.|j|d�dS|tjkr7t|��|j|d�t	�
d�|j��dS)N)�cli)�silentz�Image for service {} was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.)
�can_be_builtr�r��build�imagery�pullr�rtr�r�r�r�)rk�do_buildr�r�rlrlrmr�Zs&�
�zService.ensure_image_existscC�0z|j�|j�WStytd�|j���w�NzImage '{}' not found)r��inspect_distribution�
image_namerryr�r�rlrlrm�get_image_registry_datar�
�zService.get_image_registry_datacCr�r�)r��
inspect_imager�rryr�r�rlrlrmr�xr�z
Service.imagecCs |j�ddj||j�d�d��S)Nr�z{project}_{s.name}z_-)�sr�)r��getr�r��lstripr�rlrlrmr�~s�zService.image_namecCs(|j�d�}|st|jjd�r|j}|S)N�platform�1.35)r�rr
r��api_versionr�)rkrrlrlrmr�szService.platformcCs�|jdd�}|r
tdg�S|stdg�S|tjurtd|�S|tjus(|�|�r-td|�Sdd�|D�}|r;td|�Std	|�S)
NTr�r�r�r��recreatecSr�rlr�r�rlrlrmr���z,Service.convergence_plan.<locals>.<listcomp>�noop)r�r{r|r�r�r�)rk�strategyr�r�r�rlrlrm�convergence_plan�s




�


zService.convergence_planc
Cs�d}z|j}Wnty$}zt�d|jt|��WYd}~dSd}~wwd}|D])}|�|j�r<t�d|j�d}q)|j�	t
d�}||krRt�d|j||�d}q)|S)NzService %s has diverged: %sTFz$%s has diverged: Legacy project namez%s has diverged: %s != %s)�config_hashryr��debugr��strr�r�r�rr)rkr�r�e�has_divergedr��container_config_hashrlrlrmr��s4

�����z!Service._containers_have_divergedcsv���}�����fdd����fdd�}t�fdd�t|||�D���fdd�|d	�\}}	|	��D]}
t|
��|S)
NcsL�r|jdddd����}n|j|dd�}�s|���r$�s$��|�|S)NT)r�r�)r�r�rl)r��attach_log_stream�start_container)ri�nr�)�detachedr�r�rkr�rlrm�create_and_start�s
z=Service._execute_convergence_create.<locals>.create_and_startcs(�rd�|j|jdg�S��|j|j�S)N�_�run)�joinr�ri�get_container_namer���service_name)r�rkrlrm�get_name�s�z5Service._execute_convergence_create.<locals>.get_namecsg|]
}t�j�j|��qSrl)rzr�r�)r��indexr�rlrmr��s��z7Service._execute_convergence_create.<locals>.<listcomp>cs��|j�Srh�r�r)rrkrlrmr��r�z5Service._execute_convergence_create.<locals>.<lambda>�Creating)r�r,�range�valuesr*)rkr�rr�r�r��irr��errors�errorrl)rrr�r�rkr�rm�_execute_convergence_create�s	
��	z#Service._execute_convergence_createc
s�|durt|�|kr��||d���|d|�}�����fdd�}t||dd�d�\}}|��D]}	t|	��|durQt|�|krQ|���|t|�����|S)Ncs�j|����d�S)N)r��attach_logsr��renew_anonymous_volumes)r��r��rr'rkr�r�rlrmr�s�z7Service._execute_convergence_recreate.<locals>.recreatecS�|jSrh�r�r�rlrlrmr���z7Service._execute_convergence_recreate.<locals>.<lambda>�
Recreating�r�r�r,r!r*�extendr%)
rkr�r�r�rr�r'rr#r$rlr)rm�_execute_convergence_recreate�s"��z%Service._execute_convergence_recreatec
s�|durt|�|kr��||d�|�|d|�}|r=dd�|D�}t|��fdd�dd�d�\}}|��D]}	t|	��|durUt|�|krU|���|t|��|��|S)NcSr�rlr�r�rlrlrmr�rz6Service._execute_convergence_start.<locals>.<listcomp>cs�j|�dd�S)NT)r&r�)r�r��rrkrlrmr�
�z4Service._execute_convergence_start.<locals>.<lambda>cSr*rhr+r�rlrlrmr�r,�Startingr.)
rkr�r�r�rr�r�rr#r$rlr1rmr�s$��z"Service._execute_convergence_startcs$��fdd�}t||dd�d�dS)Ncs|j����d�|��dS)N�r�)�stop�stop_timeoutr�r(�rkr�rlrm�stop_and_removesz+Service._downscale.<locals>.stop_and_removecSr*rhr+r�rlrlrmr� r,z$Service._downscale.<locals>.<lambda>zStopping and removingr+)rkr�r�r8rlr7rmr�s�zService._downscaleTc
Cs|\}
}|dur
|n|j}t|td�d�}|�|�|
dvr*|j||||
dk|	d�S|s.d}|
dkrN|rD|��d}
|D]}|�|
�q<|�||||||�S|
dkr[|�|||||�S|
d	kr}|t	|�krn|�|||||�S|D]
}t
�d
|j�qp|St
d�|
���)Nr�r�)r�r�r�)r�r�r�Idr�rz%s is up-to-datezInvalid action: {})r�r�rr�r%r��reset_imager0r�r�r�r�r��	Exceptionr�)rk�planr�rr��scale_override�rescale�reset_container_imager'r��actionr�r��img_idr�rlrlrm�execute_convergence_plan$sH
�

�
�
�z Service.execute_convergence_plancCsZ|j|�|�d�|��|j|s|nd|jdd�}|r |��|r'|�|�|��|S)z�Recreate a container.

        The original container is renamed to a temporary name so that data
        volumes can be copied to the new container, before the original
        container is removed.
        r4NT)r�r�r�)r5r6�rename_to_tmp_namer�r�rrr�)rkr�r�r&r�r'�
new_containerrlrlrmr�Ys	
�
zService.recreate_containercCs,|dur|St|j�d��}|dur|StS)N�stop_grace_period)r2r�rrr7rlrlrmr6pszService.stop_timeoutcCs4|js|s
t�d|j�|r|��|�|�SdS)NzStarting %s)r�r�r�r�rr)rkr�r&r�rlrlrmr�xs
�z"Service.start_container_if_stoppedc
Csb|�||�z|��W|Sty0}zt|j�}d|vr#t�d�td�|j	|���d}~ww)Nz/driver failed programming external connectivityz+Host is already in use by another containerzCannot start service {}: {})
�connect_container_to_networksr�rr5r�r��warnr*r�r�)rkr��use_network_aliasesr��explrlrlrmr�s
�

��zService.start_containercCstt|j��dd�dd��S)NcSs|d�d�pdS)Nr�priorityr�r)�trlrlrmr��r2z.Service.prioritized_networks.<locals>.<lambda>T)r��reverse)rr�r��itemsr�rlrlrm�prioritized_networks�s��zService.prioritized_networkscCs�|�d�}|j��D]=\}}||vr t||�rq
|j�|j|�|r(|�||�ng}|jj|j|||�dd�|�dd�|�	d�|�dd�d�q
dS)NzNetworkSettings.Networks�ipv4_address�ipv6_addressF�link_local_ips)�aliasesrPrQr�rR)
rrOrN�short_id_alias_existsr��!disconnect_container_from_network�id�_get_aliases�connect_container_to_network�
_get_links)rkr�rH�connected_networks�network�netdefsrSrlrlrmrF�s 




��z%Service.connect_container_to_networkscCs<|��D]}t�d|j�|j|�|�d�|��qdS)NzRemoving %sr4)�duplicate_containersr�r�r�r5r6r�)rkr�r�rlrlrm�remove_duplicate_containers�s

�z#Service.remove_duplicate_containersccsL�t|jdd�dd�d�}t�}|D]}|j|vr|Vq|�|j�qdS)NTr�cSs
|�d�S)N�CreatedrKr�rlrlrmr��s
z.Service.duplicate_containers.<locals>.<lambda>r�)r�r�r�r��add)rkr��numbersr�rlrlrmr]�s�
�
�zService.duplicate_containerscCst|���Srh)r0�config_dictr�rlrlrmr��zService.config_hashc	sB�fdd�}�j|�����jj�jj�j�jdd��jD�d�S)Ncs$z���dWStyYdSw�Nr9)r�ryrlr�rlrm�image_id�s
�z%Service.config_dict.<locals>.image_idcSs&g|]}t|jt�r|jj|jf�qSrl)�
isinstance�sourcer�r��mode�r��vrlrlrmr��s
��z'Service.config_dict.<locals>.<listcomp>)r�rer��netr�r�r�ra)	r��get_link_namesr�rVr�rhr�r�ra)rkrerlr�rmrb�s��zService.config_dictcCsh|jj}|jj}|jj}|��|��|r|gng|r|gng|r&|gngt|j�di��	��S)N�
depends_on)
r�rr�r��get_linked_service_names�get_volumes_from_namesr�r�r�keys)rk�net_name�
pid_namespace�
ipc_namespacerlrlrm�get_dependency_names�s������zService.get_dependency_namescCs|jj}|jj}|jj}dd�|��D�}|�dd�|��D��|�|r)|dini�|�|r4|dini�|�|r?|dini�|�|j�di��|j�di��	�D]3\}}|dt
krfdd�||<qU|dtkrsd	d�||<qU|dtkr�d
d�||<qUt
d�|d���|S)NcSsi|]}|d�qSrhrl�r�r�rlrlrm�
<dictcomp>���z2Service.get_dependency_configs.<locals>.<dictcomp>css�|]}|dfVqdSrhrlrurlrlrm�	<genexpr>���
�z1Service.get_dependency_configs.<locals>.<genexpr>rm�	conditioncSsdS)NTrl�rrlrlrmr��sz0Service.get_dependency_configs.<locals>.<lambda>cS�|��Srh)�
is_healthyr{rlrlrmr���cSr|rh)�is_completed_successfullyr{rlrlrmr��r~z%depends_on condition "{}" is invalid.)r�rr�r�rnr�ror�rrN�CONDITION_STARTED�CONDITION_HEALTHY� CONDITION_COMPLETED_SUCCESSFULLYr�r�)rkrqrrrs�configs�svc�configrlrlrm�get_dependency_configs�s4�
���zService.get_dependency_configscC�dd�|jD�S)NcSsg|]\}}|j�qSrlr+)r�rirrlrlrmr�rz4Service.get_linked_service_names.<locals>.<listcomp>�r�r�rlrlrmrn�z Service.get_linked_service_namescCr�)NcSsg|]	\}}|j|f�qSrlr+)r�ri�aliasrlrlrmr��z*Service.get_link_names.<locals>.<listcomp>r�r�rlrlrmrlr�zService.get_link_namescCr�)NcSs g|]}t|jt�r|jj�qSrl)rfrgr�r�)r�rrlrlrmr�
s z2Service.get_volumes_from_names.<locals>.<listcomp>�rar�rlrlrmro	r�zService.get_volumes_from_namesc
Csd|rdSt�|jdd|jdd�id�|jdd|jddd�id��}dd�|D�}|s,d	St|�d	S)
NTr�Fr�r�r�cSsg|]
}|jdur|j�qSrhrr�rlrlrmr��z2Service._next_container_number.<locals>.<listcomp>r)�	itertools�chain�_fetch_containersr��max)rkr�r�rarlrlrmr�s���	zService._next_container_numbercs2�fdd��td�fdd��jjdi|��D��S)Ncs*z
t��j|d�WStyYdSwrd)r&�from_idr�rr(r�rlrm�soft_inspects
�z/Service._fetch_containers.<locals>.soft_inspectc�g|]}�|��qSrlrlr�)r�rlrmr�$s��z-Service._fetch_containers.<locals>.<listcomp>rl)r�r�r�)rk�
fetch_optionsrl)rkr�rmr�s�zService._fetch_containerscCs.t|jh|r
|jhnt�Bt|�dd��B�S)NrSrl)r�r��short_idr�r)rkr[r�rlrlrmrW)s���zService._get_aliasescCsp|jsiS|j|jj}|�|�id�}|�d�r"|�d�|dd<|�d�r0|�d�|dd<d|jj|iiS)N)�Aliases�
IPAMConfigrPr��IPv4AddressrQ�IPv6Address�EndpointsConfig)r�r�rVrWr)rkr[�endpointrlrlrm�build_default_networking_config0s�

z'Service.build_default_networking_configcCs�i}|jD]\}}|��D]}|j||p|j<|j||j<|j||j<q
q|r@|��D]}|j||j<|j||j<|j||j<q+|j�d�pGgD]}d|vrQ|}n|�d�\}}|||<qHdd�|��D�S)N�external_links�:cSsg|]\}}||f�qSrlrl)r��container_namer�rlrlrmr�Ws��z&Service._get_links.<locals>.<listcomp>)r�r�r��name_without_projectr�r�splitrN)rk�link_to_selfr�ri�	link_namer��
external_linkrlrlrmrYAs(�
�zService._get_linkscCr�)NcS�g|]}t|��qSrl)�build_volume_from)r��specrlrlrmr�]�z-Service._get_volumes_from.<locals>.<listcomp>r�r�rlrlrm�_get_volumes_from\r�zService._get_volumes_fromcs|o|}|rt�nd}�fdd�tD�}|�dg�}|�|�|�d�s0���j||�|d<|�dd�t�j	j
d�r^d|vr^d	|vr^d
|dvr^|d�d
�}	|	d|d<|	d|d	<t�j	j
d
�rqd�j
vrq��d�|d<d|vszd�j
vr�tt|�dg���j
�|d<d|vs�|r�tt|�dg�|��|d<t���t�j
�d�|�d���|d<t�j
�d�|�d��|d<��|||�\}}�j|d<t|�di��j|d��j||r߈jnd|�|d<tD]}
|�|
d�q�j||d�|d<���}|�r||d<t|d�|d<|S)Ncs"i|]
}|�jvr|�j|�qSrl�r�)r��kr�rlrmrvhs
�z9Service._get_container_create_options.<locals>.<dictcomp>�volumesr��detachTz1.23�hostname�
domainname�.rr}z1.25rEr6�ports�expose�environmentr�r�r��host_config�networking_config) r/r�popr�rrr��
setdefaultrr�r�	partitionr
r�r6�build_container_ports�formatted_portsr�r�r�_parse_proxy_configr�_build_container_volume_optionsr��build_container_labelsr�r�r�HOST_CONFIG_KEYS�_get_container_host_configr��format_environment)rkr�r�r�r��add_config_hash�slugr��override_volumes�partsr�r�rlr�rmr�_s�
�


�
�
��
��

�	
��z%Service._get_container_create_optionsc
Cs|g}g}d|vrdd�|�d�D�}dd�|�d�D�}t||j�d�p%g||�\}}|d�|�dd�|p8iD�|d<t|jjd	�rPd
d�|D�pLd|d<n)|j�d�pWg|d<|D]}|jrj|d�|j	�q\|�|�
��i|d|j	<q\|��}	|	r�t|jjd	�r�|�
dd
�|	D��|d�dd
�|	D��n|�d�p�g|d<|d�
dd�|	D��tt|��|d<||fS)Nr�cS�g|]	}t|t�r|�qSrl)rfrrirlrlrmr��s

��z;Service._build_container_volume_options.<locals>.<listcomp>cSr�rl)rfrrirlrlrmr��r��tmpfsr�cSsi|]}|ji�qSrl)�internalrirlrlrmrv�r�z;Service._build_container_volume_options.<locals>.<dictcomp>z1.30cSr�rl��build_mountrirlrlrmr��r��mountscss�|]}|��VqdSrh)�legacy_reprrirlrlrmrx���z:Service._build_container_volume_options.<locals>.<genexpr>css�|]}|jifVqdSrh��targetrirlrlrmrx�s�

�cSr�rlr�rirlrlrmr��r��binds)r�merge_volume_bindingsr�r�r
r�r�is_tmpfs�appendr�r��get_secret_volumesrr/r�r4)
rkr�r�r��container_volumes�container_mountsr��affinity�m�secret_volumesrlrlrmr��s@��
�z'Service._build_container_volume_optionsc

CsJt|jfi|��}|�dd�}t|�dd��}t|�}d}t|�d�t�r.|�d�}d|d<|�d�r=dd�|�d�D�nd}d}	d|vrNt|�d�t�}	|j	j
dGid	|j|d
��dtt
|�dg����d
|�d
��d|���d|�dd��d|jj�d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��d|�d��dt|�d���d |�d!|�d!��d"|�d"��d#|jj�d|�d$|jj�d%|�d%��d&|�d&��d'|�d'��d(|�d(��d)|�d)��d*|�d*��d+|�d+��d,|�d,��d-|�d-��d.|�d.��d/|�d/��d|�dd��d0|�d1|�d1��d2|�d2��d3|�d3��d4|	�d5|�d5��d6|�d7��d8|�d8��d9|�d9��d:|�d;��d<|�d=��d>|�d>��d?|�d?��d@|�d@��dA|�dA��dB|�dB��dC|�dC��dD|�dD��dE|�dE��dF|�dF���S)HN�logging�blkio_configrKTr\cS�g|]}|j�qSrl)�value)r��orlrlrmr��rwz6Service._get_container_host_config.<locals>.<listcomp>r@r�)r��
port_bindingsr�r�rarYFr�rCrDrErGrF�restart_policyrZr[r6r7rQrRrS�ulimits�
log_configrIrNr�r�r8r<r]r_rXr�rUrVrTrJr`�	init_pathrMr9r:�	nano_cpusrb�cpuset_cpusrAr?r^�blkio_weight�weight�blkio_weight_device�
weight_device�device_read_bps�device_read_iops�device_write_bps�device_write_iopsr�rBr;r=r>rl)�dictr�r�convert_blkio_config�get_log_configrfr
�intr$r��create_host_configrYrr�r�r�rh�
build_ulimitsr�r�)
rkr�r�r��logging_dictr�r�r�r\r�rlrlrmr��s
������
����
	�

�
�
�

�
�
�
�
�
�
�
���
�
����
�
�
�
�
 �
!�
"�
#�
$�
%�
&�'�(�
)�
*�
+�,�
-�
.�
/�
0�
1�
2�
3�
4�
5�
6�
7�
8�
9�
:�
;�z"Service._get_container_host_configcsdd���fdd�|jD�S)NcSsV|dj}|durd�tj|dj�}n
tj�|�s!d�tj|�}td|d|dd�S)N�secretz{}/{}�bind�fileT)rN)	r�r�r�SECRETS_PATHrg�os�path�isabsr)r�r�rlrlrm�
build_spec5s
z.Service.get_secret_volumes.<locals>.build_speccr�rlrl)r�r��r�rlrmr�>r�z.Service.get_secret_volumes.<locals>.<listcomp>)r�r�rlr�rmr�4s	zService.get_secret_volumescCs�ttjd�}|stj}t�d|j�|j�	di�}|�	di��
�}
|r)|
�|�|���
�D]
\}}|
�||�q/t|�	d��}|jrOt|jjd�rOtd��|	sVt|j�nt|
�}|jdid|�d	|�d
|j�d|�d|�d
|�d|�d|�	dd��d|�|��d|�	dd��d|
�d|�	dd��d|�	dd��d|�	d�r�t|�	d��nd�d|�	dd��dd|r�t|�ndi�d|�d|�	d|j�	dd���d|j�d|��S) N�wzBuilding %sr��args�contextrzEImpossible to perform platform-targeted builds for API version < 1.35rir��tag�rm�forcermr��nocache�
dockerfile�
cache_fromr��	buildargsr�r[r��shmsizer]rI�container_limits�memory�gziprMr�
output_streamrl)�openr��devnull�sys�stdoutr�r�r�r�r�copyr�r�rNr��rewrite_build_pathrrr�rr*�_ClientBuilder�_CLIBuilderr�r��get_cache_fromr1)rk�no_cacher��force_rmr
�build_args_overriderrr�r��progressr�
build_opts�
build_argsr�rjr��builderrlrlrmr�@sv
�
��������
	�
���
����������z
Service.buildcCs&|�dd�}|durdd�|D�}|S)NrcSsg|]}|r|�qSrlrl)r�rrlrlrmr�rr�z*Service.get_cache_from.<locals>.<listcomp>rK)rkrrrlrlrmroszService.get_cache_fromcCs
d|jvS)Nr�r�r�rlrlrmr�urxzService.can_be_builtcCsJ|s|jnt�dd|j�}d�t|�d�t|j�d�t|r!d�gSd�gS)Nz[_-]�r��True�False)r��re�subr�r r!r�r)rkr�r��	proj_namerlrlrmr�xs
��zService.labelscCs|j�d�S)Nr��r�rr�rlrlrmr��rczService.custom_container_namecCsZ|jr
|dur
|jSt|j|||�}dd�|j�dg�D�}||vr+td�|j|���|S)NcSsg|]	}|�d�d�qS)r�r�r�)r��linkrlrlrmr��r�z.Service.get_container_name.<locals>.<listcomp>r�z3Service {} has a self-referential external link: {})r��build_container_namer�r�rrr�r�)rkrr�r�r��ext_links_originsrlrlrmr�s
���zService.get_container_namec
Cs�|r|tjkr	dS|tjkr|j�d�rdSt�d|j�z
|j�	|j�WdSt
y8t�d|j�YdStyR}zt�
d|j|�WYd}~dSd}~ww)NFr�zRemoving image %sTzImage %s not found.z)Failed to remove image for service %s: %s)r�r�r�r�rr�r�r�r��remove_imagerr�rr$r�)rk�
image_typerrlrlrmr(�s ��zService.remove_imagecs(dd��t�fdd�|j�dg�D��S)NcSs\t|t�r|�d�}nt|�\}}|durdS|d}t|t�s"dS|\}}|dur,dSdS)N�	publishedFrT)rfr�rr
�tuple)�binding�external_bindingsr�external_binding�	host_portrlrlrm�
has_host_port�s

z2Service.specifies_host_port.<locals>.has_host_portc3s�|]}�|�VqdSrhrl)r�r,�r0rlrmrx�r�z.Service.specifies_host_port.<locals>.<genexpr>r�)�anyr�rr�rlr1rmr��s zService.specifies_host_portc
cs��z;|jj|fi|��}|r1ttjd��}t||�EdHWd�WdS1s)wYWdSt|tj�EdHWdStt	fy[}z|sI�t
�t|��WYd}~dSd}~ww)Nr�)
r�r�r
r�rr-rrr.rr�r$r
)rk�repo�pull_kwargsr��ignore_pull_failures�outputrrrlrlrm�_do_pull�s�&���zService._do_pullc	Cs�d|jvrdSt|jd�\}}}|pdd|jd�}|s(t�d�|j|||��|dr7t|jj	d�r7t
d��|�||||�}|rC|St�
|�S)	Nr��latestT)r�streamrzPulling {} ({}{}{})...rrzDImpossible to perform platform-targeted pulls for API version < 1.35)r��parse_repository_tagrr�r�r�r�rr�rr*r7r�get_digest_from_pull)	rkr5r�r9r3r�	separator�kwargs�event_streamrlrlrmr��s"
��
zService.pullc
Cs�d|jvs
d|jvrdSt|jd�\}}}|pd}t�d�|j|||��|jj||dd�}z
t�	t
|tj��WSt
yV}z|sD�t�t|��WYd}~dSd}~ww)Nr�r�r8zPushing {} ({}{}{})...T)rr9)r�r:r�r�r�r�r��pushr�get_digest_from_pushr-rrr.r$r
)rk�ignore_push_failuresr3rr<r6rrlrlrmr?�s 
���zService.pushcCsZd}|��D]$}|��|�d�}|durt|j��|dkr!d}q|dkr*t|j��q|S)z� Check that all containers for this service report healthy.
            Returns false if at least one healthcheck is pending.
            If an unhealthy container is detected, raise a HealthCheckFailed
            exception.
        TzState.Health.StatusN�startingF�	unhealthy)r��inspectrr)r�r(r�)rkr��ctnr�statusrlrlrmr}�s


�zService.is_healthycCsNd}|jdd�D]}|��|�d�dkrd}q|jdkr$t|j|j��q|S)a Check that all containers for this service has completed successfully
            Returns false if at least one container does not exited and
            raises CompletedUnsuccessfully exception if at least one container
            exited with non-zero exit code.
        Tr�zState.Status�exitedFr)r�rDr�	exit_coder'r�)rkr�rErlrlrmr	s
�z!Service.is_completed_successfullycCs�|j}d|jvr
iSt|d|j�}|jd�||jd�d��p!i}ddddd�}i}|��D]\}}||vr8q/||||<|||��<q/|S)	N�proxies�_original_base_urlr��	FTP_PROXY�
HTTP_PROXY�HTTPS_PROXY�NO_PROXY)�ftpProxy�	httpProxy�
httpsProxy�noProxy)r��_general_configs�getattr�base_urlrrN�lower)rkr��docker_host�proxy_config�	permittedr�r�rjrlrlrmr�s(

���zService._parse_proxy_configcCsd|jvrgS|j�d�S)N�profilesr#r�rlrlrm�get_profiles1s
zService.get_profilescCs6d|jvrdS|j�d�}|D]	}||vrdSqdS)NrZTFr#)rk�enabled_profiles�service_profiles�profilerlrlrm�enabled_for_profiles7s
�zService.enabled_for_profiles)
Nr�FNNNNNrNNNN)FFNN)rrh)FNNF)FN)NFTNTFFN)NFTF)FF)T)F)
FFFNNFTFFN)FFF)Erprqrrrnr�r�r�r�r�r�r�r�r�r�r�r�r�r�rr|r�r
r�r%r0r�r�rBr�r6r�rrOrFr^r]rrbrtr�rnrlror�r�rWr�rYr�r�r�r�r�r�rr�r�r�rr(r�r7r�r?r}rr�r[r_rlrlrlrmr��s�
�"

	
;
�


&

�5
�






!


�X
,Q
�/




r�cCs |�dj|d��p
d}|j|vS)Nz&NetworkSettings.Networks.{net}.Aliases)rkrl)rr�r�)r�r[rSrlrlrmrTDs
��
rTc@�,eZdZdd�Zedd��Zedd��ZdS)r�cCrurh��_mode�rkrhrlrlrmrnKrxzIpcMode.__init__cCr*rhrar�rlrlrmrhN�zIpcMode.modecC�dSrhrlr�rlrlrmrR�zIpcMode.service_nameN�rprqrrrnr�rhrrlrlrlrmr�J�
r�c@r`)�ServiceIpcModecCrurhrvrwrlrlrmrnXrxzServiceIpcMode.__init__cC�|jjSrh�rir�r�rlrlrmr[�zServiceIpcMode.service_namecC�0|j��}|rd|djSt�d|j�dS)N�
container:rz[Service %s is trying to use reuse the IPC namespace of another service that is not running.�rir�rVr�r�r�rkr�rlrlrmrh_�
��zServiceIpcMode.modeN�rprqrrrnr�rrhrlrlrlrmriWrhric@rf)�ContainerIpcModecC�||_d�|j�|_dS�Nzcontainer:{}�r�r�rVrb�rkr�rlrlrmrnm�zContainerIpcMode.__init__Nrorlrlrlrmrslrsrsc@r`)r�cCrurhrarcrlrlrmrnsrxzPidMode.__init__cCr*rhrar�rlrlrmrhvrdzPidMode.modecCrerhrlr�rlrlrmrzrfzPidMode.service_nameNrgrlrlrlrmr�rrhr�c@r`)�ServicePidModecCrurhrvrwrlrlrmrn�rxzServicePidMode.__init__cCrjrhrkr�rlrlrmr�rlzServicePidMode.service_namecCrm)Nrnrz[Service %s is trying to use reuse the PID namespace of another service that is not running.rorprlrlrmrh�rqzServicePidMode.modeNrrrlrlrlrmryrhryc@rf)�ContainerPidModecCrtrurvrwrlrlrmrn�rxzContainerPidMode.__init__Nrorlrlrlrmrz�rsrzc@s,eZdZdZdZdd�Zedd��ZeZdS)r�z,A `standard` network mode (ex: host, bridge)NcCrurh�r�)rkr�rlrlrmrn�rxzNetworkMode.__init__cCr*rhr{r�rlrlrmrV�rdzNetworkMode.id�	rprqrrr�rrnr�rVrhrlrlrlrmr��s
r�c@s4eZdZdZdZdd�Zedd��Zedd��ZdS)	�ContainerNetworkModez5A network mode that uses a container's network stack.NcCrurhr(rwrlrlrmrn�rxzContainerNetworkMode.__init__cCrjrh�r�rVr�rlrlrmrV�rlzContainerNetworkMode.idcCsd|jjS)Nrnr~r�rlrlrmrh�rczContainerNetworkMode.moder|rlrlrlrmr}�s
r}c@s4eZdZdZdd�Zedd��ZeZedd��ZdS)	�ServiceNetworkModez3A network mode that uses a service's network stack.cCrurhrvrwrlrlrmrn�rxzServiceNetworkMode.__init__cCrjrhrkr�rlrlrmrV�rlzServiceNetworkMode.idcCs0|j��}|rd|djSt�d|j�dS)Nrnrz[Service %s is trying to use reuse the network stack of another service that is not running.)rir�rVr�r�rprlrlrmrh�s
�zServiceNetworkMode.modeN)	rprqrrr�rnr�rVrrhrlrlrlrmr�s
rcCs>|�d�|g}|r|�dt|�g�n|�t|��d�|�S)Nz-_rr)rr/r3r�r
r)r�rir�r��bitsrlrlrmr&�s

r&cCshd}d}||vr|�|d�\}}|||fS|d}}||vr/|�|d�\}}d|vr/|d}}|||fS)aSplits image identification into base image path, tag/digest
    and it's separator.

    Example:

    >>> parse_repository_tag('user/repo@sha256:digest')
    ('user/repo', 'sha256:digest', '@')
    >>> parse_repository_tag('user/repo:v1')
    ('user/repo', 'v1', ':')
    r��@rr�/)�rsplit)�	repo_path�
tag_separator�digest_separatorr3rrlrlrmr:�s



r:cCsti}tdd�|D��}|r2t||||�\}}t|||j�|�dd�|D��|s+|r2dd|ji}t|���|fS)z�
        Return a list of volume bindings for a container. Container data volumes
        are replaced by those from the previous container.
        Anonymous mounts are updated in place.
    css�|]
}|jrt|�VqdSrh)�external�build_volume_binding�r��volumerlrlrmrxs��
�z(merge_volume_bindings.<locals>.<genexpr>css�|]}t|�VqdSrh)r�r�rlrlrmrxryzaffinity:container�=)r�get_container_data_volumes�warn_on_masked_volumerir�rVr�r!)r�r�r�r�r��volume_bindings�old_volumes�
old_mountsrlrlrmr��s��
�r�cCs
g}|pg}dd�|�d�piD�}dd�|jd�d�piD�}t||�D]7}|jr-q'|jt|���vr7q'|�|j�}|s@q'|�d�sFq'|jd	d�|D�vrQq'|j|dd
�}|�|�q'd}	|D]}|j	dkrkqc|�|j
�}
|
rx|
�d�syqc|
d|_d
}	qc||	fS)z�
        Find the container data volumes that are in `volumes_option`, and return
        a mapping of volume bindings for those volumes.
        Anonymous volume mounts are updated in place instead.
    cSsi|]}|d|�qS)�Destinationrl)r��mountrlrlrmrv#���z.get_container_data_volumes.<locals>.<dictcomp>�MountscSsg|]}t�|��qSrl)r�parser�rlrlrmr�(r�z.get_container_data_volumes.<locals>.<listcomp>�ContainerConfig�Volumes�NamecSr�rlr�)r�r�rlrlrmr�Cr2)r�Fr�T)r�image_configr�r�r�rrp�_replacer�rr�rg)r��volumes_option�tmpfs_option�
mounts_optionr�r��
image_volumesr�r��updated_mounts�
ctnr_mountrlrlrmr�s@��


r�cCsXdd�|D�}|D] }|jr)|j|vr)|�|j�|jkr)t�dj||j|jd��q	dS)NcSsi|]}|j|j�qSrl)r�r�r�rlrlrmrvZr�z)warn_on_masked_volume.<locals>.<dictcomp>z�Service "{service}" is using volume "{volume}" from the previous container. Host mapping "{host_path}" has no effect. Remove the existing containers (with `docker-compose rm {service}`) to use the host volume mapping.)rir��	host_path)r�r�rr�r�r�)r�r�rir�rlrlrmr�Ys"��
���r�cCs|j|��fSrh)r��repr)�volume_specrlrlrmr�o�r�cCsnt|jt�r&|jjdd�}|sd�|j��j|j�S|d}d�|j|j�St|jt�r5d�|jj|j�SdS)z�
    volume_from can be either a service or a container. We want to return the
    container.id and format it into a string complete with the mode.
    Tr��{}:{}rN)	rfrgr�r�r�r�rVrhr&)�volume_from_specr�r�rlrlrmr�ss
��r�cCs`i}|jr|j|j��D]\}}||jvr|j|||<q
td|j|j|j|j|jd�|��S)N)rr�rgrN�consistencyrl)	r��options_maprrNr	r�rgrNr�)�
mount_specr=�option�sdk_namerlrlrmr��s
���r�cCsjt|pi�}|�dd�|D��|durt|�|t<|dur"||t<t|t<|r3t�d|�||t	<|S)Ncss�|]	}|�dd�VqdS)r�rNr$)r�r�rlrlrmrx�s�z)build_container_labels.<locals>.<genexpr>zAdded config hash: %s)
r�r�r
rr"rr#r�rr)�
label_options�service_labelsr�rr�r�rlrlrmr��sr�cCsf|sdSg}|��D]&\}}t|t�r|�|||d��q
t|t�r0d|i}|�|�|�|�q
|S)N)r��soft�hardr�)rNrfr�r�r�r�)�
ulimit_configr��
limit_name�soft_hard_values�ulimit_dictrlrlrmr��s



�r�cCs4|r|�dd�nd}|r|�dd�nd}t||d�S)N�driverrr�)rr�)rr)r�rO�log_optionsrlrlrmr��s�r�csdd���fdd�|��D�S)NcSs.|dur|St|t�r|�d�}dj||d�S)Nzutf-8z
{key}={value}�r�r�)rf�bytes�decoder�r�rlrlrm�
format_env�s


z&format_environment.<locals>.format_envcsg|]}�|��qSrlrl)r��item�r�rlrmr��r�z&format_environment.<locals>.<listcomp>)rN)r�rlr�rmr��sr�cCs6g}|D]}t|t�r|�|���q|�|�q|Srh)rfrr�r�)r�r��portrlrlrmr��s
r�cCs`g}||�dg�}|D]!}t|�\}}|D]}t|�}d|vr't|�d��}|�|�qq|S)Nr�r�)rr
r
r+r�r�)�container_portsr�r��	all_ports�
port_range�internal_rangerr�rlrlrmr��s�r�cCshi}|dur|S|�d�|d<dD] }||vrqg}||D]}|�dd�|��D��q|||<q|S)Nr�)r�r�r�r�r�cSsi|]	\}}|��|�qSrl)�
capitalize)r�r�rjrlrlrmrv�r�z(convert_blkio_config.<locals>.<dictcomp>)rr�rN)r�r��field�arrr�rlrlrmr��s
r�cCs*trt|�s|�t�sttj�|�}|Srh)rr�
startswithr%r�r��normpath)r�rlrlrmr�src@�TeZdZdd�Zdddddddddddddddddddddddddejfdd�ZdS)rcCrurh)r�)rkr�rlrlrmrn�rxz_ClientBuilder.__init__NFTc#
Cs|jjdid|�d|�d|�d|�d|�d|�d|
�d|�d	|�d
|�d|�d|�d
|�d|�d|�d|�d|�d|��}z	tt||��}WntyY}zt|t|���d}~ww|j��d} |D]}!d|!vrzt�	d|!�
dd��}"|"rz|"�d�} qc| dur�t||r�|!��d��| S)Nr�rrrr�rrr�rrr�r�rrIr	rrMrr9zSuccessfully built ([0-9a-f]+)rr�Unknownrl)r�r�r�r-r.rgr
�closer �searchr�group)#rkrir�rr��fileobjrrr��custom_context�encodingr�rrr	r�rrrr�rr�r��squashrIrrM�use_config_proxyr�build_output�
all_eventsrre�event�matchrlrlrmr�sl��������	�
���
��������

�z_ClientBuilder.build�rprqrrrnrrr�rlrlrlrmr���rc@r�)rcCrurh)�	_progress)rkrrlrlrmrn7rxz_CLIBuilder.__init__NFTc%Cs�|
rtj�|�rtj�||
�}
t��}t�}|�d|�|�d|�|�	d|
�|�
d|�|�d|�|�	d|�d��|�	d|�|�
d	|�|�	d
|j�|�
d|�|�	d|�|�	d
|�|�	d|�|�	d|�|�	d|�|r�t
|t�r�dd�|��D�}|D]}|�	dd�|��q�|�|g�} tj| |tjdd��}!|!��|!jdkr�t|d��Wd�n1s�wYt|��}"|"��}#|#�d�d��}$Wd�n1s�wYt�|�|$S)ah
        Args:
            service (str): Service to be built
            path (str): Path to the directory containing the Dockerfile
            buildargs (dict): A dictionary of build arguments
            cache_from (:py:class:`list`): A list of images used for build
                cache resolution
            container_limits (dict): A dictionary of limits applied to each
                container created by the build process. Valid keys:
                - memory (int): set memory limit for build
                - memswap (int): Total memory (memory + swap), -1 to disable
                    swap
                - cpushares (int): CPU shares (relative weight)
                - cpusetcpus (str): CPUs in which to allow execution, e.g.,
                    ``"0-3"``, ``"0,1"``
            custom_context (bool): Optional if using ``fileobj``
            decode (bool): If set to ``True``, the returned stream will be
                decoded into dicts on the fly. Default ``False``
            dockerfile (str): path within the build context to the Dockerfile
            encoding (str): The encoding for a stream. Set to ``gzip`` for
                compressing
            extra_hosts (dict): Extra hosts to add to /etc/hosts in building
                containers, as a mapping of hostname to IP address.
            fileobj: A file object to use as the Dockerfile. (Or a file-like
                object)
            forcerm (bool): Always remove intermediate containers, even after
                unsuccessful builds
            isolation (str): Isolation technology used during build.
                Default: `None`.
            labels (dict): A dictionary of labels to set on the image
            network_mode (str): networking mode for the run commands during
                build
            nocache (bool): Don't use the cache when set to ``True``
            platform (str): Platform in the format ``os[/arch[/variant]]``
            pull (bool): Downloads any updates to the FROM image in Dockerfiles
            quiet (bool): Whether to return the status
            rm (bool): Remove intermediate containers. The ``docker build``
                command now defaults to ``--rm=true``, but we have kept the old
                default of `False` to preserve backward compatibility
            shmsize (int): Size of `/dev/shm` in bytes. The size must be
                greater than 0. If omitted the system uses 64MB
            squash (bool): Squash the resulting images layers into a
                single layer.
            tag (str): A tag to add to the final image
            target (str): Name of the build-stage to build in a multi-stage
                Dockerfile
            timeout (int): HTTP timeout
            use_config_proxy (bool): If ``True``, and if the docker client
                configuration file (``~/.docker/config.json`` by default)
                contains a proxy configuration, the corresponding environment
                variables will be set in the container being built.
            output_stream (writer): stream to use for build logs
        Returns:
            A generator for the build output.
        z--build-argz--cache-fromz--filez
--force-rmz--labelz--memoryr
z	--networkz
--no-cachez
--progressz--pullz--tagz--targetz	--iidfilez
--platformz--isolationcSsg|]
\}}d�||��qS)r�)r�)r��host�iprlrlrmr��r�z%_CLIBuilder.build.<locals>.<listcomp>z
--add-hostz{}T)r�stderr�universal_newlinesrzBuild failedNr�r)r�r��isdirr�tempfile�mktemp�_CommandBuilder�
add_params�add_list�add_arg�add_flagrr�rfr�rNr�r��
subprocess�Popenrr��communicate�
returncodergr
�readliner��stripr�)%rkrir�rr�r�rrr�r�r�r�rrr	r�rrrr�rr�r�r�rIrrMr�r�iidfile�command_builderr�r��p�f�linererlrlrmr�:sP?
�

��
�
z_CLIBuilder.buildr�rlrlrlrmr6r�rc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r�cCsddg|_dS)N�dockerr���_argsr�rlrlrmrn�r�z_CommandBuilder.__init__cCs |r|j�|t|�g�dSdSrh)r�r/r
)rkr�r�rlrlrmr��s�z_CommandBuilder.add_argcCs|r|j�|g�dSdSrh�r�r/)rkr��flagrlrlrmr��s�z_CommandBuilder.add_flagcCs6|r|��D]\}}|j�|d�||�g�qdSdS)Nr�)rNr�r/r�)rkr��paramsr��valrlrlrmr��s
�z_CommandBuilder.add_paramscCs&|r|D]}|j�||g�qdSdSrhr�)rkr�r!r�rlrlrmr��s
�z_CommandBuilder.add_listcCs
|j|Srhr�)rkr�rlrlrmr��rxz_CommandBuilder.buildN)	rprqrrrnr�r�r�r�r�rlrlrlrmr��sr�rh)z�enumr�r�r�r r�rr��collectionsrr�operatorr�
docker.errorsrrr�docker.typesrr	�docker.utilsr
r�docker.utils.portsrr
�docker.utils.utilsrrrrrr�rrrr�
config.errorsr�config.typesrrrrrrrrr r!r"r#r$r%r�r&r#r'r(r)r*�parallelr,r-r.�utilsr/r0r1r2r3r4�compose.cli.utilsr5�	getLoggerrpr�r�r�r�r�r;rgrtryrzr{�unique�Enumr|r�r�r�rTr�rirsr�ryrzr�r}rr&r:r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rlrlrlrm�<module>s�
0


%


?


8n