{"id":29838043,"url":"https://github.com/pauleve/donodo","last_synced_at":"2025-07-29T13:18:29.643Z","repository":{"id":57423620,"uuid":"318124876","full_name":"pauleve/donodo","owner":"pauleve","description":"Bridging Docker images with Zenodo","archived":false,"fork":false,"pushed_at":"2020-12-08T12:15:53.000Z","size":48,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-03T03:48:28.722Z","etag":null,"topics":["docker","reproducibility","zenodo"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pauleve.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-03T08:27:18.000Z","updated_at":"2024-08-13T19:48:31.000Z","dependencies_parsed_at":"2022-08-30T03:11:41.229Z","dependency_job_id":null,"html_url":"https://github.com/pauleve/donodo","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/pauleve/donodo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pauleve%2Fdonodo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pauleve%2Fdonodo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pauleve%2Fdonodo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pauleve%2Fdonodo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pauleve","download_url":"https://codeload.github.com/pauleve/donodo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pauleve%2Fdonodo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267694088,"owners_count":24129139,"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-07-29T02:00:12.549Z","response_time":2574,"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":["docker","reproducibility","zenodo"],"created_at":"2025-07-29T13:18:25.597Z","updated_at":"2025-07-29T13:18:29.628Z","avatar_url":"https://github.com/pauleve.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![PyPI version](https://badge.fury.io/py/donodo.svg)](https://badge.fury.io/py/donodo)\n\n# donodo - Bridging Docker images with Zenodo\n\n## Installation\n\n```sh\npip install -U donodo\n```\n\n## Quick usage guide\n\n### Retrieve a Docker image from a Zenodo record\n```sh\ndonodo pull DOI\n```\nwhere `DOI` is the Zenodo DOI or link to the record.\n\n### Persistently store a Docker image on Zenodo\n\n```sh\n export ZENODO_TOKEN=your_Zenodo_API_token\ndonodo push your/image:tag\n```\n\nSee `donodo push -h` for options.\n\n### Zenodo sandbox\n\nUse `donodo --sandbox` to act on the sandbox https://sandbox.zenodo.org.\n\n## Documentation\n\n### `donodo pull`: import a Docker image from a Zenodo record\n\nThe `donodo pull` command takes as additional argument either a DOI, a DOI link, or a Zenodo record link.\n\nThe command looks by priority for (1) a file whose name starts with `image.tar` (2) a file whose name contains `.tar`.\nThe filename can ends with either `.tar` or `.tar.gz`.\n\nWhenever a single file is found, it will be downloaded and sent to the `docker load` command; otherwise an error is thrown.\n\nNote that the name and tag of the Docker image are specified within the image file. It will be displayed at the end of the process.\n\n### `donodo push`: export a Docker image as a permament Zenodo record\n\nThe `donodo push` commands takes as additional argument the name of the Docker image, including tag (which cannot be `latest`). The Docker image has to exist locally.\n\nThe command will create a new record with the title being by default `Docker image {image_name}`. If such a record already exists, it will create a new version of it with the tag of the Docker image.\nThus if you push several tags of the same image name, only a single record will be created, with different versions.\n\nThe Docker image is exported using the `docker save` command and compressed in a local temporary file. The file is then uploaded to the Zenodo record as `image.tar.gz`.\n\nOnce the draft record has been created, the command will display the link to the draft and ask whether to publish it.\nYou can modify the record from the webpage if necessary before answering the question. \nThe option `--auto-publish` skips this question and promptly publishes the image.\n\nOnce published, the command will display its DOI link.\n\n:warning: Once published, the image file cannot be deleted or modified. Note that, however, it remains possible to update the metadata and description of the record.\n\nThe `push` command requires a Zenodo API token, given in the `ZENODO_TOKEN` environment variable. You can create an API token at https://zenodo.org/account/settings/applications/ with the deposit:write and deposit:actions scopes.\n\n#### Customize the template of the deposition\n\nThe templates used to fill the fields of the Zenodo deposition are specified by the `deposition_templates` variable in [donodo/templates.py](https://github.com/pauleve/donodo/blob/main/donodo/templates.py).\nThe templates will be interpreted as Python [f-string](https://docs.python.org/3/reference/lexical_analysis.html#f-strings), and have access to the variable `image` which is a `DockerImage` object having the following fields:\n- `image.name` being the name of the Docker image\n- `image.tag` being the tag of the Docker image\n- `image.labels` being a dictionnary of the labels specified in the Docker image\n- `image.inspect` being the dictionnary as returned by the `docker inspect` command.\n\nThe templates can be overriden using a JSON file given with the option `--templates`.\n\nExample: `docker push --templates mytemplates.json my/image:v1`  with `mytemplates.json` being\n```json\n{\n \"creators\": [{\"name\":\"Smith, Jane\", \"affiliation\": \"My University\", \"orcid\": \"0000-0002-1694-233X\"}],\n \"keywords\": [\"docker image\", \"my topic\"]\n}\n```\nYou can specify any fields of a Zenodo deposition, following the specification at https://developers.zenodo.org/#representation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpauleve%2Fdonodo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpauleve%2Fdonodo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpauleve%2Fdonodo/lists"}