tox-dev / tox-docker

A tox plugin to run one or more Docker containers during tests

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Unable to pull image from private registry

pat-tpz opened this issue · comments

Hi !

Using tox-docker 3.x we are not able to pull image hosted on our private registry.

Image name in the configuration looks like private-registry:5000/namespace/image-name:1.0.0

Look at the tox-docker code we can see that the image name is "partitionned"

name, _, tag = image.partition(":")

in our case, name is private-registry and tag is 5000/namespace/image-name:1.0.0

Fix proposal :

image_name_part = image.split(":")
tag = image_name_part.pop()
name = ":".join(image_name_part)

The stack

Traceback (most recent call last):
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/client.py", line 268, in _raise_for_status
    response.raise_for_status()
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/models.py", line 953, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http+docker://localhost/v1.41/images/private-registry:5000/namespace/image-name:1.0.0/json

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox_docker/__init__.py", line 260, in tox_runtest_pre
    docker.images.get(image)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/models/images.py", line 314, in get
    return self.prepare_model(self.client.api.inspect_image(name))
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/image.py", line 251, in inspect_image
    return self._result(
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/client.py", line 274, in _result
    self._raise_for_status(response)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/client.py", line 270, in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
    raise cls(e, response=response, explanation=explanation)
docker.errors.ImageNotFound: 404 Client Error for http+docker://localhost/v1.41/images/private-registry:5000/namespace/image-name:1.0.0/json: Not Found ("no such image: private-registry:5000/namespace/image-name:1.0.0: No such image: private-registry:5000/namespace/image-name:1.0.0")

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/client.py", line 268, in _raise_for_status
    response.raise_for_status()
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/requests/models.py", line 953, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http+docker://localhost/v1.41/images/create?tag=5000%2Fnamespace%2Fimage-name%3A1.0.0&fromImage=private-registry

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox/session/__init__.py", line 203, in cleanup
    yield
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox/session/__init__.py", line 197, in runcommand
    return self.subcommand_test()
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox/session/__init__.py", line 225, in subcommand_test
    run_sequential(self.config, self.venv_dict)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox/session/commands/run/sequential.py", line 22, in run_sequential
    runtestenv(venv, config)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox/session/commands/run/sequential.py", line 73, in runtestenv
    config.pluginmanager.hook.tox_runtest_pre(venv=venv)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/manager.py", line 84, in <lambda>
    self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/callers.py", line 208, in _multicall
    return outcome.get_result()
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/tox_docker/__init__.py", line 264, in tox_runtest_pre
    docker.images.pull(name, tag=tag or None)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/models/images.py", line 444, in pull
    pull_log = self.client.api.pull(
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/image.py", line 428, in pull
    self._raise_for_status(response)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/api/client.py", line 270, in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/home/acme/.pyenv/versions/3.9.4/lib/python3.9/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
    raise cls(e, response=response, explanation=explanation)
docker.errors.APIError: 400 Client Error for http+docker://localhost/v1.41/images/create?tag=5000%2Fnamespace%2Fimage-name%3A1.0.0&fromImage=private-registry: Bad Request ("invalid tag format")

I've just released https://pypi.org/project/tox-docker/4.0.0a1/, which contains this fix (and other improvements). Please let me know if it works for you, or especially if it doesn't!