a
   >5y<%                   @   sv   d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddlmZ ddlmZ e	e
ZG dd deZd	d
 ZdS )    N   )auth)	constants)errors)utilsc                   @   s0   e Zd ZdddZeddd Zd	d
 ZdS )BuildApiMixinNFTc           (   	   C   s  d }}i }|pi }|pi }|du r4|du r4t d|rJ|	durJtd| D ]}|tjvrRtd|qR|r|st d|}n|durt|}n|	dr|}nt
j|st dnt
j|d}d} t
j|r2t|d	4}!ttd
d dd |!  D } W d   n1 s(0    Y  t||}tj|| ||d}|rXdn|	}	| d}"|||||||
|d}#|#| |r| j }$|$ D ]\}%}&||%|& q|r|#dt|i |r t| jdr|#d|i n
t d|r6t| jdr,|#dt|i n
t d|rlt| jdrb|#dt|i n
t d|rt| jdr|#d|i n
t d|rt| jdr|#d|i n
t d |rt| jdr|#d!|i n
t d"|durDt!| jd#r t d$t"|t#r6t$|}|#d%|i |durpt!| jd&rht d'||#d(< |durt!| jd)rt d*||#d+< |durd,d-i}|	r|	|d.< | %| | j&|"||#|d/|d0}'|dur|s|'  | j(|'|d1S )2a  
        Similar to the ``docker build`` command. Either ``path`` or ``fileobj``
        needs to be set. ``path`` can be a local path (to a directory
        containing a Dockerfile) or a remote URL. ``fileobj`` must be a
        readable file-like object to a Dockerfile.

        If you have a tar file for the Docker build context (including a
        Dockerfile) already, pass a readable file-like object to ``fileobj``
        and also pass ``custom_context=True``. If the stream is compressed
        also, set ``encoding`` to the correct value (e.g ``gzip``).

        Example:
            >>> from io import BytesIO
            >>> from docker import APIClient
            >>> dockerfile = '''
            ... # Shared Volume
            ... FROM busybox:buildroot-2014.02
            ... VOLUME /data
            ... CMD ["/bin/sh"]
            ... '''
            >>> f = BytesIO(dockerfile.encode('utf-8'))
            >>> cli = APIClient(base_url='tcp://127.0.0.1:2375')
            >>> response = [line for line in cli.build(
            ...     fileobj=f, rm=True, tag='yourname/volume'
            ... )]
            >>> response
            ['{"stream":" ---\u003e a9eb17255234\n"}',
             '{"stream":"Step 1 : VOLUME /data\n"}',
             '{"stream":" ---\u003e Running in abdc1e6896c6\n"}',
             '{"stream":" ---\u003e 713bca62012e\n"}',
             '{"stream":"Removing intermediate container abdc1e6896c6\n"}',
             '{"stream":"Step 2 : CMD [\"/bin/sh\"]\n"}',
             '{"stream":" ---\u003e Running in dba30f2a1a7e\n"}',
             '{"stream":" ---\u003e 032b8b2855fc\n"}',
             '{"stream":"Removing intermediate container dba30f2a1a7e\n"}',
             '{"stream":"Successfully built 032b8b2855fc\n"}']

        Args:
            path (str): Path to the directory containing the Dockerfile
            fileobj: A file object to use as the Dockerfile. (Or a file-like
                object)
            tag (str): A tag to add to the final image
            quiet (bool): Whether to return the status
            nocache (bool): Don't use the cache when set to ``True``
            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
            timeout (int): HTTP timeout
            custom_context (bool): Optional if using ``fileobj``
            encoding (str): The encoding for a stream. Set to ``gzip`` for
                compressing
            pull (bool): Downloads any updates to the FROM image in Dockerfiles
            forcerm (bool): Always remove intermediate containers, even after
                unsuccessful builds
            dockerfile (str): path within the build context to the Dockerfile
            buildargs (dict): A dictionary of build arguments
            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"``
            decode (bool): If set to ``True``, the returned stream will be
                decoded into dicts on the fly. Default ``False``
            shmsize (int): Size of `/dev/shm` in bytes. The size must be
                greater than 0. If omitted the system uses 64MB
            labels (dict): A dictionary of labels to set on the image
            cache_from (:py:class:`list`): A list of images used for build
                cache resolution
            target (str): Name of the build-stage to build in a multi-stage
                Dockerfile
            network_mode (str): networking mode for the run commands during
                build
            squash (bool): Squash the resulting images layers into a
                single layer.
            extra_hosts (dict): Extra hosts to add to /etc/hosts in building
                containers, as a mapping of hostname to IP address.
            platform (str): Platform in the format ``os[/arch[/variant]]``
            isolation (str): Isolation technology used during build.
                Default: `None`.
            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.

        Returns:
            A generator for the build output.

        Raises:
            :py:class:`docker.errors.APIError`
                If the server returns an error.
            ``TypeError``
                If neither ``path`` nor ``fileobj`` is specified.
        Nz,Either path or fileobj needs to be provided.z.Can not use custom encoding if gzip is enabledz Invalid container_limits key {0}z,You must specify fileobj with custom_context)zhttp://zhttps://zgit://zgithub.com/zgit@z-You must specify a directory to build in pathz.dockerignorerc                 S   s   | dko| d dkS )N r   # )xr   r   4/usr/lib/python3.9/site-packages/docker/api/build.py<lambda>       z%BuildApiMixin.build.<locals>.<lambda>c                 S   s   g | ]}|  qS r   )strip).0lr   r   r   
<listcomp>   r   z'BuildApiMixin.build.<locals>.<listcomp>)exclude
dockerfilegzipr   z/build)tremoteqnocachermforcermpullr   	buildargsz1.22shmsizez/shmsize was only introduced in API version 1.22z1.23labelsz.labels was only introduced in API version 1.23z1.25Z	cachefromz2cache_from was only introduced in API version 1.25z1.29targetz.target was only introduced in API version 1.29Znetworkmodez4network_mode was only introduced in API version 1.25squashz.squash was only introduced in API version 1.25z1.27z3extra_hosts was only introduced in API version 1.27Z
extrahostsz1.32z0platform was only introduced in API version 1.32platformz1.24z1isolation was only introduced in API version 1.24	isolationzContent-Typezapplication/tarzContent-EncodingT)dataparamsheadersstreamtimeout)decode))	TypeErrorr   ZDockerExceptionkeysr   ZCONTAINER_LIMITS_KEYSformatr   Zmkbuildcontext
startswithospathisdirjoinexistsopenlistfilterread
splitlinesprocess_dockerfiletar_urlupdateZ_proxy_configsZget_environmentitems
setdefaultjsondumpsZversion_gteZ_versionZInvalidVersionZ
version_lt
isinstancedictZformat_extra_hosts_set_auth_headers_postcloseZ_stream_helper)(selfr0   tagquietZfileobjr   r   r)   Zcustom_contextencodingr   r   r   Zcontainer_limitsr*   r   r   r   r    Z
cache_fromr!   Znetwork_moder"   Zextra_hostsr#   r$   Zuse_config_proxyr   contextr'   keyZdockerignorer   fur&   Z
proxy_argskvZresponser   r   r   build   s    i


&










	zBuildApiMixin.buildz1.31c                 C   s   |  d}| | |dS )a|  
        Delete the builder cache

        Returns:
            (dict): A dictionary containing information about the operation's
                    result. The ``SpaceReclaimed`` key indicates the amount of
                    bytes of disk space reclaimed.

        Raises:
            :py:class:`docker.errors.APIError`
                If the server returns an error.
        z/build/pruneT)r;   Z_resultrD   )rF   urlr   r   r   prune_builds  s    
zBuildApiMixin.prune_buildsc              	   C   s   t d | jr| jjr2t d tj| jd| _| jr| j }tj|vrjtj	|v rj|
tj	i |tj< t dddd | D  |rt||d< n
t d	 d S )
NzLooking for auth configz2No auth config in memory - loading from filesystem)credstore_envzSending auth config ({0})z, c                 s   s   | ]}t |V  qd S )N)repr)r   rN   r   r   r   	<genexpr>=  r   z2BuildApiMixin._set_auth_headers.<locals>.<genexpr>zX-Registry-ConfigzNo auth config found)logdebugZ_auth_configsZis_emptyr   Zload_configrS   Zget_all_credentialsZ	INDEX_URLZ
INDEX_NAMEgetr-   r2   r,   Zencode_header)rF   r'   Z	auth_datar   r   r   rC   &  s,    




zBuildApiMixin._set_auth_headers)NNFNFFNFNFFNNFNFNNNNNNNNNT)__name__
__module____qualname__rP   r   Zminimum_versionrR   rC   r   r   r   r   r      s           
  
r   c                 C   s   | sdS | }t j| s\t j|| }tjr\|tjr\dtjt j	|t
tjd  }t j|d t j|d kst j||drt|d(}dtd| fW  d    S 1 s0    Y  | |krt j||} | d fS )N)NNz{}{}r   z..r   z.dockerfile.{0:x}   )r/   r0   isabsr2   r   ZIS_WINDOWS_PLATFORMr.   ZWINDOWS_LONGPATH_PREFIXr-   normpathlen
splitdriverelpathr4   randomZgetrandbitsr7   )r   r0   Zabs_dockerfileZdfr   r   r   r9   I  s0    
 "r9   )r?   Zloggingr/   rb   r	   r   r   r   r   Z	getLoggerrY   rV   objectr   r9   r   r   r   r   <module>   s   
  <