cmd | ||
pkg | ||
test/assets | ||
.dockerignore | ||
.drone.yml | ||
.gitignore | ||
.markdownlint.yaml | ||
Dockerfile | ||
go.mod | ||
go.sum | ||
LICENSE | ||
main.go | ||
Makefile | ||
manifest.tmpl | ||
README.md | ||
renovate.json |
dcmerge
dcmerge
is a small program to merge docker-compose files from multiple
sources. It is available via RPM and docker.
The dynamic pattern of a docker-compose file, that for example environments
can be specified as a string slice or a list of objects is currently not
supported. dcmerge
expect a strict pattern layout. The environments
, ports
and volumes
must be declared as a slice of strings.
Dockercompose file can be read-in from different sources. Currently are the following sources supported:
- File
- HTTP/HTTPS
Furthermore, dcmerge
support different ways to merge multiple docker-compose
files.
- The default merge, add missing secrets, services, networks and volumes.
- The existing-win merge, add and protect existing attributes.
- The last-win merge, add or overwrite existing attributes.
default
Merge only missing secrets, services, networks and volumes without respecting
their attributes. For example, when the service app
is already declared, it is
not possible to add the service app
twice. The second service will be
completely skipped.
---
# cat ~/docker-compose-A.yaml
services:
app:
environments:
- CLIENT_SECRET=HelloWorld123
image: example.local/app/name:0.1.0
---
# cat ~/docker-compose-B.yaml
services:
app:
image: app/name:2.3.0
volume:
- /etc/localtime:/etc/localtime
- /dev/urandom:/etc/urandom
db:
image: postgres
volume:
- /etc/localtime:/etc/localtime
- /dev/urandom:/etc/urandom
---
# dcmerge ~/docker-compose-A.yaml ~/docker-compose-B.yaml
services:
app:
environments:
- CLIENT_SECRET=HelloWorld123
image: example.local/app/name:0.1.0
db:
image: postgres
volume:
- /etc/localtime:/etc/localtime
- /dev/urandom:/etc/urandom
existing-win
The existing-win merge protects existing attributes. For example there are two
different docker-compose files, but booth has the same environment variable
CLIENT_SECRET
defined with different values. The first declaration of the
attribute wins and is for overwriting protected.
---
# cat ~/docker-compose-A.yaml
services:
app:
environments:
- CLIENT_SECRET=HelloWorld123
image: example.local/app/name:0.1.0
---
# cat ~/docker-compose-B.yaml
services:
app:
environments:
- CLIENT_SECRET=FooBar123
image: example.local/app/name:0.1.0
---
# dcmerge --existing-win ~/docker-compose-A.yaml ~/docker-compose-B.yaml
services:
app:
environments:
- CLIENT_SECRET=HelloWorld123
image: example.local/app/name:0.1.0
last-win
The last-win merge overwrite recursive existing attributes. For example there
are two different docker-compose files, but booth has the same environment
variable CLIENT_SECRET
defined with different values. The last passed
docker-compose file which contains this environment wins.
---
# cat ~/docker-compose-A.yaml
services:
app:
environments:
- CLIENT_SECRET=HelloWorld123
image: example.local/app/name:0.1.0
---
# cat ~/docker-compose-B.yaml
services:
app:
environments:
- CLIENT_SECRET=FooBar123
image: example.local/app/name:0.1.0
---
# dcmerge --last-win ~/docker-compose-A.yaml ~/docker-compose-B.yaml
services:
app:
environments:
- CLIENT_SECRET=FooBar123
image: example.local/app/name:0.1.0