How to analyze docker assets size in Nexus Repository

Viewed 552

I'm trying to create a script that will help me list and analyze the assets in Nexus Sonatype repository by size. Currently I don't know any other approach than to use groovy script, where I have a problem when analyzing docker repositories.

I've copied the script from https://support.sonatype.com/hc/en-us/articles/115009519847-Investigating-Blob-Store-and-Repository-Size-and-Space-Usage where under chapter "2. Running a repository manager task." there is a script for listing assets in Nexus Repository.

I've modified the groovy script a little, so it can store data in temp folder and it's easier to analyze later.

import org.sonatype.nexus.repository.storage.StorageFacet
import org.sonatype.nexus.repository.Repository
import org.sonatype.nexus.repository.storage.Asset
import groovy.json.JsonOutput

import java.text.SimpleDateFormat
import org.sonatype.nexus.common.app.ApplicationDirectories
import org.sonatype.nexus.internal.app.ApplicationDirectoriesImpl

long min_size = 1000000

def filename = "repoBlobSizes-${new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date())}.json"
//Default location of results is the Nexus temporary directory
ApplicationDirectories applicationDirectories = (ApplicationDirectories)container.lookup(ApplicationDirectoriesImpl.class.name)
File resultsFileLocation = applicationDirectories.getTemporaryDirectory()
File resultsFile = new File(resultsFileLocation, filename)
def finalResults = [:].withDefault { 0 }
def finalResultsFile = ""

repository.repositoryManager.browse().each { Repository repo ->
    StorageFacet storageFacet = repo.facet(StorageFacet)
    def tx = storageFacet.txSupplier().get()
    def results = [:].withDefault { 0 }
    
    try {
        tx.begin()          
        tx.browseAssets(tx.findBucket(repo)).each { Asset asset ->
        
            if (asset.size() > min_size) {
                results.put(asset.name(),asset.size())          
                finalResultsFile +=  repo.name + "\t"+ asset.name() + "\t" + asset.size() + "\n"            
            }
        }    
     
    } finally {
        tx.close()
        
    }
    finalResults.put(repo.name, results);
    def sorted = results.sort { a, b -> b.value <=> a.value }
    log.info(JsonOutput.prettyPrint(JsonOutput.toJson(sorted))) 
}

resultsFile.append(finalResultsFile)

The script is working fine for repositories like maven2, npm ... but for docker assets I get only image ID (SHA256 hash) instead of Component Name and Component Version, so I could identify docker image by name and it's location.

repo.name / asset.name / asset.size 
            
docker-development  v2/-/blobs/sha256:0cfb88e899d4f610978cc9590cb274dd79308430bd9564c65b153b856f945eb9  1083624
docker-development  v2/-/blobs/sha256:0d1d2c70b2632d0e65424bfae2310eeb6a3b5862febf880b404ce8359304f8e4  1134426
docker-development  v2/-/blobs/sha256:0d20a967db845c7ed074e04a42e28080722e7fad9fafaabb90955f8dc9a89775  1903334
docker-development  v2/-/blobs/sha256:0d22b3049d9be7cb6bfff9b45f71b0e382b8e5ea0fbfe0282427e55da20ad7e7  1628442
docker-development  v2/-/blobs/sha256:0d6f18592928fc2eaf91cecca5accbee1c77d33f9a7d8f79aacbccfdb87d8a32  116712140
docker-development  v2/-/blobs/sha256:0d936fab065d39768c708ce838e8ca7a6532851971267049aed34b88eb528c9e  7320423
docker-development  v2/-/blobs/sha256:0da56ef07f9e83695cb35e9d37d372dfb0892402616f920fc34dd965e5e227bd  162431268
docker-development  v2/-/blobs/sha256:0db92fdf2b037a8a0c9e9cca4c231eb71b241eb10c7b0e04ed41d5a9db3b7b3c  11173072
docker-development  v2/-/blobs/sha256:0e466b8eaca15da6cde5101f9d3df7d53cd794fcf48a4ea2632cdb52ea5ae3b6  7320418
docker-releases v2/-/blobs/sha256:203245bed457576b2f6e3487e2696a5f0ef04ed81c5f343586c8978ebd0fedb6  140115530
docker-releases v2/-/blobs/sha256:205762a5fb20647c6c286c75f6dcfb8336a15bdadb19dae9e536f12356760138  140115528
docker-releases v2/-/blobs/sha256:2069e25070d3ea3ce018952fad1bfc5aa7f92301936cec1a0abf77dd9e951963  128171526
docker-releases v2/-/blobs/sha256:207b8632e0a0affb06e092f4ea0dddf6673c5e9b7668f60f6d2d3a64048e4c8d  16030212
docker-releases v2/-/blobs/sha256:20a0497610a0a342eccbd9e8be6a4feae760672489e9f70ce4cf23681b555987  128171530
docker-releases v2/-/blobs/sha256:20a6e44d614851f1899b34149a9e4fccc239a115db0d097be5f38a8edeca3447  127844515
docker-releases v2/-/blobs/sha256:20ae2ed9f6feab6b3a3da707e70d5396e378e5fe38a9c3f0e706419dba8a51e5  160162247
docker-releases v2/-/blobs/sha256:20c129ca6c3903a67380027dbe440ca1ecf73f84898b26ba86ce8dd5bcda8aca  73452802
docker-releases v2/-/blobs/sha256:20caf18297dbc5e353603dbcb02a0b9086aa5339638f8560d4e2780c9f2b61f5  11036523
maven-releases  com/devops/release-test/41.20.07/release-test-41.20.07.jar  16202095
maven-releases  com/devops/release-test/41.20.08/release-test-41.20.08.jar  16202094
maven-releases  com/devops/release-test/41.20.09/release-test-41.20.09.jar  16202094
maven-releases  com/devops/release-test/41.20.10/release-test-41.20.10.jar  16202093
maven-releases  com/devops/release-test/41.20.11/release-test-41.20.11.jar  16202094

Is there a way to get also docker detailed description like in maven2 repository where asset.name is combined with group, name and version. That would really helped me when I try to analyze all assets disk usage in Nexus Repository.

Thank you and best regards, Damjan

0 Answers
Related