Welcome to the Inedo Forums! Check out the Forums Guide for help getting started.

If you are experiencing any issues with the forum software, please visit the Contact Form on our website and let us know!

Docker Migration from Nexus – Feature Not Working



  • Hi ProGet team,

    I’m trying to use the Docker migration feature in ProGet to import images from a Sonatype Nexus repository, but it doesn’t seem to be working as expected with the following error.

    ERROR: Unhandled exception: System.Net.Http.HttpRequestException: Response status code does not indicate success: 404 (Not Found).
    

    The Nexus docker repository can be found in the selection of the import dialog.

    Before I proceed further, I’d like to confirm whether there are any specific requirements or limitations for this migration feature.

    In our setup:

    • The Nexus Docker repository is configured using a port connector.
    • We have a proxy server that maps this port to a different external URL.

    Would this configuration affect or break the migration process?
    If so, is there a recommended way to handle such setups?

    Any clarification or documentation on the expected configuration for Docker migration from Nexus would be greatly appreciated.

    Thanks.


  • inedo-engineer

    Hi @koksime-yap_5909,

    ProGet uses a combination of the Nexus REST API and the Docker API to pull images from Nexus. Just like packages, only local images will be pulled (as in only hosted Nexus Docker registries are supported). The basic process is:

    1. Get a list of images using the Nexus components API.
    2. Get the Docker API endpoint using the Nexus registries API (this is what you would use in the Docker client)
    3. Pull the image (manifest, layers, etc...) using the Nexus Docker API

    I'm guessing the error is occurring building the URL to Docker API endpoint. When you say that you are using an external proxy, did you configure the subdomain and port in Nexus to be the subdomain and port of your proxy? Would you also be able to send us the JSON that is returned for the following GET request in the Nexus API?

    https://«NEXUS_HOST_AND_PORT»/service/rest/v1/repositories/docker/hosted/«NEXUS_DOCKER_REGISTRY_NAME»
    

    If you can send me the value for the url property and the object for docker property, I can tell you what URL ProGet using to connect to the Docker API. Feel free to obfuscate the host name, subdomain (if configured), and registry name. The JSON will look something like this:

    {
      "name": "internal",
      "format": "docker",
      "type": "hosted",
      "url": "http://localhost:8081/repository/docker-example",
      
    ...
    
      "docker": {
        "v1Enabled": false,
        "forceBasicAuth": true,
        "httpPort": 8082,
        "httpsPort": 8083,
        "subdomain": "docker-a",
        "pathEnabled": true
      }
    }
    

    Thanks,
    Rich



  • Hi @rhessinger,

    Our Nexus docker repository is configured to use specific port (e.g. port 8080), but this port is not exposed externally. Here's an example response returned by the Nexus endpoint:

    {
      "name" : "example",
      "url" : "https://nexus-example/repository/example",
      "online" : true,
    ...
      "docker" : {
        "v1Enabled" : false,
        "forceBasicAuth" : true,
        "httpPort" : 8080,
        "httpsPort" : null,
        "subdomain" : null
      },
    ...
      "format" : "docker",
      "type" : "hosted"
    }
    

    Instead, we have a proxy server that maps a custom URL (e.g., https://nexus-docker/) to the internal Nexus port.

    All Docker operations (push/pull) work correctly through this custom URL.

    Could this proxy-based URL mapping affect the Docker migration feature, or is there a way to specify the external (proxy) URL for migration?

    Thanks.


  • inedo-engineer

    Hi @koksime-yap_5909,

    The separate proxy server port is what is causing the import issue with this. After looking at this further, the main issue is that specified httpPort is overriding the port, even when an https:// URL is being used. I created a ticket, PG-3155, to fix that and add the ability to override the URL used for the Docker API. This fix will be released in ProGet 2025.15. If you are interested, I can get you a pre-release build with the fix in it either later today or tomorrow. Just let me know!

    Thanks,
    Rich



  • Hi ProGet team,

    Thanks for adding support to override the Docker API URL. However, during my testing, it doesn’t seem to work as expected.

    For Docker images with long paths, based on the logs, it appears that the requested URL path is truncated. I’m not sure if this is just a visual effect in the logs or if the actual request is being truncated. For example, the URL should be:

    https://nexus-registry.example/v2/my-example/subgroup/container/project/subname/image/manifests/stable
    

    but the log shows:

    https://nexus-registry.example/v2/group/container/project/subname/image/manifests/stable
    

    and it returns a 404, even though I can access the original URL directly in the browser.

    Furthermore, with shorter image paths, e.g.:

    https://nexus-registry.example/v2/python/manifests/3.11.2-bullseye
    

    I don’t see the request in the log, and it fails with the following error message:

    Error: Unhandled exception: System.ArgumentOutOfRangeException: startIndex cannot be larger than length of string. (Parameter 'startIndex')
       at System.String.ThrowSubstringArgumentOutOfRange(Int32 startIndex, Int32 length)
       at System.String.Substring(Int32 startIndex, Int32 length)
    

    I would appreciate any guidance on this matter.

    Thank you for your support!


  • inedo-engineer

    Hi @koksime-yap_5909,

    Thanks for following up! Is it possible to share the contents of the JSON your API generates? You can do that by logging into Nexus and entering the following URL in your browser: https://«NEXUS_HOST_AND_PORT»/service/rest/v1/components?repository=«REPOSITORY_NAME»

    Please not the Repository Name is your Docker Registry name.

    The code does some stuff to strip off the registry name so only the namespace and image name are left. I'm guessing that something is being returned slightly differently. Can you also tell us what version of Nexus you are running? It might help so I can do more testing with that version.

    Thanks,
    Rich



  • Hi @rhessinger,

    Thanks for the reply. I am running Nexus 3.76.1.

    Here's the response from the API:

    {
      "items" : [ {
        "id" : "<obfuscated>",
        "repository" : "docker",
        "format" : "docker",
        "group" : "",
        "name" : "pseudo-group/subgrouping/groups/individual/project/image",
        "version" : "stable",
        "assets" : [ {
          "downloadUrl" : "https://my-nexus-server.foo.bar.com/repository/docker/v2/pseudo-group/subgrouping/groups/individual/project/image/manifests/stable",
          "path" : "/v2/pseudo-group/subgrouping/groups/individual/project/image/manifests/stable",
          "id" : "<obfuscated>",
          "repository" : "docker",
          "format" : "docker",
          "checksum" : {
            "sha256" : "<obfuscated>",
            "sha1" : "<obfuscated>"
          },
          "contentType" : "application/vnd.docker.distribution.manifest.v2+json",
          "lastModified" : "2025-12-02T12:15:33.452+00:00",
          "lastDownloaded" : null,
          "uploader" : "<obfuscated>",
          "uploaderIp" : "<obfuscated>",
          "fileSize" : <obfuscated>,
          "blobCreated" : "2025-12-02T12:15:33.454+00:00",
          "blobStoreName" : null,
          "docker" : { }
        } ]
      } ],
      "continuationToken" : null
    }
    

    The Docker API Override URL is set to https://nexus-registry.foo.bar.baz.com/v2/ which is the URL returned by the docker client.

    Here's the outputs when running the migration:

    info: System.Net.Http.HttpClient.Default.LogicalHandler[100]
          Start processing HTTP request GET https://nexus-registry.foo.bar.baz.com/v2/ouping/groups/individual/project/image/manifests/stable
    info: System.Net.Http.HttpClient.Default.ClientHandler[100]
          Sending HTTP request GET https://nexus-registry.foo.bar.baz.com/v2/ouping/groups/individual/project/image/manifests/stable
    

    Hope the info above is helpful. Thanks!


  • inedo-engineer

    Hi @koksime-yap_5909,

    Thanks for sending this over! It will take me a but to dig through this. Just a couple of quick follow up questions:

    1. What is psuedo-group? Is that a repository/registry name?
    2. What is subgrouping/groups? It may be helpful to see a screenshot of this example inside of Nexus.

    Thanks,
    Rich


Log in to reply
 

Inedo Website HomeSupport HomeCode of ConductForums GuideDocumentation