{"id":14155249,"url":"https://github.com/Giftora/dynamic-docker-compose","last_synced_at":"2025-08-06T01:30:52.205Z","repository":{"id":57217664,"uuid":"423567535","full_name":"Giftora/dynamic-docker-compose","owner":"Giftora","description":"Nodejs docker compose class with yaml merging.","archived":false,"fork":false,"pushed_at":"2022-03-29T03:39:31.000Z","size":344,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-15T00:14:19.672Z","etag":null,"topics":["class","deepmerge","docker","docker-compose","javascript","js-yaml","node","nodejs","yaml","yaml-parser"],"latest_commit_sha":null,"homepage":"https://giftora.github.io/dynamic-docker-compose","language":"JavaScript","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/Giftora.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":"2021-11-01T18:06:54.000Z","updated_at":"2024-03-03T00:04:41.000Z","dependencies_parsed_at":"2022-08-28T21:41:27.612Z","dependency_job_id":null,"html_url":"https://github.com/Giftora/dynamic-docker-compose","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giftora%2Fdynamic-docker-compose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giftora%2Fdynamic-docker-compose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giftora%2Fdynamic-docker-compose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Giftora%2Fdynamic-docker-compose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Giftora","download_url":"https://codeload.github.com/Giftora/dynamic-docker-compose/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228821400,"owners_count":17977165,"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","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":["class","deepmerge","docker","docker-compose","javascript","js-yaml","node","nodejs","yaml","yaml-parser"],"created_at":"2024-08-17T08:02:35.126Z","updated_at":"2024-12-09T02:31:13.710Z","avatar_url":"https://github.com/Giftora.png","language":"JavaScript","funding_links":[],"categories":["yaml"],"sub_categories":[],"readme":"NPM package\nhttps://www.npmjs.com/package/dynamic-docker-compose\n\n# dynamic-docker-compose\nNodejs docker-compose class.  \nLoads one or more docker-compose files and parses the yaml contained within.  \nWhen more than one file is supplyed the contents are merged on like keys.\nYaml parsing is done with [js-yaml](https://www.npmjs.com/package/js-yaml).\nObject merging preformed by [deepmerge](https://www.npmjs.com/package/deepmerge)\n\n\n# Usage [jsdocs](https://giftora.github.io/dynamic-docker-compose/)\nCreate an instance of the class like so.\n```javascript\nimport DockerComposeFile from 'dynamic-docker-compose';\nconst composeFile = new DockerComposeFile(`${__dirname}/docker-compose.yml`);\n// or \nconst yamlString = \n`\nnetworks:\n  proxy:\n    driver: bridge\nservices:\n  vpn:\n    cap_add:\n      - NET_ADMIN\n    container_name: vpn\n    environment:\n      - REGION\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\nversion: '3'\n`;\nconst composeFile = new DockerComposeFile(yamlString);\n```\n\nAfter you have created an instance of DockerComposeFile you can modify the YAML object using [js-yaml](https://www.npmjs.com/package/js-yaml).  \n\nMultiple files can be passed to the constructor \n```javascript\nimport DockerComposeFile from 'dynamic-docker-compose';\nconst composeFile = new DockerComposeFile(\n  `${__dirname}/docker-compose1.yml`, \n  `${__dirname}/docker-compose2.yml`\n);\n```  \n## Merging\nThe contents are merged on like keys.  \n\nYaml version file.  \n```yaml\n# version.docker-compose.yml\nversion: '3'\n```\n\nYaml network file.  \n```yaml\n# network.docker-compose.yml\nnetworks:\n  proxy:\n    driver: bridge\n```\n\nVpn service yaml file.\n```yaml\n# vpn.docker-compose.yml\nservices:\n  vpn:\n    cap_add:\n      - NET_ADMIN\n    container_name: vpn\n    environment:\n      - REGION\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\n```\n\nNodejs service yaml file.\n```yaml\n# node-server.docker-compose.yml\nservices:\n  node-server:\n    container_name: node-server\n    image: node\n    networks:\n      - proxy\n    restart: always\n```\n\n\n```javascript\nimport DockerComposeFile from 'dynamic-docker-compose';\nconst composeFile = new DockerComposeFile(\n  `version.docker-compose.yml`, \n  `network.docker-compose.yml`,\n  `vpn.docker-compose.yml`,\n  `node-server.docker-compose.yml`\n);\n```  \n\nOutputing \n```javascript\ncomposeFile.yaml;\n```  \nwill result in the following merged yaml file.\n```yaml\n# node-server.docker-compose.yml\nnetworks:\n  proxy:\n    driver: bridge\nservices:\n  node-server:\n    container_name: node-server\n    image: node\n    networks:\n      - proxy\n    restart: always\n  vpn:\n    cap_add:\n      - NET_ADMIN\n    container_name: vpn\n    environment:\n      - REGION\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\nversion: '3'\n```\n\n## Mapping \nDockerComposeFile can be mapped When template strings exist in the yaml file.  \nTemplate strings are in `${TEMPLATE_STRING}` format.\n\n```yaml\n# vpn.docker-compose.yml\nservices:\n  ${VPN_NAME}:\n    cap_add:\n      - NET_ADMIN\n    container_name: ${VPN_NAME}\n    environment:\n      - REGION=${REGION}\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\n```\n\n```javascript\nconst composeFileTemplate = new DockerComposeFile(`vpn.docker-compose.yml`);\nconst composeFiles = composeFileTemplate.mapTemplate(\n  ['VPN_NAME', ['vpn-west', 'vpn-seattle']],\n  ['REGION', ['US_West', 'US_Seattle']],\n);\n```\n\nThis would create two DockerComposeFile instances.\n```yaml\n# vpn.docker-compose.yml\nservices:\n  vpn-west:\n    cap_add:\n      - NET_ADMIN\n    container_name: vpn-west\n    environment:\n      - REGION=US_West\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\n```\n```yaml\n# vpn.docker-compose.yml\nservices:\n  vpn-seattle:\n    cap_add:\n      - NET_ADMIN\n    container_name: vpn-seattle\n    environment:\n      - REGION=US_Seattle\n      - OPENVPN_USER\n      - VPNSP\n    image: vpn\n    networks:\n      - proxy\n    restart: always\n    volumes:\n      - ./vpn/volumes/gluton/:/gluetun\n      - ./data:/data\n```\n\nThose files can be merged afterwards by passing them to a new DockerComposeFile.\n\n```javascript\nconst composeFileTemplate = new DockerComposeFile(`vpn.docker-compose.yml`);\nconst composeFiles = composeFileTemplate.mapTemplate(\n  ['VPN_NAME', ['vpn-west', 'vpn-seattle']],\n  ['REGION', ['US_West', 'US_Seattle']],\n);\nconst mergedMap = new DockerComposeFile(...composeFiles);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGiftora%2Fdynamic-docker-compose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGiftora%2Fdynamic-docker-compose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGiftora%2Fdynamic-docker-compose/lists"}