Mage runs properly using docker run -dit, but exits using docker stack deploy -c

I’ve been porting a web service to docker recently. As mentioned in the title, I’m encountering a weird scenario where in when I run it using docker run -dit, the service runs in the background, but when I use a docker-compose.yml, the service exits.

To be clearer, I have this entrypoint in my Dockerfile:

ENTRYPOINT ["/data/start-service.sh"]

this is the code of start-service.sh:

#!/bin/bash
/usr/local/bin/uwsgi --emperor=/data/vassals/ --daemonize=/var/log/uwsgi/emperor.log
/etc/init.d/nginx start
exec "$@";

as you can see, I’m just starting uwsgi and nginx here in this shell script. The last line (exec) is just make the script accept a parameter and keep it running. Then I run this using:

docker run -dit -p 8080:8080 --name=web_server webserver /bin/bash

As mentioned, the service runs OK and I can access the webservice.

Now, I tried to deploy this using a docker-compose.yml, but the service keeps on exiting/shutting down. I attempted to retrieve the logs, but I have no success. All I can see from doing docker ps -a is it runs for a second or 2 (or 3), and then exits.

Here’s my docker-compose.yml:

version: "3"
services:
web_server:
  image: webserver
  entrypoint:
    - /data/start-service.sh
    - /bin/bash
  ports:
    - "8089:8080"
  deploy:
    resources:
      limits:
        cpus: "0.1"
        memory: 2048M
      restart_policy:
        condition: on-failure
  networks:
    - webnet

networks:
 - webnet

The entrypoint entry in the yml file is just to make sure that start-service.sh script will be ran with /bin/bash as its parameter, to keep the service running. But again, the service shuts down.

Since you have already mentioned ENTRYPOINT in Dockerfile, there is no need to mention ENTRYPOINT in docker compose unless you want to override it which does not seem to be your case. I wonder if the problem is because you have mentioned multiple entry points in docker compose. The first thing to try would be removing the entrypoint section in Docker compose.

@smakam - thanks for your reply. I posted this in stackoverflow and a suggestion to add a tty: true to the service definition solved the issue. Here’s the stack overflow link : image runs properly using docker run -dit, but exits using docker stack deploy -c

thanks again for your reply. greatly appreciate it