skip to Main Content

I have two containers a Flask and a Celery container. Both containers use similar configs except the CMD. How can I change the CMD to change based on an env variable?

if [ $CONTAINER = 'flask' ] ; then 
CMD ["uwsgi", "--ini", "uwsgi.ini"] ; else 
CMD ["celery", "--app=flask_project.celery_app.celery", "worker"]; 
fi

2

Answers


  1. Instead of having two separate CMDs, have one CMD that can run either thing.

    In shell syntax, this might look like:

    if [ "$CONTAINER" = flask ]; then
      exec wsgi --init uwsgi.ini "$@"
    else
      exec celery --app=flask_project.celery_app.celery worker "$@"
    fi
    

    …in a Dockerfile, this might look like:

    CMD [ "/bin/sh", "-c", "if [ "$CONTAINER" = flask ]; then exec uwsgi --ini uwsgi.ini "$@"; else exec celery --app=flask_project.celery_app.celery worker "$@"; fi" ]
    

    The exec forces the copy of /bin/sh to replace itself in-place with wsgi or celery, so it doesn’t exist in the process tree except for the short period it needs to make a decision.

    Login or Signup to reply.
  2. Instead of having two separate CMDs, have the CMD do the most common thing, and override the CMD if you need to do the other thing.

    For example, you might say that the "most common" thing your container will do is to launch the Flask server

    CMD ["uwsgi", "--ini", "uwsgi.ini"]
    

    and if you just run the container it will do that

    docker run -d --name web --net my-net -p 5000:5000 my-image
    

    but you can also provide an alternate command after the docker run image name, and this will replace the Dockerfile CMD.

    docker run -d --name celery --net my-net my-image 
      celery --app=flask_project.celery_app.celery worker
    

    If you’re in a Docker Compose setup, you can use the command: setting to specify this override, like

    version: '3.8'
    services:
      redis:
        image: redis
      web:
        build: .
        ports: ['5000:5000']
        depends_on: [redis]
      celery:
        build: .
        command: celery --app=flask_project.celery_app.celery worker
        depends_on: [redis]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search