docker-remote-deployment-action icon indicating copy to clipboard operation
docker-remote-deployment-action copied to clipboard

Allow setting multiple docker-compose files

Open kasbah opened this issue 3 years ago • 4 comments

Hey, I needed to use multiple .yml files so I implemented this. It's been running successfully from this yaml.

It does change one behavior slightly. By default it now calls docker-compose without any -f arguments if stack_file_name is empty. So it's falling back to the docker-compose built-in defaults (which are docker-compose.yml extended by docker-compose.override.yml I recently learned). Hence I would suggest a major version bump if you decide to merge this.

kasbah avatar Apr 03 '21 19:04 kasbah

@kasbah Thanks for the PR. Before I merge and version bump, could you please explain why this approach is better than just calling the action twice? Since only deploying one compose per invocation keeps it simple.

What is your use case?

TapTap21 avatar Apr 06 '21 06:04 TapTap21

When you call it with multiple compose files they extend each other which allows you to redefine and extend some fields for development and production for instance.

By default docker-compose tries to use two files docker-compose.yml and docker-compose.override.yml (if it exists and you don't have any -f arguments -- which is what the breaking change on this pull request is about). We keep our base config in the docker-compose.yml, our development overrides in docker-compose.override.yml and then for deployement we have another file and call it like this: docker-compose -f docker-compose.yml -f docker-compose.deploy.yml.

Read more about how this works in the compose docs: https://docs.docker.com/compose/extends/

kasbah avatar Apr 06 '21 14:04 kasbah

@kasbah thanks for the explanation. This is a good addition to the features of this action. I want to do some testing then I'll merge and version bump.

Thanks!

TapTap21 avatar Apr 13 '21 06:04 TapTap21

If you look at the way the parameters are injected, you can conclude that the initial -f has already been supplied but is open to more parameters if you want to inject the other files with additional -f parameters, like so:

      with:
        stack_file_name: docker-compose.yaml -f docker-compose.release.yaml

You should also be able to achieve the desired behavior by setting these in a .env file in the root of your working directory:

COMPOSE_PROJECT_NAME=test
COMPOSE_FILE=docker-compose.yaml:docker-compose.release.yaml
COMPOSE_PATH_SEPARATOR=:

The path separator is : so that works by default on MacOS and Linux while the explicit set of the path separator should allow for support of loading the compose files like this in Windows, otherwise you'd need to change it to ; if you are running on Windows, which I typically just skip by adding the last line so I can commit this .env file with sensible development defaults, while deleting it and specifying secure (and vars) values into the Actions ENV for an actual release.


so to say you could specify the ENV override for docker compose in the ENV of the workflow

env:
  # Environment
  COMPOSE_PROJECT_NAME: ${{ inputs.project_name != '' && inputs.project_name || vars.COMPOSE_PROJECT_NAME }
  COMPOSE_FILE: docker-compose.yaml:docker-compose.release.yaml
  COMPOSE_PATH_SEPARATOR=:

and not have to change anything at all with this workflow.

I haven't tested the ENV/.env pattern, preferring to go with what I found worked easiest with because passing -f should have priority over the ENV, IIRC.

If .env it is not compatible, it should be compatible allow no docker compose file flag so that this will work.

acrois avatar Jun 11 '23 21:06 acrois