Mark Estrada
Mark Estrada

Reputation: 9201

Docker-compose --exit-code-from is ignored

Supposed I have multiple containers deployed

The init container runs into completion and then shutdowns by itself. That is his job, which is to do some pre-configuration stuffs then exit.

When running locally, I dont have any issues running this in my desktop work environment.

My issue is when it is deployed in my CI pipeline. When my init container finished up...it shutdowns the whole docker-compose network. Even if I explicitly set the --exit-code-from into my test container.

docker-compose up --exit-code-from test

The end result is that I am not able to run my test cases to its completion because everything is being shutdown by the init container that exits. Anybody has hints what can I do?

Upvotes: 4

Views: 5783

Answers (2)

Michał Gacka
Michał Gacka

Reputation: 3091

I ran into the same issue when trying to run Cypress together with MongoDB seeding container and a replica set starter container. The 2 mongo-related containers would exit quickly after doing their job, thus triggering the unintuitive --abort-on-container-exit implied by --exit-code-from cypress.

For me the simplest solution was to use the tail -f /dev/null hack. The idea is that if you run this command after whatever the containers that you don't want to exit are finished with their actual jobs, they will hang until another container triggers the --abort-on-container-exit and pulls with it the entire docker-compose setup down.

Note that this is not a univsal answer: the downside of this approach is that you have to find out what the original CMD is in containers that you don't have control over.

For example, let's take the mongo-seeding project and their Dockerfile. In order to keep the container alive after doing its job, I'd like to make my own Dockerfile in which I'll pull that image and define a custom ENTRYPOINT that will first run the CMD from the original definition of the mongo-seeding image and then run tail -f /dev/null to keep the container alive. In their Dockerfile I can see that the CMD is simply seed and I can assume it won't change in the future (good design) so my ENTRYPOINT script entry.sh can just look like this:

#!/bin/sh
seed
tail -f /dev/null

And my Dockerfile:

FROM pkosiec/mongo-seeding:3.6.0

ENTRYPOINT [ "/app/scripts/entry.sh" ]

Plus the relevant service in docker-compose with volumes mount for completeness:

  mongo-seed:
    build:
      context: ./mongoSeed
    volumes:
      - ./mongoSeed/data:/app/data
      - ./mongoSeed/scripts:/app/scripts
    working_dir: /app/data
    depends_on:
      - mongodb

Which makes the container do its job and then hang until Cypress exits and causes the entire docker-compose setup to stop.

Upvotes: 0

Timir
Timir

Reputation: 1425

This is interesting. Is it possible to include the compose file? Maybe you have a depends_on defined, and the version of docker used by your CI pipeline handles it differently from the one on your dev environment.

At any rate, you'd want to stop using --exit-code-from, it apparently implies --abort-on-container-exit.

From https://docs.docker.com/compose/reference/up/:

--abort-on-container-exit  Stops all containers if any container was
                           stopped. Incompatible with -d.
--exit-code-from SERVICE   Return the exit code of the selected service
                           container. Implies --abort-on-container-exit.

Upvotes: 2

Related Questions