{"id":30237995,"url":"https://github.com/seqeralabs/wave","last_synced_at":"2026-03-17T10:08:59.938Z","repository":{"id":200462928,"uuid":"451862186","full_name":"seqeralabs/wave","owner":"seqeralabs","description":"On-demand containers provisioning service","archived":false,"fork":false,"pushed_at":"2025-08-13T10:37:04.000Z","size":33656,"stargazers_count":43,"open_issues_count":63,"forks_count":6,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-08-13T12:27:23.465Z","etag":null,"topics":["containers","docker","kubernetes","nextflow","singularity"],"latest_commit_sha":null,"homepage":"https://seqera.io/wave/","language":"Groovy","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seqeralabs.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.txt","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-25T12:08:41.000Z","updated_at":"2025-08-12T07:06:20.000Z","dependencies_parsed_at":"2023-12-26T15:57:17.245Z","dependency_job_id":"cca922ae-9333-4707-a58b-8f9b5bdccce3","html_url":"https://github.com/seqeralabs/wave","commit_stats":null,"previous_names":["seqeralabs/wave"],"tags_count":421,"template":false,"template_full_name":null,"purl":"pkg:github/seqeralabs/wave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seqeralabs%2Fwave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seqeralabs%2Fwave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seqeralabs%2Fwave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seqeralabs%2Fwave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seqeralabs","download_url":"https://codeload.github.com/seqeralabs/wave/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seqeralabs%2Fwave/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270515666,"owners_count":24598440,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-15T02:00:12.559Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["containers","docker","kubernetes","nextflow","singularity"],"created_at":"2025-08-15T02:59:05.635Z","updated_at":"2026-01-16T11:54:25.619Z","avatar_url":"https://github.com/seqeralabs.png","language":"Groovy","readme":"# Wave containers\n\n### Summary\nWave allows provisioning container images on-demand, removing the need\nto build and upload them manually to a container registry.\n\nContainers provisioned by Wave can be both disposable, i.e. ephemeral containers only\naccessible for a short period of time, and regular long-term registry-persisted container\nimages.\n\n### Features\n\n* Authenticate the access to remote container registries;\n* Augment container images i.e. dynamically add one or more container layers to existing images;\n* Build container images on-demand for a given container file (aka Dockerfile);\n* Build container images on-demand based on one or more Conda packages;\n* Build container images on-demand based on one or more CRAN/R packages;\n* Build container images for a specified target platform (currently linux/amd64 and linux/arm64);\n* Push and cache built containers to a user-provided container repository;\n* Build Singularity native containers both using a Singularity spec file, Conda package(s), or CRAN package(s);\n* Push Singularity native container images to OCI-compliant registries;\n* Scan container images for security vulnerabilities\n\n### How it works\n\nContainer provisioning requests are submitted via the endpoint `POST /container-token` specifying the target\ncontainer image or container file. The endpoint return the container name provisioned by Wave that can be accessed\nby a regular Docker client or any other container client compliant via [Docker registry v2 API](https://docs.docker.com/registry/spec/api/).\n\nWhen a disposable container is requested, Wave acts as a proxy server between the Docker client and the target container\nregistry. It instruments the container manifest, adding on-demand the new layers specified in the user submitted request.\nThen the *pull* flow is managed by Docker client as in any other container, the base image layers are downloaded from the\ncontainer registry where the image is stored, while the instrumented layers are downloaded via the Wave service.\n\n\n### Requirements\n\n* Java 21 or later\n* Linux or macOS\n* Redis 6.2 (or later)\n* Docker engine (for development)\n* Kubernetes cluster (for production)\n\n### Get started\n\n1.  Clone the Wave repository from GitHub:\n\n    ```bash\n    git clone https://github.com/seqeralabs/wave \u0026\u0026 cd wave\n    ```\n\n2. Define one of more of those environment variable pairs depending the target registry you need to access:\n\n    ```bash\n    export DOCKER_USER=\"\u003cDocker registry user name\u003e\"\n    export DOCKER_PAT=\"\u003cDocker registry access token or password\u003e\"\n    export QUAY_USER=\"\u003cQuay.io registry user name or password\u003e\"\n    export QUAY_PAT=\"\u003cQuay.io registry access token\u003e\"\n    export AWS_ACCESS_KEY_ID=\"\u003cAWS ECR registry access key\u003e\"\n    export AWS_SECRET_ACCESS_KEY=\"\u003cAWS ECR registry secret key\u003e\"\n    export AZURECR_USER=\"\u003cAzure registry user name\u003e\"\n    export AZURECR_PAT=\"\u003cAzure registry access token or password\u003e\"\n    ```\n\n3.  Setup a [local tunnel](https://github.com/localtunnel/localtunnel) to make the Wave service accessible to the Docker client (only needed if you are running on macOS):\n\n    ```bash\n    npx localtunnel --port 9090\n    ```\n\n    Then configure in your environment the following variable using the domain name return by Local tunnel, e.g.\n\n    ```bash\n    export WAVE_SERVER_URL=\"https://sweet-nights-report.loca.lt\"\n    ```\n\n4. Run the service in your computer:\n\n    ```\n    bash run.sh\n    ```\n\n4.  Submit a container request to the Wave service using the `curl` tool\n\n    ```bash\n    curl \\\n        -H \"Content-Type: application/json\" \\\n        -X POST $WAVE_SERVER_URL/container-token \\\n        -d '{\"containerImage\":\"ubuntu:latest\"}' \\\n        | jq -r .targetImage\n    ```\n\n5. Pull the container image using the name returned in the previous command, for example\n\n    ```bash\n    docker pull sweet-nights-report.loca.lt/wt/617e7da1b37a/library/ubuntu:latest\n    ```\n\n\n\u003e **Note**\n\u003e You can use the [Wave](https://github.com/seqeralabs/wave-cli) command line tool instead of `curl` to interact with\n\u003e the Wave service and submit more complex requests.\n\n## Debugging\n\n-   To debug http requests made proxy client add the following Jvm setting:\n\n    ```bash\n    '-Djdk.httpclient.HttpClient.log=requests,headers'\n    ```\n\n## TypeSpec API Specifications\n\n- You can find the API specifications using (typespec)[https://github.com/microsoft/typespec] in typespec directory. Use following command to generate the API specifications.\n\n    ```bash\n    'cd typespec'\n    'tsp install'\n    'tsp compile .'\n    ```\n\n- Check `typespec/tsp-output` directory for the generated API specifications.\n\n## Related links\n* [Wave command line tool](https://github.com/seqeralabs/wave-cli)\n* [Distribution (formerly Registry) API](https://distribution.github.io/distribution/spec/api/)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseqeralabs%2Fwave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseqeralabs%2Fwave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseqeralabs%2Fwave/lists"}