Those of us who use docker-compose to manage our fleets of containers generally fall into two camps. Camp A prefers one monolithic docker-compose file per host using
docker-compose <command> <service> to interact with each service. Camp B split up their configuration into multiple files with some kind of logical grouping which makes sense to them.
This post will provide an overview of using profiles with docker-compose to address multiple services within a monolithic file. This aims to provide all the advantages of Camp B's approach without the faff and hassle of changing directories or managing multiple compose files.
Take the following compose file:
version: "3.3" services: nginx1: image: nginx container_name: nginx1 profiles: - prod - test nginx2: image: nginx container_name: nginx2 profiles: - prod nginx3: image: nginx container_name: nginx3 profiles: - test
Using the profiles it's possible to put a single service into more than profile at once giving much more flexibility than multiple files as Camp B would typically do.
[email protected] tmp % docker-compose --profile test up -d [+] Running 2/2 ⠿ Container nginx3 Started 0.5s ⠿ Container nginx1 Started
As you can see above
nginx3 were both started because they are members of the profile
test. Profiles support all operations that you'd expect via compose and the full documentation can be found over in Docker's documentation.
Note that if you include a profile a simple
docker-compose up -d will fail:
[email protected] tmp % docker-compose up -d no service selected
These profiles aren't perfect and certainly have nuances you will need to become familiar with but they are quite promisingly useful.
A relatively short post this but after a discussion on the Self-Hosted discord server earlier the topic of monolith vs multiple smaller files came up. It occurred to me there must be a way to filter containers and this is what I found.
Hope you found this useful. Let me know if you use this in the real world!