{"id":31629774,"url":"https://github.com/katenary/katenary","last_synced_at":"2025-10-06T21:55:54.448Z","repository":{"id":37707201,"uuid":"460349991","full_name":"Katenary/katenary","owner":"Katenary","description":"Convert docker and podamn compose to a configurable helm chart","archived":false,"fork":false,"pushed_at":"2025-10-03T17:50:30.000Z","size":1302,"stargazers_count":193,"open_issues_count":0,"forks_count":13,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-10-03T19:31:43.673Z","etag":null,"topics":["compose","docker","docker-compose","helm","helm-chart","kubernetes","podman"],"latest_commit_sha":null,"homepage":"https://katenary.io","language":"Go","has_issues":false,"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/Katenary.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,"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":"2022-02-17T08:41:58.000Z","updated_at":"2025-10-03T17:50:34.000Z","dependencies_parsed_at":"2024-10-24T19:43:12.470Z","dependency_job_id":"fd153831-d670-4a90-98af-ee5d1f6ac223","html_url":"https://github.com/Katenary/katenary","commit_stats":null,"previous_names":["katenary/katenary"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/Katenary/katenary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Katenary%2Fkatenary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Katenary%2Fkatenary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Katenary%2Fkatenary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Katenary%2Fkatenary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Katenary","download_url":"https://codeload.github.com/Katenary/katenary/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Katenary%2Fkatenary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278686634,"owners_count":26028325,"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-10-06T02:00:05.630Z","response_time":65,"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":["compose","docker","docker-compose","helm","helm-chart","kubernetes","podman"],"created_at":"2025-10-06T21:55:50.451Z","updated_at":"2025-10-06T21:55:54.434Z","avatar_url":"https://github.com/Katenary.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e **⚠️ Project has moved !⚠️**\n\u003e\n\u003e **Project moved to https://repo.katenary.io/katenary/katenary**\n\u003e\n\u003e Please, update your bookmaks. Discussion about the move is here : https://github.com/orgs/Katenary/discussions/162\n\u003cdiv style=\"text-align:center; margin: auto 0 4em 0\" align=\"center\"\u003e\n\u003cimg src=\"./doc/docs/statics/logo-vertical.svg\" alt=\"Katenary Logo\" style=\"max-width: 90%\" align=\"center\"/\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"text-align:center; margin: auto 0 4em 0\" align=\"center\"\u003e\n\n[![Documentation Status](https://readthedocs.org/projects/katenary/badge/?version=latest)](https://katenary.readthedocs.io/latest/?badge=latest)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=katenary_katenary\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=katenary_katenary)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=katenary_katenary\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=katenary_katenary)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=katenary_katenary\u0026metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=katenary_katenary)\n\n\u003c/div\u003e\n\n\u003cdiv style=\"text-align:center; margin: auto 0 4em 0\" align=\"center\"\u003e\n\u003ch3\u003e🚀 Unleash Productivity with Katenary! 🚀\u003c/h3\u003e\n\u003c/div\u003e\n\nTired of manual conversions? Katenary harnesses the labels from your \"`compose`\" file to craft complete Helm Charts\neffortlessly, saving you time and energy.\n\n🛠️ Simple automated CLI: Katenary handles the grunt work, generating everything needed for seamless service binding\nand Helm Chart creation.\n\n💡 Effortless Efficiency: You only need to add labels when it's necessary to precise things.\nThen call `katenary convert` and let the magic happen.\n\n## What ?\n\nKatenary is a tool to help to transform `compose` (`docker compose`, `podman compose`, `nerdctl compose`, ...) files\nto a working Helm Chart for Kubernetes.\n\nToday, it's partially developed in collaboration with [Klee Group](https://www.kleegroup.com). Note that Katenary is\nand **will stay an open source and free (as freedom) project**. We are convinced that the best way to make it better is to\nshare it with the community.\n\nThe main developer is [Patrice FERLET](https://repo.katenary.io/metal3d).\n\n## Install\n\n### Package from repository and Windows installer\n\nYou can find Linux packages repository and Windows installer in the [packages page](https://repo.katenary.io/Katenary/katenary/packages).\n\n\u003e Note for Fedora \u003e= 42, the repository instructions are not up-to-date. You should use:\n\u003e\n\u003e ```bash\n\u003e dnf config-manager addrepo \\\n\u003e   --from-repofile https://repo.katenary.io/Katenary/katenary/fedora/katenary.repo\n\u003e dnf install katenary\n\u003e ```\n\n- Windows users, go to the \"generic\" packages page, and download the `setup.exe` file.\n- macOS users, please use the \"`darwin`\" binary. An experimental package is in preparation.\n- FreedBSD users, please use the \"`freebsd`\" package in \"generic\" packages page.\n\n### Binary installation\n\nYou can download the binaries from the [Release](https://repo.katenary.io/Katenary/katenary/releases) section. Copy the binary\nand rename it to `katenary`. Place the binary inside your `PATH`. You should now be able to call the `katenary` command.\n\nOn Linux, you can use the `install.sh` from the repository to install it in your `$HOME/.local/bin` directory:\n\n```bash\nsh \u003c(curl -sSL https://repo.katenary.io/Katenary/katenary/raw/branch/master/install.sh)\n```\n\nAll OS, if you've installed Go on your computer, you can install using:\n\n```bash\ngo install -u katenary.io/cmd@latest\n# or use a release\ngo install -u katenary.io/cmd@v3.0.0\n```\n\n### Or, build yourself\n\nIf you've got `podman` or `docker`, you can build `katenary` by using:\n\n```bash\nmake build\n```\n\nYou can then install it with:\n\n```bash\nmake install\n```\n\nIt will use the default PREFIX (`~/.local/`) to install the binary in the `bin` subdirectory. You can force the PREFIX\nvalue at install time, but maybe you need to use \"`sudo`\":\n\n```bash\nsudo make install PREFIX=/usr/local\n```\n\nIf that goes wrong, you can use your local Go compiler:\n\n```bash\nmake build GO=local\n\n# To force OS or architecture\nmake build GO=local GOOS=linux GOARCH=arm64\n```\n\nThen place the `katenary` binary file inside your PATH.\n\n## Tips\n\nWe strongly recommend adding the completion call to you SHELL using the common `bashrc`, or whatever the profile file\nyou use.\n\nE.g.,\n\n```bash\n# bash in ~/.bashrc file\nsource \u003c(katenary completion bash)\n# if the documentation breaks a bit your completion:\nsource \u003c(katenary completion bash --no-description)\n\n# zsh in ~/.zshrc\nsource \u003c(katenary completion zsh)\n\n# fish in ~/.config/fish/config.fish\nkatenary completion fish | source\n\n# experimental\n# powershell (as we don't provide any support on Windows yet, please avoid this...)\n```\n\n## Usage\n\n```text\n\nKatenary is a tool to convert compose files to Helm Charts.\n\nEach [command] and subcommand has got an \"help\" and \"--help\" flag to show more information.\n\nUsage:\n  katenary [command]\n\nExamples:\n  katenary convert -c docker-compose.yml -o ./charts\n\nAvailable Commands:\n  completion        Generates completion scripts\n  convert           Converts a docker-compose file to a Helm Chart\n  hash-composefiles Print the hash of the composefiles\n  help              Help about any command\n  help-labels       Print the labels help for all or a specific label\n  schema            Print the schema of the katenary file\n  version           Print the version number of Katenary\n\nFlags:\n  -h, --help      help for katenary\n  -v, --version   version for katenary\n\nUse \"katenary [command] --help\" for more information about a command.\n```\n\nKatenary will try to find a `docker-compose.yaml` or `docker-compose.yml` file inside the current directory. It will\ncheck \\*the existence of the `chart` directory to create a new Helm Chart inside a named subdirectory. Katenary will ask\nyou if you want to delete it before recreating.\n\nIt creates a subdirectory inside `chart` that is named with the `appname` option (default is `MyApp`)\n\n\u003e To respect the ability to install the same application in the same namespace, Katenary will create variable names\n\u003e like `{{ .Release.Name }}-servicename`. So, you will need to use some labels inside your docker-compose file to help\n\u003e Katenary to build a correct helm chart.\n\nExample of a possible `docker-compose.yaml` file:\n\n```yaml\nservices:\n    webapp:\n        image: php:7-apache\n        environment:\n            # note that \"database\" is a \"compose\" service name\n            # so we need to adapt it with the map-env label\n            DB_HOST: database\n            # a pitty to repeat this values, isn't it?\n            # so, let's change them with \"values-from\" label\n            DB_USER: foo\n            DB_PASSWORD: bar\n        expose:\n            - 80\n        depends_on:\n            # this will create a init container waiting for 3306 port\n            # because it's the \"exposed\" port\n            - database\n        labels:\n            # expose the port 80 as an ingress\n            katenary.v3/ingress: |-\n                hostname: myapp.example.com\n                port: 80\n            # make adaptations, DB_HOST environment is actually the service name\n            katenary.v3/map-env: |-\n                DB_HOST: '{{ .Release.Name }}-database'\n            # get the values from the \"database\" service\n            # this will use the database secrets and environment,\n            # see the \"database\" service to see the values\n            katenary.v3/values-from: |-\n                DB_USER: database.MARIADB_USER\n                DB_PASSWORD: database.MARIADB_PASSWORD\n\n    database:\n        image: mariadb:10\n        env_file:\n            # this values will be added in a configMap\n            - my_env.env\n        environment:\n            MARIADB_USER: foo\n            MARIADB_ROOT_PASSWORD: foobar\n            MARIADB_PASSWORD: bar\n        labels:\n            # no need to declare this port in docker-compose\n            # but katenary will need it\n            katenary.v3/ports: |-\n                - 3306\n            # these variables are secrets\n            katenary.v3/secrets: |-\n                - MARIADB_ROOT_PASSWORD\n                - MARIADB_PASSWORD\n```\n\n## Labels\n\nThese labels could be found by `katenary help-labels`, and can be placed as labels inside your docker-compose file:\n\n```text\nTo get more information about a label, use `katenary help-label \u003cname_without_prefix\u003e\ne.g. katenary help-label dependencies\n\nkatenary.v3/configmap-files:\t[]string\t\t\tInject files as Configmap.\nkatenary.v3/cronjob:\t\tobject\t\t\t\tCreate a cronjob from the service.\nkatenary.v3/dependencies:\t[]object\t\t\tAdd Helm dependencies to the service.\nkatenary.v3/description:\tstring\t\t\t\tDescription of the service\nkatenary.v3/env-from:\t\t[]string\t\t\tAdd environment variables from another service.\nkatenary.v3/exchange-volumes:\t[]object\t\t\tAdd exchange volumes (empty directory on the node) to share data\nkatenary.v3/health-check:\tobject\t\t\t\tHealth check to be added to the deployment.\nkatenary.v3/ignore:\t\tbool\t\t\t\tIgnore the service\nkatenary.v3/ingress:\t\tobject\t\t\t\tIngress rules to be added to the service.\nkatenary.v3/main-app:\t\tbool\t\t\t\tMark the service as the main app.\nkatenary.v3/map-env:\t\tmap[string]string\t\tMap env vars from the service to the deployment.\nkatenary.v3/ports:\t\t[]uint32\t\t\tPorts to be added to the service.\nkatenary.v3/same-pod:\t\tstring\t\t\t\tMove the same-pod deployment to the target deployment.\nkatenary.v3/secrets:\t\t[]string\t\t\tEnv vars to be set as secrets.\nkatenary.v3/values:\t\t[]string or map[string]string\tEnvironment variables to be added to the values.yaml\nkatenary.v3/values-from:\tmap[string]string\t\tAdd values from another service.\n```\n\n## Katenary.yaml file and schema validation\n\nInstead of using labels inside the docker-compose file, you can use a `katenary.yaml` file to define the labels. This\nfile is simpler to read and maintain, but you need to keep it up-to-date with the docker-compose file.\n\nFor example, instead of using this:\n\n```yaml\nservices:\n    web:\n        image: nginx:latest\n        katenary.v3/ingress: |-\n            hostname: myapp.example.com\n            port: 80\n```\n\nYou can remove the labels, and use a `katenary.yaml` file:\n\n```yaml\nweb:\n    ingress:\n        hostname: myapp.example.com\n        port: 80\n```\n\nTo validate the `katenary.yaml` file, you can use the JSON schema using the \"master\" raw content:\n\n`https://repo.katenary.io/Katenary/katenary/raw/branch/master/katenary.json`\n\nIt's easy to configure in [LazyVim](https://www.lazyvim.org/), using `nvim-lspconfig`,\ncreate a Lua file in your `plugins` directory, or apply the settings as the example below:\n\n```lua\n-- yaml.lua\n\nreturn {\n  {\n    \"neovim/nvim-lspconfig\",\n    opts = {\n      servers = {\n        yamlls = {\n          settings = {\n            yaml = {\n              schemas = {\n                [\"https://repo.katenary.io/Katenary/katenary/raw/branch/master/katenary.json\"] = \"katenary.yaml\",\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n}\n```\n\nUse this address to validate the `katenary.yaml` file in VSCode:\n\n```json\n{\n    \"yaml.schemas\": {\n        \"https://repo.katenary.io/Katenary/katenary/raw/branch/master/katenary.json\": \"katenary.yaml\"\n    }\n}\n```\n\n\u003e You can, of course, replace the `master` with a specific tag or branch.\n\n## What a name…\n\nKatenary is the stylized name of the project that comes from the \"catenary\" word.\n\nA catenary is a curve formed by a wire, rope, or chain hanging freely from two points that are not in the same vertical\nline. For example, the anchor chain between a boat and the anchor.\n\nThis curved link represents what we try to do, the project is a stretched link from docker-compose to helm chart.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkatenary%2Fkatenary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkatenary%2Fkatenary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkatenary%2Fkatenary/lists"}