{"id":35315317,"url":"https://github.com/hytromo/mimosa","last_synced_at":"2026-01-26T09:03:06.312Z","repository":{"id":310012215,"uuid":"1024828534","full_name":"hytromo/mimosa","owner":"hytromo","description":"Zero-config docker image promotion","archived":false,"fork":false,"pushed_at":"2026-01-23T08:01:01.000Z","size":6075,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-24T00:40:50.011Z","etag":null,"topics":["build-automation","build-optimization","buildkit","buildx","caching","ci-cd","container","container-registry","devops","docker","docker-build","github-actions","image-promotion","mimosa"],"latest_commit_sha":null,"homepage":"https://github.com/hytromo/mimosa","language":"Go","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/hytromo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-23T10:01:07.000Z","updated_at":"2026-01-12T19:34:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"173f06cb-9572-434b-ba95-2e1db2c270db","html_url":"https://github.com/hytromo/mimosa","commit_stats":null,"previous_names":["hytromo/mimosa"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/hytromo/mimosa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytromo%2Fmimosa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytromo%2Fmimosa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytromo%2Fmimosa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytromo%2Fmimosa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hytromo","download_url":"https://codeload.github.com/hytromo/mimosa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hytromo%2Fmimosa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28771517,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T08:38:24.014Z","status":"ssl_error","status_checked_at":"2026-01-26T08:38:22.080Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["build-automation","build-optimization","buildkit","buildx","caching","ci-cd","container","container-registry","devops","docker","docker-build","github-actions","image-promotion","mimosa"],"created_at":"2025-12-30T18:29:08.724Z","updated_at":"2026-01-26T09:03:06.307Z","avatar_url":"https://github.com/hytromo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e\u003ca href=\"https://github.com/hytromo/mimosa\"\u003e\n      \u003cimg src=\"./logo.webp\" alt=\"mimosa-logo\" height=\"300\" /\u003e\u003cbr /\u003e\n      mimosa\n    \u003c/a\u003e\u003c/h1\u003e\n\n  \u003ca href=\"https://github.com/hytromo/mimosa/releases\"\u003e\u003cimg alt=\"Github Releases\"\n      src=\"https://img.shields.io/badge/dynamic/json?url=https://api.github.com/repos/hytromo/mimosa/releases\u0026query=$.0.name\u0026style=for-the-badge\u0026logo=go\u0026label=mimosa\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/hytromo/mimosa/blob/main/LICENSE\"\u003e\u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/hytromo/mimosa?color=%2344CC11\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/hytromo/mimosa/actions/workflows/main.yml\"\u003e\u003cimg alt=\"GitHub Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/hytromo/mimosa/main.yml?style=for-the-badge\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://app.codecov.io/gh/hytromo/mimosa/\"\u003e\u003cimg alt=\"Code coverage\" src=\"https://img.shields.io/codecov/c/github/hytromo/mimosa/main?style=for-the-badge\u0026logo=codecov\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/hytromo/mimosa/stargazers\"\u003e\u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/hytromo/mimosa?style=for-the-badge\"\u003e\u003c/a\u003e\n  \u003cp\u003e\u003cem\u003eZero-config Docker image promotion\u003c/em\u003e\u003c/p\u003e\n\n\u003c/div\u003e\n\n\u003e [!WARNING]\n\u003e While `mimosa` has an extensive testing suite, it hasn't yet been heavily tested in production. If you find a bug, please [open an issue](https://github.com/hytromo/mimosa/issues/new). Caution is advised for production usage.\n\n# What does it do\n\n* **No more wasteful docker builds** - you don't have to wait for CI to finish just because of a tiny change in the README - the README doesn't even end up inside the docker image!\n* **Image promotion - for free** - you've tested your changes in a branch, so why should you wait for `main`/`master` to rebuild, and also risk producing a different image? Use Mimosa and skip straight to deployment.\n\n# How does it do it\n\nJust prepend your docker build commands like this: `mimosa remember -- docker buildx build ...` and Mimosa makes sure you don't run the same build twice. If you've run the same build before, it reaches out to your container registry and retags the previously built image instead.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"800\" src=\"./example.svg\"\u003e\n\u003c/p\u003e\n\n\n* It calculates a unique hash based on your docker command, build context, and your `Dockerfile`/`.dockerignore` files.  \n* It saves the hash as a tag to your remote registry.  \n* If it calculates the same hash in the future, it simply retags the already built image instead of rebuilding.  \n* All without downloading or reuploading the image - that's what makes it fast.  \n* If it hasn't seen the hash before, it builds the image as normal - no tricks. The hash is then saved as a tag for future use.\n* Falls back to normal command execution in case of any errors.\n\n# Key Features\n\n- **Seamless docker Integration:**  \n  Mimosa wraps standard `docker buildx build/bake` commands. You use it by passing the same arguments you would to Docker.\n\n- **Automatic Context and Dockerfile Detection:**  \n  Mimosa automatically detects the build context, Dockerfile, bakefile and `.dockerignore` (including custom-named dockerignore files). It accounts for exactly what's needed to ensure that your build gets a unique cache key. It ignores all files specified in your `.dockerignore`, so a well-maintained `.dockerignore` makes all the difference.\n\n- **Seamless Integration with GitHub Actions:**  \n  `mimosa` works seamlessly with GitHub Actions - just replace `docker/build-push-action` with `hytromo/mimosa/gh/build-push-action`.\n\n# Installation\n\n## Inside GitHub Actions\n\nJust replace your `docker/build-push-action` with `hytromo/mimosa/gh/build-push-action` in your GitHub Actions workflow.\n\n```yaml\n  - uses: hytromo/mimosa/gh/build-push-action@v6-build-push\n    with:\n      platforms: linux/amd64,linux/arm64\n      push: \"true\"\n      tags: my-org/my-image:${{ github.sha }}\n      context: .\n```\n\nSee the [GitHub Action docs](./docs/gh-actions/README.md) for details on how to use `mimosa` in your GitHub Actions.\n\n## On your system\n\nPre-built binaries are available on the [Releases page](https://github.com/hytromo/mimosa/releases). Download the appropriate binary for your platform and add it to your `PATH`.\n\n# CLI usage\n\n## Remember\n\n```sh\n# do a typical docker buildx build/bake\nmimosa remember -- docker buildx build --build-arg MYARG=MYVALUE --platform linux/amd64,linux/arm64 --push -t hytromo/mimosa-example:v1 .\n\n# Now change something that should not influence the build result:\nmimosa remember -- docker buildx build --build-arg MYARG=MYVALUE --platform linux/amd64,linux/arm64 --push -t hytromo/mimosa-example:v2 .\n\n# ... mimosa understands that nothing important has changed, so it just makes v2 point to v1 - they are the same image - no build happens!\n\n# Docker Bake support - cache multiple targets and tags\nmimosa remember -- docker buildx bake -f docker-bake.hcl\n\n# dry run - do not build or retag, just show what would happen\nmimosa remember --dry-run -- docker buildx build --build-arg MYARG=MYVALUE --platform linux/amd64,linux/arm64 --push -t hytromo/mimosa-example:v2 .\n```\n\n* The `remember` subcommand tells Mimosa to retag the image, if the same build has been run before, otherwise to run the build and save the hash as a tag.\n* The rest of the command is exactly what you'd pass to `docker buildx build/bake`.\n\n## Shell completion\n\nEnable completion for all the popular shells, by following the information under the `completion` command:\n\n```bash\nmimosa completion --help\nmimosa completion zsh --help\nmimosa completion \u003cyour-shell\u003e --help\n``` \n\n## Advanced usage\n\n### Log level\n\nYou can use the `LOG_LEVEL` env variable to control the log level, use `LOG_LEVEL=debug` for debug logging. Alternatively you can pass the `--debug` flag on every command.\n\n# FAQ\n\n## What about multi-platform builds?\n\nMimosa supports multi-platform builds. It looks into the existing docker image's index manifests and makes the new tag point to the same ones - no matter how many or which they are.\n\n## What about custom build contexts?\n\nMimosa analyzes the docker command and understands what your build context is, whether it's `.` or something else.\n\n## What about remote URLs as build context?\n\nMimosa does not support remote URLs (e.g., Git repositories or tarballs) as build context. If you use a remote URL, Mimosa will fall back to running the docker command normally without saving the hash.\n\n## How does it work for multiple targets in a bakefile?\n\nIf you are using `docker buildx bake`, a single hash is calculated for the whole build - with this hash the generated tag(s) are saved for each target separately.\n\nThis means practically that if a single target changes, the whole build is invalidated and all the targets need to be rebuilt. This is a design decision, because `mimosa` is not a build tool - it doesn't decide how to build the targets - so building some of the targets itself while retagging others is out of the scope of this application. To make things more complex, [targets can depend on each other](https://docs.docker.com/build/bake/contexts/#using-a-target-as-a-build-context) - so it is the safe choice to invalidate the whole build.\n\n## What about custom Dockerfile locations?\n\nIf you specify `-f` / `--file`, it will use that file instead of the default `Dockerfile`.\n\n## What about custom `.dockerignore` files?\n\n`\u003cDockerfile name\u003e.dockerignore` takes precedence over `.dockerignore` ([docs](https://docs.docker.com/build/concepts/context/#dockerignore-files)) - Mimosa knows these rules.\n\n## Can I use normal docker build commands?\n\nMimosa is not tested with `docker build` commands and it is recommended to use `docker buildx build`/`docker buildx bake` commands with the `--push` flag.\n\n## Yet another way for my build to fail?\n\nMimosa takes all the possible precautions to just run the provided command if it fails to calculate the hash, or has any other kind of issue.\nIn fact, it is so permissive that it can run any command - freely:\n```bash\n# it will detect that this is not a docker command, and it will just run it, even respecting its exit code\nmimosa remember -- echo I am run via mimosa\n```\n\nMimosa will also always respect the exit code of the docker command and will exit with the same code, so you can rest assured that any custom scripts or behaviors will continue working as expected.\n\n## What's up with the name?\n\n*Mimosa pudica* is a plant that closes its leaves on touch to protect itself.\n\nIf the plant is repeatedly exposed to a non-harmful stimulus, such as a gentle touch or a repeated drop that doesn't cause actual damage, it will eventually stop responding. This phenomenon is called habituation, which is considered the simplest form of learning. The plant \"learns\" that the repeated disturbance is not a threat and thus doesn't need to expend energy on closing its leaves.\n\n# Contributing\n\nRead [CONTRIBUTING.md](./CONTRIBUTING.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhytromo%2Fmimosa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhytromo%2Fmimosa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhytromo%2Fmimosa/lists"}